@recursyve/nice-ui-kit.v2 13.2.0-beta.117 → 13.2.0-beta.119

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.
@@ -10,32 +10,35 @@ import { NiceScrollbarDirective } from "../../../directives/scrollbar";
10
10
  import { NiceUtilsService } from "../../../providers/utils";
11
11
  import { NiceNavigationComponent } from "../navigation.component";
12
12
  import { NiceNavigationService } from "../navigation.service";
13
+ import { NiceNavigationHintService } from "../providers/hint.service";
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "../navigation.service";
15
16
  import * as i2 from "../../../providers/utils";
16
17
  import * as i3 from "@angular/animations";
17
18
  import * as i4 from "@angular/router";
18
19
  import * as i5 from "@angular/cdk/overlay";
19
- import * as i6 from "./components/aside/aside.component";
20
- import * as i7 from "./components/basic/basic.component";
21
- import * as i8 from "./components/collapsable/collapsable.component";
22
- import * as i9 from "./components/divider/divider.component";
23
- import * as i10 from "./components/group/group.component";
24
- import * as i11 from "./components/spacer/spacer.component";
25
- import * as i12 from "../../../directives/scrollbar/scrollbar.directive";
26
- import * as i13 from "@angular/common";
27
- import * as i14 from "../pipes/should-hide.pipe";
20
+ import * as i6 from "../providers/hint.service";
21
+ import * as i7 from "./components/aside/aside.component";
22
+ import * as i8 from "./components/basic/basic.component";
23
+ import * as i9 from "./components/collapsable/collapsable.component";
24
+ import * as i10 from "./components/divider/divider.component";
25
+ import * as i11 from "./components/group/group.component";
26
+ import * as i12 from "./components/spacer/spacer.component";
27
+ import * as i13 from "../../../directives/scrollbar/scrollbar.directive";
28
+ import * as i14 from "@angular/common";
29
+ import * as i15 from "../pipes/should-hide.pipe";
28
30
  export class NiceVerticalNavigationComponent extends NiceNavigationComponent {
29
31
  /**
30
32
  * Constructor
31
33
  */
32
- constructor(_changeDetectorRef, _niceNavigationService, _niceUtilsService, _animationBuilder, _elementRef, _renderer2, _router, _scrollStrategyOptions) {
34
+ constructor(_changeDetectorRef, _niceNavigationService, _niceUtilsService, _animationBuilder, _elementRef, _renderer2, _router, _scrollStrategyOptions, _hintService) {
33
35
  super(_changeDetectorRef, _niceNavigationService, _niceUtilsService);
34
36
  this._animationBuilder = _animationBuilder;
35
37
  this._elementRef = _elementRef;
36
38
  this._renderer2 = _renderer2;
37
39
  this._router = _router;
38
40
  this._scrollStrategyOptions = _scrollStrategyOptions;
41
+ this._hintService = _hintService;
39
42
  this._animationsEnabled = false;
40
43
  this._scrollStrategy = this._scrollStrategyOptions.block();
41
44
  this.name = this._niceUtilsService.randomId();
@@ -45,11 +48,13 @@ export class NiceVerticalNavigationComponent extends NiceNavigationComponent {
45
48
  this.mode = "side";
46
49
  this.opened = true;
47
50
  this.hovered = false;
51
+ this.hasHint = false;
48
52
  this.position = "left";
49
53
  this.transparentOverlay = false;
50
54
  this.appearanceChanged = new EventEmitter();
51
55
  this.modeChanged = new EventEmitter();
52
56
  this.openedChanged = new EventEmitter();
57
+ this.hoveredChanged = new EventEmitter();
53
58
  this.positionChanged = new EventEmitter();
54
59
  this.activeAsideItemId = null;
55
60
  this.onCollapsableItemCollapsed = new ReplaySubject(1);
@@ -84,7 +89,8 @@ export class NiceVerticalNavigationComponent extends NiceNavigationComponent {
84
89
  "nice-vertical-navigation-mode-side": this.mode === "side",
85
90
  "nice-vertical-navigation-opened": this.opened,
86
91
  "nice-vertical-navigation-position-left": this.position === "left",
87
- "nice-vertical-navigation-position-right": this.position === "right"
92
+ "nice-vertical-navigation-position-right": this.position === "right",
93
+ "nice-vertical-navigation-has-hint": this.hasHint
88
94
  };
89
95
  }
90
96
  /**
@@ -213,6 +219,10 @@ export class NiceVerticalNavigationComponent extends NiceNavigationComponent {
213
219
  this.closeAside();
214
220
  }
215
221
  });
222
+ this._hintService.hasActiveHint$.pipe(takeUntil(this._unsubscribeAll)).subscribe(hasHint => {
223
+ this.hasHint = hasHint;
224
+ this.hoveredChanged.next(this.hovered || this.hasHint);
225
+ });
216
226
  }
217
227
  /**
218
228
  * After view init
@@ -477,6 +487,7 @@ export class NiceVerticalNavigationComponent extends NiceNavigationComponent {
477
487
  this._enableAnimations();
478
488
  // Set the hovered
479
489
  this.hovered = true;
490
+ this.hoveredChanged.next(this.hovered);
480
491
  }
481
492
  /**
482
493
  * On mouseleave
@@ -486,6 +497,7 @@ export class NiceVerticalNavigationComponent extends NiceNavigationComponent {
486
497
  this._enableAnimations();
487
498
  // Set the hovered
488
499
  this.hovered = false;
500
+ this.hoveredChanged.next(this.hovered || this.hasHint);
489
501
  }
490
502
  /**
491
503
  * Open/close the navigation
@@ -512,12 +524,12 @@ export class NiceVerticalNavigationComponent extends NiceNavigationComponent {
512
524
  this.openedChanged.next(open);
513
525
  }
514
526
  }
515
- NiceVerticalNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceVerticalNavigationComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NiceNavigationService }, { token: i2.NiceUtilsService }, { token: i3.AnimationBuilder }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i4.Router }, { token: i5.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component });
516
- NiceVerticalNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: NiceVerticalNavigationComponent, selector: "nice-vertical-navigation", inputs: { name: "name", appearance: "appearance", autoCollapse: "autoCollapse", inner: "inner", mode: "mode", opened: "opened", hovered: "hovered", position: "position", transparentOverlay: "transparentOverlay", navigation: "navigation" }, outputs: { appearanceChanged: "appearanceChanged", modeChanged: "modeChanged", openedChanged: "openedChanged", positionChanged: "positionChanged" }, host: { listeners: { "mouseenter": "_onMouseenter()", "mouseleave": "_onMouseleave()" }, properties: { "class": "this.classList", "style": "this.styleList" } }, viewQueries: [{ propertyName: "_navigationContentEl", first: true, predicate: ["navigationContent"], descendants: true }, { propertyName: "niceScrollbarDirectives", predicate: NiceScrollbarDirective, descendants: true }], exportAs: ["niceVerticalNavigation"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"nice-vertical-navigation-wrapper\">\n <!-- Header -->\n <div class=\"nice-vertical-navigation-header\">\n <ng-content select=\"[niceVerticalNavigationHeader]\"></ng-content>\n </div>\n\n <!-- Content -->\n <div\n class=\"nice-vertical-navigation-content\"\n niceScrollbar\n [niceScrollbarOptions]=\"{ wheelPropagation: inner, suppressScrollX: true }\"\n #navigationContent\n >\n <!-- Content header -->\n <div class=\"nice-vertical-navigation-content-header\">\n <ng-content select=\"[niceVerticalNavigationContentHeader]\"></ng-content>\n </div>\n\n <!-- Items -->\n <div *ngFor=\"let item of navigation; trackBy: trackByFn\" [@.disabled]=\"!animateNextNavChange\" @slideInRight>\n <!-- Skip the hidden items -->\n <ng-container *ngIf=\"!(item | niceShouldHide | async)\">\n <!-- Aside -->\n <nice-vertical-navigation-aside-item\n *ngIf=\"item.type === 'aside'\"\n [item]=\"item\"\n [name]=\"name\"\n [activeItemId]=\"activeAsideItemId\"\n [autoCollapse]=\"autoCollapse\"\n [skipChildren]=\"true\"\n (click)=\"toggleAside(item)\"\n ></nice-vertical-navigation-aside-item>\n\n <!-- Basic -->\n <nice-vertical-navigation-basic-item\n *ngIf=\"item.type === 'basic'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-basic-item>\n\n <!-- Collapsable -->\n <nice-vertical-navigation-collapsable-item\n *ngIf=\"item.type === 'collapsable'\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-collapsable-item>\n\n <!-- Divider -->\n <nice-vertical-navigation-divider-item\n *ngIf=\"item.type === 'divider'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-divider-item>\n\n <!-- Group -->\n <nice-vertical-navigation-group-item\n *ngIf=\"item.type === 'group'\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-group-item>\n\n <!-- Spacer -->\n <nice-vertical-navigation-spacer-item\n *ngIf=\"item.type === 'spacer'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-spacer-item>\n </ng-container>\n </div>\n\n <!-- Content footer -->\n <div class=\"nice-vertical-navigation-content-footer\">\n <ng-content select=\"[niceVerticalNavigationContentFooter]\"></ng-content>\n </div>\n\n </div>\n\n <!-- Footer -->\n <div class=\"nice-vertical-navigation-footer\">\n <ng-content select=\"[niceVerticalNavigationFooter]\"></ng-content>\n </div>\n</div>\n\n<!-- Aside -->\n<div\n class=\"nice-vertical-navigation-aside-wrapper\"\n *ngIf=\"activeAsideItemId\"\n niceScrollbar\n [niceScrollbarOptions]=\"{ wheelPropagation: false, suppressScrollX: true }\"\n [@fadeInLeft]=\"position === 'left'\"\n [@fadeInRight]=\"position === 'right'\"\n [@fadeOutLeft]=\"position === 'left'\"\n [@fadeOutRight]=\"position === 'right'\"\n>\n\n <!-- Items -->\n <ng-container *ngFor=\"let item of navigation; trackBy: trackByFn\">\n <!-- Skip the hidden items -->\n <ng-container *ngIf=\"(item.hidden && !item.hidden(item)) || !item.hidden\">\n <!-- Aside -->\n <nice-vertical-navigation-aside-item\n *ngIf=\"item.type === 'aside' && item.id === activeAsideItemId\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-aside-item>\n </ng-container>\n </ng-container>\n</div>\n", components: [{ type: i6.NiceVerticalNavigationAsideItemComponent, selector: "nice-vertical-navigation-aside-item", inputs: ["activeItemId", "autoCollapse", "item", "name", "skipChildren"] }, { type: i7.NiceVerticalNavigationBasicItemComponent, selector: "nice-vertical-navigation-basic-item", inputs: ["item", "name"] }, { type: i8.NiceVerticalNavigationCollapsableItemComponent, selector: "nice-vertical-navigation-collapsable-item", inputs: ["autoCollapse", "item", "name"] }, { type: i9.NiceVerticalNavigationDividerItemComponent, selector: "nice-vertical-navigation-divider-item", inputs: ["item", "name"] }, { type: i10.NiceVerticalNavigationGroupItemComponent, selector: "nice-vertical-navigation-group-item", inputs: ["autoCollapse", "item", "name"] }, { type: i11.NiceVerticalNavigationSpacerItemComponent, selector: "nice-vertical-navigation-spacer-item", inputs: ["item", "name"] }], directives: [{ type: i12.NiceScrollbarDirective, selector: "[niceScrollbar]", inputs: ["niceScrollbar", "niceScrollbarOptions"], exportAs: ["niceScrollbar"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i13.AsyncPipe, "niceShouldHide": i14.NiceShouldHidePipe }, animations: niceAnimations, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
527
+ NiceVerticalNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceVerticalNavigationComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NiceNavigationService }, { token: i2.NiceUtilsService }, { token: i3.AnimationBuilder }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i4.Router }, { token: i5.ScrollStrategyOptions }, { token: i6.NiceNavigationHintService }], target: i0.ɵɵFactoryTarget.Component });
528
+ NiceVerticalNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: NiceVerticalNavigationComponent, selector: "nice-vertical-navigation", inputs: { name: "name", appearance: "appearance", autoCollapse: "autoCollapse", inner: "inner", mode: "mode", opened: "opened", hovered: "hovered", hasHint: "hasHint", position: "position", transparentOverlay: "transparentOverlay", navigation: "navigation" }, outputs: { appearanceChanged: "appearanceChanged", modeChanged: "modeChanged", openedChanged: "openedChanged", hoveredChanged: "hoveredChanged", positionChanged: "positionChanged" }, host: { listeners: { "mouseenter": "_onMouseenter()", "mouseleave": "_onMouseleave()" }, properties: { "class": "this.classList", "style": "this.styleList" } }, viewQueries: [{ propertyName: "_navigationContentEl", first: true, predicate: ["navigationContent"], descendants: true }, { propertyName: "niceScrollbarDirectives", predicate: NiceScrollbarDirective, descendants: true }], exportAs: ["niceVerticalNavigation"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"nice-vertical-navigation-wrapper\">\n <!-- Header -->\n <div class=\"nice-vertical-navigation-header\">\n <ng-content select=\"[niceVerticalNavigationHeader]\"></ng-content>\n </div>\n\n <!-- Content -->\n <div\n class=\"nice-vertical-navigation-content\"\n niceScrollbar\n [niceScrollbarOptions]=\"{ wheelPropagation: inner, suppressScrollX: true }\"\n #navigationContent\n >\n <!-- Content header -->\n <div class=\"nice-vertical-navigation-content-header\">\n <ng-content select=\"[niceVerticalNavigationContentHeader]\"></ng-content>\n </div>\n\n <!-- Items -->\n <div *ngFor=\"let item of navigation; trackBy: trackByFn\" [@.disabled]=\"!animateNextNavChange\" @slideInRight>\n <!-- Skip the hidden items -->\n <ng-container *ngIf=\"!(item | niceShouldHide | async)\">\n <!-- Aside -->\n <nice-vertical-navigation-aside-item\n *ngIf=\"item.type === 'aside'\"\n [item]=\"item\"\n [name]=\"name\"\n [activeItemId]=\"activeAsideItemId\"\n [autoCollapse]=\"autoCollapse\"\n [skipChildren]=\"true\"\n (click)=\"toggleAside(item)\"\n ></nice-vertical-navigation-aside-item>\n\n <!-- Basic -->\n <nice-vertical-navigation-basic-item\n *ngIf=\"item.type === 'basic'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-basic-item>\n\n <!-- Collapsable -->\n <nice-vertical-navigation-collapsable-item\n *ngIf=\"item.type === 'collapsable'\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-collapsable-item>\n\n <!-- Divider -->\n <nice-vertical-navigation-divider-item\n *ngIf=\"item.type === 'divider'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-divider-item>\n\n <!-- Group -->\n <nice-vertical-navigation-group-item\n *ngIf=\"item.type === 'group'\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-group-item>\n\n <!-- Spacer -->\n <nice-vertical-navigation-spacer-item\n *ngIf=\"item.type === 'spacer'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-spacer-item>\n </ng-container>\n </div>\n\n <!-- Content footer -->\n <div class=\"nice-vertical-navigation-content-footer\">\n <ng-content select=\"[niceVerticalNavigationContentFooter]\"></ng-content>\n </div>\n\n </div>\n\n <!-- Footer -->\n <div class=\"nice-vertical-navigation-footer\">\n <ng-content select=\"[niceVerticalNavigationFooter]\"></ng-content>\n </div>\n</div>\n\n<!-- Aside -->\n<div\n class=\"nice-vertical-navigation-aside-wrapper\"\n *ngIf=\"activeAsideItemId\"\n niceScrollbar\n [niceScrollbarOptions]=\"{ wheelPropagation: false, suppressScrollX: true }\"\n [@fadeInLeft]=\"position === 'left'\"\n [@fadeInRight]=\"position === 'right'\"\n [@fadeOutLeft]=\"position === 'left'\"\n [@fadeOutRight]=\"position === 'right'\"\n>\n\n <!-- Items -->\n <ng-container *ngFor=\"let item of navigation; trackBy: trackByFn\">\n <!-- Skip the hidden items -->\n <ng-container *ngIf=\"(item.hidden && !item.hidden(item)) || !item.hidden\">\n <!-- Aside -->\n <nice-vertical-navigation-aside-item\n *ngIf=\"item.type === 'aside' && item.id === activeAsideItemId\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-aside-item>\n </ng-container>\n </ng-container>\n</div>\n", components: [{ type: i7.NiceVerticalNavigationAsideItemComponent, selector: "nice-vertical-navigation-aside-item", inputs: ["activeItemId", "autoCollapse", "item", "name", "skipChildren"] }, { type: i8.NiceVerticalNavigationBasicItemComponent, selector: "nice-vertical-navigation-basic-item", inputs: ["item", "name"] }, { type: i9.NiceVerticalNavigationCollapsableItemComponent, selector: "nice-vertical-navigation-collapsable-item", inputs: ["autoCollapse", "item", "name"] }, { type: i10.NiceVerticalNavigationDividerItemComponent, selector: "nice-vertical-navigation-divider-item", inputs: ["item", "name"] }, { type: i11.NiceVerticalNavigationGroupItemComponent, selector: "nice-vertical-navigation-group-item", inputs: ["autoCollapse", "item", "name"] }, { type: i12.NiceVerticalNavigationSpacerItemComponent, selector: "nice-vertical-navigation-spacer-item", inputs: ["item", "name"] }], directives: [{ type: i13.NiceScrollbarDirective, selector: "[niceScrollbar]", inputs: ["niceScrollbar", "niceScrollbarOptions"], exportAs: ["niceScrollbar"] }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i14.AsyncPipe, "niceShouldHide": i15.NiceShouldHidePipe }, animations: niceAnimations, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
517
529
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceVerticalNavigationComponent, decorators: [{
518
530
  type: Component,
519
531
  args: [{ selector: "nice-vertical-navigation", animations: niceAnimations, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: "niceVerticalNavigation", template: "<div class=\"nice-vertical-navigation-wrapper\">\n <!-- Header -->\n <div class=\"nice-vertical-navigation-header\">\n <ng-content select=\"[niceVerticalNavigationHeader]\"></ng-content>\n </div>\n\n <!-- Content -->\n <div\n class=\"nice-vertical-navigation-content\"\n niceScrollbar\n [niceScrollbarOptions]=\"{ wheelPropagation: inner, suppressScrollX: true }\"\n #navigationContent\n >\n <!-- Content header -->\n <div class=\"nice-vertical-navigation-content-header\">\n <ng-content select=\"[niceVerticalNavigationContentHeader]\"></ng-content>\n </div>\n\n <!-- Items -->\n <div *ngFor=\"let item of navigation; trackBy: trackByFn\" [@.disabled]=\"!animateNextNavChange\" @slideInRight>\n <!-- Skip the hidden items -->\n <ng-container *ngIf=\"!(item | niceShouldHide | async)\">\n <!-- Aside -->\n <nice-vertical-navigation-aside-item\n *ngIf=\"item.type === 'aside'\"\n [item]=\"item\"\n [name]=\"name\"\n [activeItemId]=\"activeAsideItemId\"\n [autoCollapse]=\"autoCollapse\"\n [skipChildren]=\"true\"\n (click)=\"toggleAside(item)\"\n ></nice-vertical-navigation-aside-item>\n\n <!-- Basic -->\n <nice-vertical-navigation-basic-item\n *ngIf=\"item.type === 'basic'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-basic-item>\n\n <!-- Collapsable -->\n <nice-vertical-navigation-collapsable-item\n *ngIf=\"item.type === 'collapsable'\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-collapsable-item>\n\n <!-- Divider -->\n <nice-vertical-navigation-divider-item\n *ngIf=\"item.type === 'divider'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-divider-item>\n\n <!-- Group -->\n <nice-vertical-navigation-group-item\n *ngIf=\"item.type === 'group'\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-group-item>\n\n <!-- Spacer -->\n <nice-vertical-navigation-spacer-item\n *ngIf=\"item.type === 'spacer'\"\n [item]=\"item\"\n [name]=\"name\"\n ></nice-vertical-navigation-spacer-item>\n </ng-container>\n </div>\n\n <!-- Content footer -->\n <div class=\"nice-vertical-navigation-content-footer\">\n <ng-content select=\"[niceVerticalNavigationContentFooter]\"></ng-content>\n </div>\n\n </div>\n\n <!-- Footer -->\n <div class=\"nice-vertical-navigation-footer\">\n <ng-content select=\"[niceVerticalNavigationFooter]\"></ng-content>\n </div>\n</div>\n\n<!-- Aside -->\n<div\n class=\"nice-vertical-navigation-aside-wrapper\"\n *ngIf=\"activeAsideItemId\"\n niceScrollbar\n [niceScrollbarOptions]=\"{ wheelPropagation: false, suppressScrollX: true }\"\n [@fadeInLeft]=\"position === 'left'\"\n [@fadeInRight]=\"position === 'right'\"\n [@fadeOutLeft]=\"position === 'left'\"\n [@fadeOutRight]=\"position === 'right'\"\n>\n\n <!-- Items -->\n <ng-container *ngFor=\"let item of navigation; trackBy: trackByFn\">\n <!-- Skip the hidden items -->\n <ng-container *ngIf=\"(item.hidden && !item.hidden(item)) || !item.hidden\">\n <!-- Aside -->\n <nice-vertical-navigation-aside-item\n *ngIf=\"item.type === 'aside' && item.id === activeAsideItemId\"\n [item]=\"item\"\n [name]=\"name\"\n [autoCollapse]=\"autoCollapse\"\n ></nice-vertical-navigation-aside-item>\n </ng-container>\n </ng-container>\n</div>\n" }]
520
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NiceNavigationService }, { type: i2.NiceUtilsService }, { type: i3.AnimationBuilder }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i4.Router }, { type: i5.ScrollStrategyOptions }]; }, propDecorators: { name: [{
532
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NiceNavigationService }, { type: i2.NiceUtilsService }, { type: i3.AnimationBuilder }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i4.Router }, { type: i5.ScrollStrategyOptions }, { type: i6.NiceNavigationHintService }]; }, propDecorators: { name: [{
521
533
  type: Input
522
534
  }], appearance: [{
523
535
  type: Input
@@ -531,6 +543,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
531
543
  type: Input
532
544
  }], hovered: [{
533
545
  type: Input
546
+ }], hasHint: [{
547
+ type: Input
534
548
  }], position: [{
535
549
  type: Input
536
550
  }], transparentOverlay: [{
@@ -541,6 +555,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
541
555
  type: Output
542
556
  }], openedChanged: [{
543
557
  type: Output
558
+ }], hoveredChanged: [{
559
+ type: Output
544
560
  }], positionChanged: [{
545
561
  type: Output
546
562
  }], _navigationContentEl: [{
@@ -564,4 +580,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
564
580
  type: HostListener,
565
581
  args: ["mouseleave"]
566
582
  }] } });
567
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVydGljYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmljZS11aS1raXQtdjIvc3JjL2xpYi9jb21wb25lbnRzL25hdmlnYXRpb24vdmVydGljYWwvdmVydGljYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmljZS11aS1raXQtdjIvc3JjL2xpYi9jb21wb25lbnRzL25hdmlnYXRpb24vdmVydGljYWwvdmVydGljYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBbUIsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEYsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBa0IscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStC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SUErR0EsdXpDRHRFZ0IsY0FBYzsyRkFLakIsK0JBQStCO2tCQVIzQyxTQUFTOytCQUNJLDBCQUEwQixjQUV4QixjQUFjLGlCQUNYLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sWUFDckMsd0JBQXdCO29UQXFCM0IsSUFBSTtzQkFEVixLQUFLO2dCQUlDLFVBQVU7c0JBRGhCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxPQUFPO3NCQURiLEtBQUs7Z0JBSUMsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJVSxpQkFBaUI7c0JBRGhDLE1BQU07Z0JBSVMsV0FBVztzQkFEMUIsTUFBTTtnQkFJUyxhQUFhO3NCQUQ1QixNQUFNO2dCQUlTLGVBQWU7c0JBRDlCLE1BQU07Z0JBSUMsb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLG1CQUFtQjtnQkFJbkIsVUFBVTtzQkFEcEIsS0FBSztnQkE0Q0ssU0FBUztzQkFEbkIsV0FBVzt1QkFBQyxPQUFPO2dCQW1CVCxTQUFTO3NCQURuQixXQUFXO3VCQUFDLE9BQU87Z0JBV1QsdUJBQXVCO3NCQURqQyxZQUFZO3VCQUFDLHNCQUFzQjtnQkE4YzdCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsWUFBWTtnQkFhbkIsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgQW5pbWF0aW9uQnVpbGRlciwgQW5pbWF0aW9uUGxheWVyLCBzdHlsZSB9IGZyb20gXCJAYW5ndWxhci9hbmltYXRpb25zXCI7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcbmltcG9ydCB7IFNjcm9sbFN0cmF0ZWd5LCBTY3JvbGxTdHJhdGVneU9wdGlvbnMgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBtZXJnZSwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgbmljZUFuaW1hdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vYW5pbWF0aW9uc1wiO1xuaW1wb3J0IHsgTmljZVNjcm9sbGJhckRpcmVjdGl2ZSB9IGZyb20gXCIuLi8uLi8uLi9kaXJlY3RpdmVzL3Njcm9sbGJhclwiO1xuaW1wb3J0IHsgTmljZVV0aWxzU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9wcm92aWRlcnMvdXRpbHNcIjtcbmltcG9ydCB7IE5pY2VOYXZpZ2F0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL25hdmlnYXRpb24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBOaWNlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vbmF2aWdhdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIE5pY2VOYXZpZ2F0aW9uSXRlbSxcbiAgICBOaWNlVmVydGljYWxOYXZpZ2F0aW9uQXBwZWFyYW5jZSxcbiAgICBOaWNlVmVydGljYWxOYXZpZ2F0aW9uTW9kZSxcbiAgICBOaWNlVmVydGljYWxOYXZpZ2F0aW9uUG9zaXRpb25cbn0gZnJvbSBcIi4uL25hdmlnYXRpb24udHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi92ZXJ0aWNhbC5jb21wb25lbnQuaHRtbFwiLFxuICAgIGFuaW1hdGlvbnM6IG5pY2VBbmltYXRpb25zLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZXhwb3J0QXM6IFwibmljZVZlcnRpY2FsTmF2aWdhdGlvblwiXG59KVxuZXhwb3J0IGNsYXNzIE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25Db21wb25lbnQgZXh0ZW5kcyBOaWNlTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIHB1YmxpYyBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaW5uZXI6IEJvb2xlYW5JbnB1dDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIHB1YmxpYyBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfb3BlbmVkOiBCb29sZWFuSW5wdXQ7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICBwdWJsaWMgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3RyYW5zcGFyZW50T3ZlcmxheTogQm9vbGVhbklucHV0O1xuXG4gICAgcHJpdmF0ZSBfYW5pbWF0aW9uc0VuYWJsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9hc2lkZU92ZXJsYXk6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZUFzaWRlT3ZlcmxheUNsaWNrOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGFuZGxlT3ZlcmxheUNsaWNrOiBhbnk7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfcGxheWVyOiBBbmltYXRpb25QbGF5ZXI7XG4gICAgcHJpdmF0ZSBfc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5fc2Nyb2xsU3RyYXRlZ3lPcHRpb25zLmJsb2NrKCk7XG4gICAgcHJpdmF0ZSBfbmljZVNjcm9sbGJhckRpcmVjdGl2ZXMhOiBRdWVyeUxpc3Q8TmljZVNjcm9sbGJhckRpcmVjdGl2ZT47XG4gICAgcHJpdmF0ZSBfbmljZVNjcm9sbGJhckRpcmVjdGl2ZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IHRoaXMuX25pY2VVdGlsc1NlcnZpY2UucmFuZG9tSWQoKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFwcGVhcmFuY2U6IE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25BcHBlYXJhbmNlID0gXCJkZWZhdWx0XCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvQ29sbGFwc2UgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaW5uZXIgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vZGU6IE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25Nb2RlID0gXCJzaWRlXCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvcGVuZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaG92ZXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcG9zaXRpb246IE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25Qb3NpdGlvbiA9IFwibGVmdFwiO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHJhbnNwYXJlbnRPdmVybGF5ID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwZWFyYW5jZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25BcHBlYXJhbmNlPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IG1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxOaWNlVmVydGljYWxOYXZpZ2F0aW9uTW9kZT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBvcGVuZWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IHBvc2l0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TmljZVZlcnRpY2FsTmF2aWdhdGlvblBvc2l0aW9uPigpO1xuXG4gICAgQFZpZXdDaGlsZChcIm5hdmlnYXRpb25Db250ZW50XCIpXG4gICAgcHJpdmF0ZSBfbmF2aWdhdGlvbkNvbnRlbnRFbDogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBuYXZpZ2F0aW9uKG5hdmlnYXRpb246IE5pY2VOYXZpZ2F0aW9uSXRlbVtdKSB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb24gPSBuYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBuYXZpZ2F0aW9uKCk6IE5pY2VOYXZpZ2F0aW9uSXRlbVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2ZUFzaWRlSXRlbUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb25Db2xsYXBzYWJsZUl0ZW1Db2xsYXBzZWQgPSBuZXcgUmVwbGF5U3ViamVjdDxOaWNlTmF2aWdhdGlvbkl0ZW0+KDEpO1xuICAgIHB1YmxpYyBvbkNvbGxhcHNhYmxlSXRlbUV4cGFuZGVkID0gbmV3IFJlcGxheVN1YmplY3Q8TmljZU5hdmlnYXRpb25JdGVtPigxKTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIF9uaWNlTmF2aWdhdGlvblNlcnZpY2U6IE5pY2VOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgX25pY2VVdGlsc1NlcnZpY2U6IE5pY2VVdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2FuaW1hdGlvbkJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgX3JlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBfc2Nyb2xsU3RyYXRlZ3lPcHRpb25zOiBTY3JvbGxTdHJhdGVneU9wdGlvbnNcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2NoYW5nZURldGVjdG9yUmVmLCBfbmljZU5hdmlnYXRpb25TZXJ2aWNlLCBfbmljZVV0aWxzU2VydmljZSk7XG5cbiAgICAgICAgdGhpcy5faGFuZGxlQXNpZGVPdmVybGF5Q2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQXNpZGUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5faGFuZGxlT3ZlcmxheUNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQCBBY2Nlc3NvcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogSG9zdCBiaW5kaW5nIGZvciBjb21wb25lbnQgY2xhc3Nlc1xuICAgICAqL1xuICAgIEBIb3N0QmluZGluZyhcImNsYXNzXCIpXG4gICAgcHVibGljIGdldCBjbGFzc0xpc3QoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFuaW1hdGlvbnMtZW5hYmxlZFwiOiB0aGlzLl9hbmltYXRpb25zRW5hYmxlZCxcbiAgICAgICAgICAgIFtgbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFwcGVhcmFuY2UtJHt0aGlzLmFwcGVhcmFuY2V9YF06IHRydWUsXG4gICAgICAgICAgICBcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1ob3ZlclwiOiB0aGlzLmhvdmVyZWQsXG4gICAgICAgICAgICBcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1pbm5lclwiOiB0aGlzLmlubmVyLFxuICAgICAgICAgICAgXCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tbW9kZS1vdmVyXCI6IHRoaXMubW9kZSA9PT0gXCJvdmVyXCIsXG4gICAgICAgICAgICBcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1tb2RlLXNpZGVcIjogdGhpcy5tb2RlID09PSBcInNpZGVcIixcbiAgICAgICAgICAgIFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLW9wZW5lZFwiOiB0aGlzLm9wZW5lZCxcbiAgICAgICAgICAgIFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLXBvc2l0aW9uLWxlZnRcIjogdGhpcy5wb3NpdGlvbiA9PT0gXCJsZWZ0XCIsXG4gICAgICAgICAgICBcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1wb3NpdGlvbi1yaWdodFwiOiB0aGlzLnBvc2l0aW9uID09PSBcInJpZ2h0XCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIb3N0IGJpbmRpbmcgZm9yIGNvbXBvbmVudCBpbmxpbmUgc3R5bGVzXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKFwic3R5bGVcIilcbiAgICBwdWJsaWMgZ2V0IHN0eWxlTGlzdCgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IHRoaXMub3BlbmVkID8gXCJ2aXNpYmxlXCIgOiBcImhpZGRlblwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0dGVyIGZvciBuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlc1xuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oTmljZVNjcm9sbGJhckRpcmVjdGl2ZSlcbiAgICBwdWJsaWMgc2V0IG5pY2VTY3JvbGxiYXJEaXJlY3RpdmVzKG5pY2VTY3JvbGxiYXJEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8TmljZVNjcm9sbGJhckRpcmVjdGl2ZT4pIHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGRpcmVjdGl2ZXNcbiAgICAgICAgdGhpcy5fbmljZVNjcm9sbGJhckRpcmVjdGl2ZXMgPSBuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlcztcblxuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlcmUgYXJlIG5vIGRpcmVjdGl2ZXNcbiAgICAgICAgaWYgKG5pY2VTY3JvbGxiYXJEaXJlY3RpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5zdWJzY3JpYmUgdGhlIHByZXZpb3VzIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgaWYgKHRoaXMuX25pY2VTY3JvbGxiYXJEaXJlY3RpdmVzU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9uaWNlU2Nyb2xsYmFyRGlyZWN0aXZlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzY3JvbGxiYXJzIG9uIGNvbGxhcHNhYmxlIGl0ZW1zJyBjb2xsYXBzZS9leHBhbmRcbiAgICAgICAgdGhpcy5fbmljZVNjcm9sbGJhckRpcmVjdGl2ZXNTdWJzY3JpcHRpb24gPVxuICAgICAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbGxhcHNhYmxlSXRlbUNvbGxhcHNlZCxcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29sbGFwc2FibGVJdGVtRXhwYW5kZWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlQWxsKSxcbiAgICAgICAgICAgICAgICAgICAgZGVsYXkoMjUwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHNjcm9sbGJhcnMgYW5kIHVwZGF0ZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgIG5pY2VTY3JvbGxiYXJEaXJlY3RpdmVzLmZvckVhY2goKG5pY2VTY3JvbGxiYXJEaXJlY3RpdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5pY2VTY3JvbGxiYXJEaXJlY3RpdmUudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQCBMaWZlY3ljbGUgaG9va3NcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogT24gY2hhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5nZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcblxuICAgICAgICAvLyBBcHBlYXJhbmNlXG4gICAgICAgIGlmIChcImFwcGVhcmFuY2VcIiBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBvYnNlcnZhYmxlXG4gICAgICAgICAgICB0aGlzLmFwcGVhcmFuY2VDaGFuZ2VkLm5leHQoY2hhbmdlcy5hcHBlYXJhbmNlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbm5lclxuICAgICAgICBpZiAoXCJpbm5lclwiIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIC8vIENvZXJjZSB0aGUgdmFsdWUgdG8gYSBib29sZWFuXG4gICAgICAgICAgICB0aGlzLmlubmVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KGNoYW5nZXMuaW5uZXIuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vZGVcbiAgICAgICAgaWYgKFwibW9kZVwiIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgdmFsdWVzXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TW9kZSA9IGNoYW5nZXMubW9kZS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c01vZGUgPSBjaGFuZ2VzLm1vZGUucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZUFuaW1hdGlvbnMoKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIG1vZGUgY2hhbmdlczogJ292ZXIgLT4gc2lkZSdcbiAgICAgICAgICAgIGlmIChwcmV2aW91c01vZGUgPT09IFwib3ZlclwiICYmIGN1cnJlbnRNb2RlID09PSBcInNpZGVcIikge1xuICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIG92ZXJsYXlcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlT3ZlcmxheSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kZSBjaGFuZ2VzOiAnc2lkZSAtPiBvdmVyJ1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzTW9kZSA9PT0gXCJzaWRlXCIgJiYgY3VycmVudE1vZGUgPT09IFwib3ZlclwiKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGFzaWRlXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUFzaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmF2aWdhdGlvbiBpcyBvcGVuZWRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgb3ZlcmxheVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaG93T3ZlcmxheSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgb2JzZXJ2YWJsZVxuICAgICAgICAgICAgdGhpcy5tb2RlQ2hhbmdlZC5uZXh0KGN1cnJlbnRNb2RlKTtcblxuICAgICAgICAgICAgLy8gRW5hYmxlIHRoZSBhbmltYXRpb25zIGFmdGVyIGEgZGVsYXlcbiAgICAgICAgICAgIC8vIFRoZSBkZWxheSBtdXN0IGJlIGJpZ2dlciB0aGFuIHRoZSBjdXJyZW50IHRyYW5zaXRpb24tZHVyYXRpb25cbiAgICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSBub3RoaW5nIHdpbGwgYmUgYW5pbWF0ZWQgd2hpbGUgdGhlIG1vZGUgY2hhbmdpbmdcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZUFuaW1hdGlvbnMoKTtcbiAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcGVuZWRcbiAgICAgICAgaWYgKFwib3BlbmVkXCIgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgLy8gQ29lcmNlIHRoZSB2YWx1ZSB0byBhIGJvb2xlYW5cbiAgICAgICAgICAgIHRoaXMub3BlbmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KGNoYW5nZXMub3BlbmVkLmN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIE9wZW4vY2xvc2UgdGhlIG5hdmlnYXRpb25cbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZU9wZW5lZCh0aGlzLm9wZW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb3NpdGlvblxuICAgICAgICBpZiAoXCJwb3NpdGlvblwiIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG9ic2VydmFibGVcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25DaGFuZ2VkLm5leHQoY2hhbmdlcy5wb3NpdGlvbi5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhbnNwYXJlbnQgb3ZlcmxheVxuICAgICAgICBpZiAoXCJ0cmFuc3BhcmVudE92ZXJsYXlcIiBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICAvLyBDb2VyY2UgdGhlIHZhbHVlIHRvIGEgYm9vbGVhblxuICAgICAgICAgICAgdGhpcy50cmFuc3BhcmVudE92ZXJsYXkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoY2hhbmdlcy50cmFuc3BhcmVudE92ZXJsYXkuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGluaXRcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBuYW1lIGlucHV0IGlzIG5vdCBhbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKHRoaXMubmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5fbmljZVV0aWxzU2VydmljZS5yYW5kb21JZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRoZSAnTmF2aWdhdGlvbkVuZCcgZXZlbnRcbiAgICAgICAgdGhpcy5fcm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlQWxsKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1vZGUgaXMgJ292ZXInIGFuZCB0aGUgbmF2aWdhdGlvbiBpcyBvcGVuZWQuLi5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcIm92ZXJcIiAmJiB0aGlzLm9wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1vZGUgaXMgJ3NpZGUnIGFuZCB0aGUgYXNpZGUgaXMgYWN0aXZlLi4uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJzaWRlXCIgJiYgdGhpcy5hY3RpdmVBc2lkZUl0ZW1JZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgYXNpZGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUFzaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgdmlldyBpbml0XG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFJldHVybiBpZiAnbmF2aWdhdGlvbiBjb250ZW50JyBlbGVtZW50IGRvZXMgbm90IGV4aXN0XG4gICAgICAgICAgICBpZiAoIXRoaXMuX25hdmlnYXRpb25Db250ZW50RWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmICduYXZpZ2F0aW9uIGNvbnRlbnQnIGVsZW1lbnQgZG9lc24ndCBoYXZlXG4gICAgICAgICAgICAvLyBwZXJmZWN0IHNjcm9sbGJhciBhY3RpdmF0ZWQgb24gaXQuLi5cbiAgICAgICAgICAgIGlmICghdGhpcy5fbmF2aWdhdGlvbkNvbnRlbnRFbC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInBzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgYWN0aXZlIGl0ZW1cbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJdGVtID0gdGhpcy5fbmF2aWdhdGlvbkNvbnRlbnRFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWl0ZW0tYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFjdGl2ZSBpdGVtIGV4aXN0cywgc2Nyb2xsIGl0IGludG8gdmlld1xuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUl0ZW0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBzY3JvbGxiYXIgZGlyZWN0aXZlc1xuICAgICAgICAgICAgICAgIHRoaXMuX25pY2VTY3JvbGxiYXJEaXJlY3RpdmVzLmZvckVhY2goKG5pY2VTY3JvbGxiYXJEaXJlY3RpdmUpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIG5vdCBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmljZVNjcm9sbGJhckRpcmVjdGl2ZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBhY3RpdmUgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlLnNjcm9sbFRvRWxlbWVudChcIi5uaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24taXRlbS1hY3RpdmVcIiwgLTEyMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQCBQdWJsaWMgbWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBPcGVuIHRoZSBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIC8vIFJldHVybiBpZiB0aGUgbmF2aWdhdGlvbiBpcyBhbHJlYWR5IG9wZW5cbiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIG9wZW5lZFxuICAgICAgICB0aGlzLl90b2dnbGVPcGVuZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIC8vIFJldHVybiBpZiB0aGUgbmF2aWdhdGlvbiBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICBpZiAoIXRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbG9zZSB0aGUgYXNpZGVcbiAgICAgICAgdGhpcy5jbG9zZUFzaWRlKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBvcGVuZWRcbiAgICAgICAgdGhpcy5fdG9nZ2xlT3BlbmVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgdGhlIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICAvLyBUb2dnbGVcbiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gdGhlIGFzaWRlXG4gICAgICovXG4gICAgcHVibGljIG9wZW5Bc2lkZShpdGVtOiBOaWNlTmF2aWdhdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBpdGVtIGlzIGRpc2FibGVkXG4gICAgICAgIGlmIChpdGVtLmRpc2FibGVkIHx8ICFpdGVtLmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcGVuXG4gICAgICAgIHRoaXMuYWN0aXZlQXNpZGVJdGVtSWQgPSBpdGVtLmlkO1xuXG4gICAgICAgIC8vIFNob3cgdGhlIGFzaWRlIG92ZXJsYXlcbiAgICAgICAgdGhpcy5fc2hvd0FzaWRlT3ZlcmxheSgpO1xuXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBhc2lkZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZUFzaWRlKCk6IHZvaWQge1xuICAgICAgICAvLyBDbG9zZVxuICAgICAgICB0aGlzLmFjdGl2ZUFzaWRlSXRlbUlkID0gbnVsbDtcblxuICAgICAgICAvLyBIaWRlIHRoZSBhc2lkZSBvdmVybGF5XG4gICAgICAgIHRoaXMuX2hpZGVBc2lkZU92ZXJsYXkoKTtcblxuICAgICAgICAvLyBNYXJrIGZvciBjaGVja1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgdGhlIGFzaWRlXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUFzaWRlKGl0ZW06IE5pY2VOYXZpZ2F0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICAvLyBUb2dnbGVcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlQXNpZGVJdGVtSWQgPT09IGl0ZW0uaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBc2lkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuQXNpZGUoaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEAgUHJpdmF0ZSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9lbmFibGVBbmltYXRpb25zKCk6IHZvaWQge1xuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIGFuaW1hdGlvbnMgYXJlIGFscmVhZHkgZW5hYmxlZFxuICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAgICB0aGlzLl9hbmltYXRpb25zRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kaXNhYmxlQW5pbWF0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBhbmltYXRpb25zIGFyZSBhbHJlYWR5IGRpc2FibGVkXG4gICAgICAgIGlmICghdGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgdGhlIGFuaW1hdGlvbnNcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBvdmVybGF5XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Nob3dPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBvdmVybGF5XG4gICAgICAgIGlmICh0aGlzLl9hc2lkZU92ZXJsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICAgIHRoaXMuX292ZXJsYXkgPSB0aGlzLl9yZW5kZXJlcjIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICAvLyBBZGQgYSBjbGFzcyB0byB0aGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICAgIHRoaXMuX292ZXJsYXkuY2xhc3NMaXN0LmFkZChcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1vdmVybGF5XCIpO1xuXG4gICAgICAgIC8vIEFkZCBhIGNsYXNzIGRlcGVuZGluZyBvbiB0aGUgdHJhbnNwYXJlbnRPdmVybGF5IG9wdGlvblxuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudE92ZXJsYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXkuY2xhc3NMaXN0LmFkZChcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1vdmVybGF5LXRyYW5zcGFyZW50XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSBvdmVybGF5IHRvIHRoZSBwYXJlbnQgb2YgdGhlIG5hdmlnYXRpb25cbiAgICAgICAgdGhpcy5fcmVuZGVyZXIyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LCB0aGlzLl9vdmVybGF5KTtcblxuICAgICAgICAvLyBFbmFibGUgYmxvY2sgc2Nyb2xsIHN0cmF0ZWd5XG4gICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmVuYWJsZSgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgZW50ZXIgYW5pbWF0aW9uIGFuZCBhdHRhY2ggaXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLl9wbGF5ZXIgPSB0aGlzLl9hbmltYXRpb25CdWlsZGVyLmJ1aWxkKFtcbiAgICAgICAgICAgIGFuaW1hdGUoXCIzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKVwiLCBzdHlsZSh7b3BhY2l0eTogMX0pKVxuICAgICAgICBdKS5jcmVhdGUodGhpcy5fb3ZlcmxheSk7XG5cbiAgICAgICAgLy8gUGxheSB0aGUgYW5pbWF0aW9uXG4gICAgICAgIHRoaXMuX3BsYXllci5wbGF5KCk7XG5cbiAgICAgICAgLy8gQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBvdmVybGF5XG4gICAgICAgIHRoaXMuX292ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZU92ZXJsYXlDbGljayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZSB0aGUgb3ZlcmxheVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9oaWRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxlYXZlIGFuaW1hdGlvbiBhbmQgYXR0YWNoIGl0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgdGhpcy5fcGxheWVyID0gdGhpcy5fYW5pbWF0aW9uQnVpbGRlci5idWlsZChbXG4gICAgICAgICAgICBhbmltYXRlKFwiMzAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSlcIiwgc3R5bGUoe29wYWNpdHk6IDB9KSlcbiAgICAgICAgXSkuY3JlYXRlKHRoaXMuX292ZXJsYXkpO1xuXG4gICAgICAgIC8vIFBsYXkgdGhlIGFuaW1hdGlvblxuICAgICAgICB0aGlzLl9wbGF5ZXIucGxheSgpO1xuXG4gICAgICAgIC8vIE9uY2UgdGhlIGFuaW1hdGlvbiBpcyBkb25lLi4uXG4gICAgICAgIHRoaXMuX3BsYXllci5vbkRvbmUoKCkgPT4ge1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgb3ZlcmxheSBzdGlsbCBleGlzdHMuLi5cbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZU92ZXJsYXlDbGljayk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG92ZXJsYXlcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fb3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYmxvY2sgc2Nyb2xsIHN0cmF0ZWd5XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5kaXNhYmxlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIGFzaWRlIG92ZXJsYXlcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2hvd0FzaWRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3ZlcmxheVxuICAgICAgICBpZiAodGhpcy5fYXNpZGVPdmVybGF5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGFzaWRlIG92ZXJsYXkgZWxlbWVudFxuICAgICAgICB0aGlzLl9hc2lkZU92ZXJsYXkgPSB0aGlzLl9yZW5kZXJlcjIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICAvLyBBZGQgYSBjbGFzcyB0byB0aGUgYXNpZGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICAgIHRoaXMuX2FzaWRlT3ZlcmxheS5jbGFzc0xpc3QuYWRkKFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLW92ZXJsYXlcIik7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSBhc2lkZSBvdmVybGF5IHRvIHRoZSBwYXJlbnQgb2YgdGhlIG5hdmlnYXRpb25cbiAgICAgICAgdGhpcy5fcmVuZGVyZXIyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LCB0aGlzLl9hc2lkZU92ZXJsYXkpO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgZW50ZXIgYW5pbWF0aW9uIGFuZCBhdHRhY2ggaXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLl9wbGF5ZXIgPVxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uQnVpbGRlclxuICAgICAgICAgICAgICAgIC5idWlsZChbXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGUoXCIzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKVwiLCBzdHlsZSh7b3BhY2l0eTogMX0pKVxuICAgICAgICAgICAgICAgIF0pLmNyZWF0ZSh0aGlzLl9hc2lkZU92ZXJsYXkpO1xuXG4gICAgICAgIC8vIFBsYXkgdGhlIGFuaW1hdGlvblxuICAgICAgICB0aGlzLl9wbGF5ZXIucGxheSgpO1xuXG4gICAgICAgIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgYXNpZGUgb3ZlcmxheVxuICAgICAgICB0aGlzLl9hc2lkZU92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZUFzaWRlT3ZlcmxheUNsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBhc2lkZSBvdmVybGF5XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2hpZGVBc2lkZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fYXNpZGVPdmVybGF5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxlYXZlIGFuaW1hdGlvbiBhbmQgYXR0YWNoIGl0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgdGhpcy5fcGxheWVyID1cbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkJ1aWxkZXJcbiAgICAgICAgICAgICAgICAuYnVpbGQoW1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRlKFwiMzAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSlcIiwgc3R5bGUoe29wYWNpdHk6IDB9KSlcbiAgICAgICAgICAgICAgICBdKS5jcmVhdGUodGhpcy5fYXNpZGVPdmVybGF5KTtcblxuICAgICAgICAvLyBQbGF5IHRoZSBhbmltYXRpb25cbiAgICAgICAgdGhpcy5fcGxheWVyLnBsYXkoKTtcblxuICAgICAgICAvLyBPbmNlIHRoZSBhbmltYXRpb24gaXMgZG9uZS4uLlxuICAgICAgICB0aGlzLl9wbGF5ZXIub25Eb25lKCgpID0+IHtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGFzaWRlIG92ZXJsYXkgc3RpbGwgZXhpc3RzLi4uXG4gICAgICAgICAgICBpZiAodGhpcy5fYXNpZGVPdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIHRoaXMuX2FzaWRlT3ZlcmxheS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlQXNpZGVPdmVybGF5Q2xpY2spO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhc2lkZSBvdmVybGF5XG4gICAgICAgICAgICAgICAgdGhpcy5fYXNpZGVPdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fYXNpZGVPdmVybGF5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9hc2lkZU92ZXJsYXkgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBtb3VzZWVudGVyXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIilcbiAgICBwdWJsaWMgX29uTW91c2VlbnRlcigpOiB2b2lkIHtcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBhbmltYXRpb25zXG4gICAgICAgIHRoaXMuX2VuYWJsZUFuaW1hdGlvbnMoKTtcblxuICAgICAgICAvLyBTZXQgdGhlIGhvdmVyZWRcbiAgICAgICAgdGhpcy5ob3ZlcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBtb3VzZWxlYXZlXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIilcbiAgICBwdWJsaWMgX29uTW91c2VsZWF2ZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBhbmltYXRpb25zXG4gICAgICAgIHRoaXMuX2VuYWJsZUFuaW1hdGlvbnMoKTtcblxuICAgICAgICAvLyBTZXQgdGhlIGhvdmVyZWRcbiAgICAgICAgdGhpcy5ob3ZlcmVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3Blbi9jbG9zZSB0aGUgbmF2aWdhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZW5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3RvZ2dsZU9wZW5lZChvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIC8vIFNldCB0aGUgb3BlbmVkXG4gICAgICAgIHRoaXMub3BlbmVkID0gb3BlbjtcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGFuaW1hdGlvbnNcbiAgICAgICAgdGhpcy5fZW5hYmxlQW5pbWF0aW9ucygpO1xuXG4gICAgICAgIC8vIElmIHRoZSBuYXZpZ2F0aW9uIG9wZW5lZCwgYW5kIHRoZSBtb2RlXG4gICAgICAgIC8vIGlzICdvdmVyJywgc2hvdyB0aGUgb3ZlcmxheVxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcIm92ZXJcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd092ZXJsYXkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIG9ic2VydmFibGVcbiAgICAgICAgdGhpcy5vcGVuZWRDaGFuZ2VkLm5leHQob3Blbik7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi13cmFwcGVyXCI+XG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW25pY2VWZXJ0aWNhbE5hdmlnYXRpb25IZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb250ZW50IC0tPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tY29udGVudFwiXG4gICAgICAgIG5pY2VTY3JvbGxiYXJcbiAgICAgICAgW25pY2VTY3JvbGxiYXJPcHRpb25zXT1cInsgd2hlZWxQcm9wYWdhdGlvbjogaW5uZXIsIHN1cHByZXNzU2Nyb2xsWDogdHJ1ZSB9XCJcbiAgICAgICAgI25hdmlnYXRpb25Db250ZW50XG4gICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWNvbnRlbnQtaGVhZGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbmljZVZlcnRpY2FsTmF2aWdhdGlvbkNvbnRlbnRIZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEl0ZW1zIC0tPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIG5hdmlnYXRpb247IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtALmRpc2FibGVkXT1cIiFhbmltYXRlTmV4dE5hdkNoYW5nZVwiIEBzbGlkZUluUmlnaHQ+XG4gICAgICAgICAgICA8IS0tIFNraXAgdGhlIGhpZGRlbiBpdGVtcyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGl0ZW0gfCBuaWNlU2hvdWxkSGlkZSB8IGFzeW5jKVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gQXNpZGUgLS0+XG4gICAgICAgICAgICAgICAgPG5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1hc2lkZS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnYXNpZGUnXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlSXRlbUlkXT1cImFjdGl2ZUFzaWRlSXRlbUlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9Db2xsYXBzZV09XCJhdXRvQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2tpcENoaWxkcmVuXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQXNpZGUoaXRlbSlcIlxuICAgICAgICAgICAgICAgID48L25pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1hc2lkZS1pdGVtPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBCYXNpYyAtLT5cbiAgICAgICAgICAgICAgICA8bmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWJhc2ljLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdiYXNpYydcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWJhc2ljLWl0ZW0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENvbGxhcHNhYmxlIC0tPlxuICAgICAgICAgICAgICAgIDxuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tY29sbGFwc2FibGUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2NvbGxhcHNhYmxlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9Db2xsYXBzZV09XCJhdXRvQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgID48L25pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1jb2xsYXBzYWJsZS1pdGVtPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBEaXZpZGVyIC0tPlxuICAgICAgICAgICAgICAgIDxuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tZGl2aWRlci1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZGl2aWRlcidcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWRpdmlkZXItaXRlbT5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JvdXAgLS0+XG4gICAgICAgICAgICAgICAgPG5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1ncm91cC1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZ3JvdXAnXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXV0b0NvbGxhcHNlXT1cImF1dG9Db2xsYXBzZVwiXG4gICAgICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWdyb3VwLWl0ZW0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciAtLT5cbiAgICAgICAgICAgICAgICA8bmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLXNwYWNlci1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnc3BhY2VyJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICA+PC9uaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tc3BhY2VyLWl0ZW0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDb250ZW50IGZvb3RlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1jb250ZW50LWZvb3RlclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW25pY2VWZXJ0aWNhbE5hdmlnYXRpb25Db250ZW50Rm9vdGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9vdGVyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tZm9vdGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltuaWNlVmVydGljYWxOYXZpZ2F0aW9uRm9vdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEFzaWRlIC0tPlxuPGRpdlxuICAgIGNsYXNzPVwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLXdyYXBwZXJcIlxuICAgICpuZ0lmPVwiYWN0aXZlQXNpZGVJdGVtSWRcIlxuICAgIG5pY2VTY3JvbGxiYXJcbiAgICBbbmljZVNjcm9sbGJhck9wdGlvbnNdPVwieyB3aGVlbFByb3BhZ2F0aW9uOiBmYWxzZSwgc3VwcHJlc3NTY3JvbGxYOiB0cnVlIH1cIlxuICAgIFtAZmFkZUluTGVmdF09XCJwb3NpdGlvbiA9PT0gJ2xlZnQnXCJcbiAgICBbQGZhZGVJblJpZ2h0XT1cInBvc2l0aW9uID09PSAncmlnaHQnXCJcbiAgICBbQGZhZGVPdXRMZWZ0XT1cInBvc2l0aW9uID09PSAnbGVmdCdcIlxuICAgIFtAZmFkZU91dFJpZ2h0XT1cInBvc2l0aW9uID09PSAncmlnaHQnXCJcbj5cblxuICAgIDwhLS0gSXRlbXMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBuYXZpZ2F0aW9uOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPCEtLSBTa2lwIHRoZSBoaWRkZW4gaXRlbXMgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXRlbS5oaWRkZW4gJiYgIWl0ZW0uaGlkZGVuKGl0ZW0pKSB8fCAhaXRlbS5oaWRkZW5cIj5cbiAgICAgICAgICAgIDwhLS0gQXNpZGUgLS0+XG4gICAgICAgICAgICA8bmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLWl0ZW1cbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2FzaWRlJyAmJiBpdGVtLmlkID09PSBhY3RpdmVBc2lkZUl0ZW1JZFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgW2F1dG9Db2xsYXBzZV09XCJhdXRvQ29sbGFwc2VcIlxuICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLWl0ZW0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
583
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVydGljYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmljZS11aS1raXQtdjIvc3JjL2xpYi9jb21wb25lbnRzL25hdmlnYXRpb24vdmVydGljYWwvdmVydGljYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmljZS11aS1raXQtdjIvc3JjL2xpYi9jb21wb25lbnRzL25hdmlnYXRpb24vdmVydGljYWwvdmVydGljYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBbUIsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEYsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBa0IscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStC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QUs7Z0JBSUMsa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlVLGlCQUFpQjtzQkFEaEMsTUFBTTtnQkFJUyxXQUFXO3NCQUQxQixNQUFNO2dCQUlTLGFBQWE7c0JBRDVCLE1BQU07Z0JBSVMsY0FBYztzQkFEN0IsTUFBTTtnQkFJUyxlQUFlO3NCQUQ5QixNQUFNO2dCQUlDLG9CQUFvQjtzQkFEM0IsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBSW5CLFVBQVU7c0JBRHBCLEtBQUs7Z0JBNkNLLFNBQVM7c0JBRG5CLFdBQVc7dUJBQUMsT0FBTztnQkFvQlQsU0FBUztzQkFEbkIsV0FBVzt1QkFBQyxPQUFPO2dCQVdULHVCQUF1QjtzQkFEakMsWUFBWTt1QkFBQyxzQkFBc0I7Z0JBbWQ3QixhQUFhO3NCQURuQixZQUFZO3VCQUFDLFlBQVk7Z0JBY25CLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIEFuaW1hdGlvbkJ1aWxkZXIsIEFuaW1hdGlvblBsYXllciwgc3R5bGUgfSBmcm9tIFwiQGFuZ3VsYXIvYW5pbWF0aW9uc1wiO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvZXJjaW9uXCI7XG5pbXBvcnQgeyBTY3JvbGxTdHJhdGVneSwgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9vdmVybGF5XCI7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgbWVyZ2UsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWxheSwgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IG5pY2VBbmltYXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL2FuaW1hdGlvbnNcIjtcbmltcG9ydCB7IE5pY2VTY3JvbGxiYXJEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vLi4vZGlyZWN0aXZlcy9zY3JvbGxiYXJcIjtcbmltcG9ydCB7IE5pY2VVdGlsc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vcHJvdmlkZXJzL3V0aWxzXCI7XG5pbXBvcnQgeyBOaWNlTmF2aWdhdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9uYXZpZ2F0aW9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTmljZU5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL25hdmlnYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgICBOaWNlTmF2aWdhdGlvbkl0ZW0sXG4gICAgTmljZVZlcnRpY2FsTmF2aWdhdGlvbkFwcGVhcmFuY2UsXG4gICAgTmljZVZlcnRpY2FsTmF2aWdhdGlvbk1vZGUsXG4gICAgTmljZVZlcnRpY2FsTmF2aWdhdGlvblBvc2l0aW9uXG59IGZyb20gXCIuLi9uYXZpZ2F0aW9uLnR5cGVzXCI7XG5pbXBvcnQgeyBOaWNlTmF2aWdhdGlvbkhpbnRTZXJ2aWNlIH0gZnJvbSBcIi4uL3Byb3ZpZGVycy9oaW50LnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi92ZXJ0aWNhbC5jb21wb25lbnQuaHRtbFwiLFxuICAgIGFuaW1hdGlvbnM6IG5pY2VBbmltYXRpb25zLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZXhwb3J0QXM6IFwibmljZVZlcnRpY2FsTmF2aWdhdGlvblwiXG59KVxuZXhwb3J0IGNsYXNzIE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25Db21wb25lbnQgZXh0ZW5kcyBOaWNlTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIHB1YmxpYyBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaW5uZXI6IEJvb2xlYW5JbnB1dDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIHB1YmxpYyBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfb3BlbmVkOiBCb29sZWFuSW5wdXQ7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICBwdWJsaWMgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3RyYW5zcGFyZW50T3ZlcmxheTogQm9vbGVhbklucHV0O1xuXG4gICAgcHJpdmF0ZSBfYW5pbWF0aW9uc0VuYWJsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9hc2lkZU92ZXJsYXk6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZUFzaWRlT3ZlcmxheUNsaWNrOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGFuZGxlT3ZlcmxheUNsaWNrOiBhbnk7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfcGxheWVyOiBBbmltYXRpb25QbGF5ZXI7XG4gICAgcHJpdmF0ZSBfc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5fc2Nyb2xsU3RyYXRlZ3lPcHRpb25zLmJsb2NrKCk7XG4gICAgcHJpdmF0ZSBfbmljZVNjcm9sbGJhckRpcmVjdGl2ZXMhOiBRdWVyeUxpc3Q8TmljZVNjcm9sbGJhckRpcmVjdGl2ZT47XG4gICAgcHJpdmF0ZSBfbmljZVNjcm9sbGJhckRpcmVjdGl2ZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IHRoaXMuX25pY2VVdGlsc1NlcnZpY2UucmFuZG9tSWQoKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFwcGVhcmFuY2U6IE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25BcHBlYXJhbmNlID0gXCJkZWZhdWx0XCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvQ29sbGFwc2UgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaW5uZXIgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vZGU6IE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25Nb2RlID0gXCJzaWRlXCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvcGVuZWQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaG92ZXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGFzSGludCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcG9zaXRpb246IE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25Qb3NpdGlvbiA9IFwibGVmdFwiO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHJhbnNwYXJlbnRPdmVybGF5ID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwZWFyYW5jZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5pY2VWZXJ0aWNhbE5hdmlnYXRpb25BcHBlYXJhbmNlPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IG1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxOaWNlVmVydGljYWxOYXZpZ2F0aW9uTW9kZT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBvcGVuZWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGhvdmVyZWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IHBvc2l0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TmljZVZlcnRpY2FsTmF2aWdhdGlvblBvc2l0aW9uPigpO1xuXG4gICAgQFZpZXdDaGlsZChcIm5hdmlnYXRpb25Db250ZW50XCIpXG4gICAgcHJpdmF0ZSBfbmF2aWdhdGlvbkNvbnRlbnRFbDogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBuYXZpZ2F0aW9uKG5hdmlnYXRpb246IE5pY2VOYXZpZ2F0aW9uSXRlbVtdKSB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb24gPSBuYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBuYXZpZ2F0aW9uKCk6IE5pY2VOYXZpZ2F0aW9uSXRlbVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2ZUFzaWRlSXRlbUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb25Db2xsYXBzYWJsZUl0ZW1Db2xsYXBzZWQgPSBuZXcgUmVwbGF5U3ViamVjdDxOaWNlTmF2aWdhdGlvbkl0ZW0+KDEpO1xuICAgIHB1YmxpYyBvbkNvbGxhcHNhYmxlSXRlbUV4cGFuZGVkID0gbmV3IFJlcGxheVN1YmplY3Q8TmljZU5hdmlnYXRpb25JdGVtPigxKTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIF9uaWNlTmF2aWdhdGlvblNlcnZpY2U6IE5pY2VOYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgX25pY2VVdGlsc1NlcnZpY2U6IE5pY2VVdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2FuaW1hdGlvbkJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgX3JlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBfc2Nyb2xsU3RyYXRlZ3lPcHRpb25zOiBTY3JvbGxTdHJhdGVneU9wdGlvbnMsXG4gICAgICAgIHByaXZhdGUgX2hpbnRTZXJ2aWNlOiBOaWNlTmF2aWdhdGlvbkhpbnRTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKF9jaGFuZ2VEZXRlY3RvclJlZiwgX25pY2VOYXZpZ2F0aW9uU2VydmljZSwgX25pY2VVdGlsc1NlcnZpY2UpO1xuXG4gICAgICAgIHRoaXMuX2hhbmRsZUFzaWRlT3ZlcmxheUNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFzaWRlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2hhbmRsZU92ZXJsYXlDbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEAgQWNjZXNzb3JzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEhvc3QgYmluZGluZyBmb3IgY29tcG9uZW50IGNsYXNzZXNcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzc1wiKVxuICAgIHB1YmxpYyBnZXQgY2xhc3NMaXN0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1hbmltYXRpb25zLWVuYWJsZWRcIjogdGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQsXG4gICAgICAgICAgICBbYG5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1hcHBlYXJhbmNlLSR7dGhpcy5hcHBlYXJhbmNlfWBdOiB0cnVlLFxuICAgICAgICAgICAgXCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24taG92ZXJcIjogdGhpcy5ob3ZlcmVkLFxuICAgICAgICAgICAgXCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24taW5uZXJcIjogdGhpcy5pbm5lcixcbiAgICAgICAgICAgIFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLW1vZGUtb3ZlclwiOiB0aGlzLm1vZGUgPT09IFwib3ZlclwiLFxuICAgICAgICAgICAgXCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tbW9kZS1zaWRlXCI6IHRoaXMubW9kZSA9PT0gXCJzaWRlXCIsXG4gICAgICAgICAgICBcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1vcGVuZWRcIjogdGhpcy5vcGVuZWQsXG4gICAgICAgICAgICBcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1wb3NpdGlvbi1sZWZ0XCI6IHRoaXMucG9zaXRpb24gPT09IFwibGVmdFwiLFxuICAgICAgICAgICAgXCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tcG9zaXRpb24tcmlnaHRcIjogdGhpcy5wb3NpdGlvbiA9PT0gXCJyaWdodFwiLFxuICAgICAgICAgICAgXCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24taGFzLWhpbnRcIjogdGhpcy5oYXNIaW50XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSG9zdCBiaW5kaW5nIGZvciBjb21wb25lbnQgaW5saW5lIHN0eWxlc1xuICAgICAqL1xuICAgIEBIb3N0QmluZGluZyhcInN0eWxlXCIpXG4gICAgcHVibGljIGdldCBzdHlsZUxpc3QoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiB0aGlzLm9wZW5lZCA/IFwidmlzaWJsZVwiIDogXCJoaWRkZW5cIlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHRlciBmb3IgbmljZVNjcm9sbGJhckRpcmVjdGl2ZXNcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKE5pY2VTY3JvbGxiYXJEaXJlY3RpdmUpXG4gICAgcHVibGljIHNldCBuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlcyhuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlczogUXVlcnlMaXN0PE5pY2VTY3JvbGxiYXJEaXJlY3RpdmU+KSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSBkaXJlY3RpdmVzXG4gICAgICAgIHRoaXMuX25pY2VTY3JvbGxiYXJEaXJlY3RpdmVzID0gbmljZVNjcm9sbGJhckRpcmVjdGl2ZXM7XG5cbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZXJlIGFyZSBubyBkaXJlY3RpdmVzXG4gICAgICAgIGlmIChuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuc3Vic2NyaWJlIHRoZSBwcmV2aW91cyBzdWJzY3JpcHRpb25zXG4gICAgICAgIGlmICh0aGlzLl9uaWNlU2Nyb2xsYmFyRGlyZWN0aXZlc1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbmljZVNjcm9sbGJhckRpcmVjdGl2ZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc2Nyb2xsYmFycyBvbiBjb2xsYXBzYWJsZSBpdGVtcycgY29sbGFwc2UvZXhwYW5kXG4gICAgICAgIHRoaXMuX25pY2VTY3JvbGxiYXJEaXJlY3RpdmVzU3Vic2NyaXB0aW9uID1cbiAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgIHRoaXMub25Db2xsYXBzYWJsZUl0ZW1Db2xsYXBzZWQsXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbGxhcHNhYmxlSXRlbUV4cGFuZGVkXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZUFsbCksXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5KDI1MClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzY3JvbGxiYXJzIGFuZCB1cGRhdGUgdGhlbVxuICAgICAgICAgICAgICAgICAgICBuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlcy5mb3JFYWNoKChuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEAgTGlmZWN5Y2xlIGhvb2tzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIE9uIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG5cbiAgICAgICAgLy8gQXBwZWFyYW5jZVxuICAgICAgICBpZiAoXCJhcHBlYXJhbmNlXCIgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgb2JzZXJ2YWJsZVxuICAgICAgICAgICAgdGhpcy5hcHBlYXJhbmNlQ2hhbmdlZC5uZXh0KGNoYW5nZXMuYXBwZWFyYW5jZS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5uZXJcbiAgICAgICAgaWYgKFwiaW5uZXJcIiBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICAvLyBDb2VyY2UgdGhlIHZhbHVlIHRvIGEgYm9vbGVhblxuICAgICAgICAgICAgdGhpcy5pbm5lciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShjaGFuZ2VzLmlubmVyLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb2RlXG4gICAgICAgIGlmIChcIm1vZGVcIiBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHZhbHVlc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGUgPSBjaGFuZ2VzLm1vZGUuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNNb2RlID0gY2hhbmdlcy5tb2RlLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGFuaW1hdGlvbnNcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVBbmltYXRpb25zKCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBtb2RlIGNoYW5nZXM6ICdvdmVyIC0+IHNpZGUnXG4gICAgICAgICAgICBpZiAocHJldmlvdXNNb2RlID09PSBcIm92ZXJcIiAmJiBjdXJyZW50TW9kZSA9PT0gXCJzaWRlXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBIaWRlIHRoZSBvdmVybGF5XG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIG1vZGUgY2hhbmdlczogJ3NpZGUgLT4gb3ZlcidcbiAgICAgICAgICAgIGlmIChwcmV2aW91c01vZGUgPT09IFwic2lkZVwiICYmIGN1cnJlbnRNb2RlID09PSBcIm92ZXJcIikge1xuICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBhc2lkZVxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBc2lkZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5hdmlnYXRpb24gaXMgb3BlbmVkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3cgdGhlIG92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd092ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG9ic2VydmFibGVcbiAgICAgICAgICAgIHRoaXMubW9kZUNoYW5nZWQubmV4dChjdXJyZW50TW9kZSk7XG5cbiAgICAgICAgICAgIC8vIEVuYWJsZSB0aGUgYW5pbWF0aW9ucyBhZnRlciBhIGRlbGF5XG4gICAgICAgICAgICAvLyBUaGUgZGVsYXkgbXVzdCBiZSBiaWdnZXIgdGhhbiB0aGUgY3VycmVudCB0cmFuc2l0aW9uLWR1cmF0aW9uXG4gICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgbm90aGluZyB3aWxsIGJlIGFuaW1hdGVkIHdoaWxlIHRoZSBtb2RlIGNoYW5naW5nXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVBbmltYXRpb25zKCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3BlbmVkXG4gICAgICAgIGlmIChcIm9wZW5lZFwiIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIC8vIENvZXJjZSB0aGUgdmFsdWUgdG8gYSBib29sZWFuXG4gICAgICAgICAgICB0aGlzLm9wZW5lZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShjaGFuZ2VzLm9wZW5lZC5jdXJyZW50VmFsdWUpO1xuXG4gICAgICAgICAgICAvLyBPcGVuL2Nsb3NlIHRoZSBuYXZpZ2F0aW9uXG4gICAgICAgICAgICB0aGlzLl90b2dnbGVPcGVuZWQodGhpcy5vcGVuZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9zaXRpb25cbiAgICAgICAgaWYgKFwicG9zaXRpb25cIiBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBvYnNlcnZhYmxlXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uQ2hhbmdlZC5uZXh0KGNoYW5nZXMucG9zaXRpb24uY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYW5zcGFyZW50IG92ZXJsYXlcbiAgICAgICAgaWYgKFwidHJhbnNwYXJlbnRPdmVybGF5XCIgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgLy8gQ29lcmNlIHRoZSB2YWx1ZSB0byBhIGJvb2xlYW5cbiAgICAgICAgICAgIHRoaXMudHJhbnNwYXJlbnRPdmVybGF5ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KGNoYW5nZXMudHJhbnNwYXJlbnRPdmVybGF5LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBpbml0XG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbmFtZSBpbnB1dCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmICh0aGlzLm5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuX25pY2VVdGlsc1NlcnZpY2UucmFuZG9tSWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgJ05hdmlnYXRpb25FbmQnIGV2ZW50XG4gICAgICAgIHRoaXMuX3JvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZUFsbClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBtb2RlIGlzICdvdmVyJyBhbmQgdGhlIG5hdmlnYXRpb24gaXMgb3BlbmVkLi4uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJvdmVyXCIgJiYgdGhpcy5vcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG5hdmlnYXRpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBtb2RlIGlzICdzaWRlJyBhbmQgdGhlIGFzaWRlIGlzIGFjdGl2ZS4uLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwic2lkZVwiICYmIHRoaXMuYWN0aXZlQXNpZGVJdGVtSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGFzaWRlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBc2lkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2hpbnRTZXJ2aWNlLmhhc0FjdGl2ZUhpbnQkLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlQWxsKSkuc3Vic2NyaWJlKGhhc0hpbnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNIaW50ID0gaGFzSGludDtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJlZENoYW5nZWQubmV4dCh0aGlzLmhvdmVyZWQgfHwgdGhpcy5oYXNIaW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgdmlldyBpbml0XG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFJldHVybiBpZiAnbmF2aWdhdGlvbiBjb250ZW50JyBlbGVtZW50IGRvZXMgbm90IGV4aXN0XG4gICAgICAgICAgICBpZiAoIXRoaXMuX25hdmlnYXRpb25Db250ZW50RWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmICduYXZpZ2F0aW9uIGNvbnRlbnQnIGVsZW1lbnQgZG9lc24ndCBoYXZlXG4gICAgICAgICAgICAvLyBwZXJmZWN0IHNjcm9sbGJhciBhY3RpdmF0ZWQgb24gaXQuLi5cbiAgICAgICAgICAgIGlmICghdGhpcy5fbmF2aWdhdGlvbkNvbnRlbnRFbC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInBzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgYWN0aXZlIGl0ZW1cbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJdGVtID0gdGhpcy5fbmF2aWdhdGlvbkNvbnRlbnRFbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWl0ZW0tYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFjdGl2ZSBpdGVtIGV4aXN0cywgc2Nyb2xsIGl0IGludG8gdmlld1xuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUl0ZW0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBzY3JvbGxiYXIgZGlyZWN0aXZlc1xuICAgICAgICAgICAgICAgIHRoaXMuX25pY2VTY3JvbGxiYXJEaXJlY3RpdmVzLmZvckVhY2goKG5pY2VTY3JvbGxiYXJEaXJlY3RpdmUpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIG5vdCBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmljZVNjcm9sbGJhckRpcmVjdGl2ZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBhY3RpdmUgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBuaWNlU2Nyb2xsYmFyRGlyZWN0aXZlLnNjcm9sbFRvRWxlbWVudChcIi5uaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24taXRlbS1hY3RpdmVcIiwgLTEyMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQCBQdWJsaWMgbWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBPcGVuIHRoZSBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIC8vIFJldHVybiBpZiB0aGUgbmF2aWdhdGlvbiBpcyBhbHJlYWR5IG9wZW5cbiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIG9wZW5lZFxuICAgICAgICB0aGlzLl90b2dnbGVPcGVuZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIC8vIFJldHVybiBpZiB0aGUgbmF2aWdhdGlvbiBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICBpZiAoIXRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbG9zZSB0aGUgYXNpZGVcbiAgICAgICAgdGhpcy5jbG9zZUFzaWRlKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBvcGVuZWRcbiAgICAgICAgdGhpcy5fdG9nZ2xlT3BlbmVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgdGhlIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICAvLyBUb2dnbGVcbiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gdGhlIGFzaWRlXG4gICAgICovXG4gICAgcHVibGljIG9wZW5Bc2lkZShpdGVtOiBOaWNlTmF2aWdhdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBpdGVtIGlzIGRpc2FibGVkXG4gICAgICAgIGlmIChpdGVtLmRpc2FibGVkIHx8ICFpdGVtLmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcGVuXG4gICAgICAgIHRoaXMuYWN0aXZlQXNpZGVJdGVtSWQgPSBpdGVtLmlkO1xuXG4gICAgICAgIC8vIFNob3cgdGhlIGFzaWRlIG92ZXJsYXlcbiAgICAgICAgdGhpcy5fc2hvd0FzaWRlT3ZlcmxheSgpO1xuXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBhc2lkZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZUFzaWRlKCk6IHZvaWQge1xuICAgICAgICAvLyBDbG9zZVxuICAgICAgICB0aGlzLmFjdGl2ZUFzaWRlSXRlbUlkID0gbnVsbDtcblxuICAgICAgICAvLyBIaWRlIHRoZSBhc2lkZSBvdmVybGF5XG4gICAgICAgIHRoaXMuX2hpZGVBc2lkZU92ZXJsYXkoKTtcblxuICAgICAgICAvLyBNYXJrIGZvciBjaGVja1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgdGhlIGFzaWRlXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUFzaWRlKGl0ZW06IE5pY2VOYXZpZ2F0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICAvLyBUb2dnbGVcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlQXNpZGVJdGVtSWQgPT09IGl0ZW0uaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBc2lkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuQXNpZGUoaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEAgUHJpdmF0ZSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9lbmFibGVBbmltYXRpb25zKCk6IHZvaWQge1xuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIGFuaW1hdGlvbnMgYXJlIGFscmVhZHkgZW5hYmxlZFxuICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAgICB0aGlzLl9hbmltYXRpb25zRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kaXNhYmxlQW5pbWF0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBhbmltYXRpb25zIGFyZSBhbHJlYWR5IGRpc2FibGVkXG4gICAgICAgIGlmICghdGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgdGhlIGFuaW1hdGlvbnNcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBvdmVybGF5XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Nob3dPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBvdmVybGF5XG4gICAgICAgIGlmICh0aGlzLl9hc2lkZU92ZXJsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICAgIHRoaXMuX292ZXJsYXkgPSB0aGlzLl9yZW5kZXJlcjIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICAvLyBBZGQgYSBjbGFzcyB0byB0aGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICAgIHRoaXMuX292ZXJsYXkuY2xhc3NMaXN0LmFkZChcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1vdmVybGF5XCIpO1xuXG4gICAgICAgIC8vIEFkZCBhIGNsYXNzIGRlcGVuZGluZyBvbiB0aGUgdHJhbnNwYXJlbnRPdmVybGF5IG9wdGlvblxuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudE92ZXJsYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXkuY2xhc3NMaXN0LmFkZChcIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1vdmVybGF5LXRyYW5zcGFyZW50XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSBvdmVybGF5IHRvIHRoZSBwYXJlbnQgb2YgdGhlIG5hdmlnYXRpb25cbiAgICAgICAgdGhpcy5fcmVuZGVyZXIyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LCB0aGlzLl9vdmVybGF5KTtcblxuICAgICAgICAvLyBFbmFibGUgYmxvY2sgc2Nyb2xsIHN0cmF0ZWd5XG4gICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmVuYWJsZSgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgZW50ZXIgYW5pbWF0aW9uIGFuZCBhdHRhY2ggaXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLl9wbGF5ZXIgPSB0aGlzLl9hbmltYXRpb25CdWlsZGVyLmJ1aWxkKFtcbiAgICAgICAgICAgIGFuaW1hdGUoXCIzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKVwiLCBzdHlsZSh7b3BhY2l0eTogMX0pKVxuICAgICAgICBdKS5jcmVhdGUodGhpcy5fb3ZlcmxheSk7XG5cbiAgICAgICAgLy8gUGxheSB0aGUgYW5pbWF0aW9uXG4gICAgICAgIHRoaXMuX3BsYXllci5wbGF5KCk7XG5cbiAgICAgICAgLy8gQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBvdmVybGF5XG4gICAgICAgIHRoaXMuX292ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZU92ZXJsYXlDbGljayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZSB0aGUgb3ZlcmxheVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9oaWRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxlYXZlIGFuaW1hdGlvbiBhbmQgYXR0YWNoIGl0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgdGhpcy5fcGxheWVyID0gdGhpcy5fYW5pbWF0aW9uQnVpbGRlci5idWlsZChbXG4gICAgICAgICAgICBhbmltYXRlKFwiMzAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSlcIiwgc3R5bGUoe29wYWNpdHk6IDB9KSlcbiAgICAgICAgXSkuY3JlYXRlKHRoaXMuX292ZXJsYXkpO1xuXG4gICAgICAgIC8vIFBsYXkgdGhlIGFuaW1hdGlvblxuICAgICAgICB0aGlzLl9wbGF5ZXIucGxheSgpO1xuXG4gICAgICAgIC8vIE9uY2UgdGhlIGFuaW1hdGlvbiBpcyBkb25lLi4uXG4gICAgICAgIHRoaXMuX3BsYXllci5vbkRvbmUoKCkgPT4ge1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgb3ZlcmxheSBzdGlsbCBleGlzdHMuLi5cbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZU92ZXJsYXlDbGljayk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG92ZXJsYXlcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fb3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYmxvY2sgc2Nyb2xsIHN0cmF0ZWd5XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5kaXNhYmxlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIGFzaWRlIG92ZXJsYXlcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2hvd0FzaWRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3ZlcmxheVxuICAgICAgICBpZiAodGhpcy5fYXNpZGVPdmVybGF5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGFzaWRlIG92ZXJsYXkgZWxlbWVudFxuICAgICAgICB0aGlzLl9hc2lkZU92ZXJsYXkgPSB0aGlzLl9yZW5kZXJlcjIuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICAvLyBBZGQgYSBjbGFzcyB0byB0aGUgYXNpZGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICAgIHRoaXMuX2FzaWRlT3ZlcmxheS5jbGFzc0xpc3QuYWRkKFwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLW92ZXJsYXlcIik7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSBhc2lkZSBvdmVybGF5IHRvIHRoZSBwYXJlbnQgb2YgdGhlIG5hdmlnYXRpb25cbiAgICAgICAgdGhpcy5fcmVuZGVyZXIyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LCB0aGlzLl9hc2lkZU92ZXJsYXkpO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgZW50ZXIgYW5pbWF0aW9uIGFuZCBhdHRhY2ggaXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLl9wbGF5ZXIgPVxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uQnVpbGRlclxuICAgICAgICAgICAgICAgIC5idWlsZChbXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGUoXCIzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKVwiLCBzdHlsZSh7b3BhY2l0eTogMX0pKVxuICAgICAgICAgICAgICAgIF0pLmNyZWF0ZSh0aGlzLl9hc2lkZU92ZXJsYXkpO1xuXG4gICAgICAgIC8vIFBsYXkgdGhlIGFuaW1hdGlvblxuICAgICAgICB0aGlzLl9wbGF5ZXIucGxheSgpO1xuXG4gICAgICAgIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgYXNpZGUgb3ZlcmxheVxuICAgICAgICB0aGlzLl9hc2lkZU92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZUFzaWRlT3ZlcmxheUNsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBhc2lkZSBvdmVybGF5XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2hpZGVBc2lkZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fYXNpZGVPdmVybGF5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxlYXZlIGFuaW1hdGlvbiBhbmQgYXR0YWNoIGl0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgdGhpcy5fcGxheWVyID1cbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkJ1aWxkZXJcbiAgICAgICAgICAgICAgICAuYnVpbGQoW1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRlKFwiMzAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSlcIiwgc3R5bGUoe29wYWNpdHk6IDB9KSlcbiAgICAgICAgICAgICAgICBdKS5jcmVhdGUodGhpcy5fYXNpZGVPdmVybGF5KTtcblxuICAgICAgICAvLyBQbGF5IHRoZSBhbmltYXRpb25cbiAgICAgICAgdGhpcy5fcGxheWVyLnBsYXkoKTtcblxuICAgICAgICAvLyBPbmNlIHRoZSBhbmltYXRpb24gaXMgZG9uZS4uLlxuICAgICAgICB0aGlzLl9wbGF5ZXIub25Eb25lKCgpID0+IHtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGFzaWRlIG92ZXJsYXkgc3RpbGwgZXhpc3RzLi4uXG4gICAgICAgICAgICBpZiAodGhpcy5fYXNpZGVPdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIHRoaXMuX2FzaWRlT3ZlcmxheS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlQXNpZGVPdmVybGF5Q2xpY2spO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhc2lkZSBvdmVybGF5XG4gICAgICAgICAgICAgICAgdGhpcy5fYXNpZGVPdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fYXNpZGVPdmVybGF5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9hc2lkZU92ZXJsYXkgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBtb3VzZWVudGVyXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIilcbiAgICBwdWJsaWMgX29uTW91c2VlbnRlcigpOiB2b2lkIHtcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBhbmltYXRpb25zXG4gICAgICAgIHRoaXMuX2VuYWJsZUFuaW1hdGlvbnMoKTtcblxuICAgICAgICAvLyBTZXQgdGhlIGhvdmVyZWRcbiAgICAgICAgdGhpcy5ob3ZlcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ob3ZlcmVkQ2hhbmdlZC5uZXh0KHRoaXMuaG92ZXJlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gbW91c2VsZWF2ZVxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIpXG4gICAgcHVibGljIF9vbk1vdXNlbGVhdmUoKTogdm9pZCB7XG4gICAgICAgIC8vIEVuYWJsZSB0aGUgYW5pbWF0aW9uc1xuICAgICAgICB0aGlzLl9lbmFibGVBbmltYXRpb25zKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBob3ZlcmVkXG4gICAgICAgIHRoaXMuaG92ZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhvdmVyZWRDaGFuZ2VkLm5leHQodGhpcy5ob3ZlcmVkIHx8IHRoaXMuaGFzSGludCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3Blbi9jbG9zZSB0aGUgbmF2aWdhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZW5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3RvZ2dsZU9wZW5lZChvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIC8vIFNldCB0aGUgb3BlbmVkXG4gICAgICAgIHRoaXMub3BlbmVkID0gb3BlbjtcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGFuaW1hdGlvbnNcbiAgICAgICAgdGhpcy5fZW5hYmxlQW5pbWF0aW9ucygpO1xuXG4gICAgICAgIC8vIElmIHRoZSBuYXZpZ2F0aW9uIG9wZW5lZCwgYW5kIHRoZSBtb2RlXG4gICAgICAgIC8vIGlzICdvdmVyJywgc2hvdyB0aGUgb3ZlcmxheVxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcIm92ZXJcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd092ZXJsYXkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIG9ic2VydmFibGVcbiAgICAgICAgdGhpcy5vcGVuZWRDaGFuZ2VkLm5leHQob3Blbik7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi13cmFwcGVyXCI+XG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW25pY2VWZXJ0aWNhbE5hdmlnYXRpb25IZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb250ZW50IC0tPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tY29udGVudFwiXG4gICAgICAgIG5pY2VTY3JvbGxiYXJcbiAgICAgICAgW25pY2VTY3JvbGxiYXJPcHRpb25zXT1cInsgd2hlZWxQcm9wYWdhdGlvbjogaW5uZXIsIHN1cHByZXNzU2Nyb2xsWDogdHJ1ZSB9XCJcbiAgICAgICAgI25hdmlnYXRpb25Db250ZW50XG4gICAgPlxuICAgICAgICA8IS0tIENvbnRlbnQgaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWNvbnRlbnQtaGVhZGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbmljZVZlcnRpY2FsTmF2aWdhdGlvbkNvbnRlbnRIZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEl0ZW1zIC0tPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIG5hdmlnYXRpb247IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtALmRpc2FibGVkXT1cIiFhbmltYXRlTmV4dE5hdkNoYW5nZVwiIEBzbGlkZUluUmlnaHQ+XG4gICAgICAgICAgICA8IS0tIFNraXAgdGhlIGhpZGRlbiBpdGVtcyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGl0ZW0gfCBuaWNlU2hvdWxkSGlkZSB8IGFzeW5jKVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gQXNpZGUgLS0+XG4gICAgICAgICAgICAgICAgPG5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1hc2lkZS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnYXNpZGUnXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlSXRlbUlkXT1cImFjdGl2ZUFzaWRlSXRlbUlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9Db2xsYXBzZV09XCJhdXRvQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2tpcENoaWxkcmVuXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQXNpZGUoaXRlbSlcIlxuICAgICAgICAgICAgICAgID48L25pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1hc2lkZS1pdGVtPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBCYXNpYyAtLT5cbiAgICAgICAgICAgICAgICA8bmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWJhc2ljLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdiYXNpYydcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWJhc2ljLWl0ZW0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENvbGxhcHNhYmxlIC0tPlxuICAgICAgICAgICAgICAgIDxuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tY29sbGFwc2FibGUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2NvbGxhcHNhYmxlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9Db2xsYXBzZV09XCJhdXRvQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgID48L25pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1jb2xsYXBzYWJsZS1pdGVtPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBEaXZpZGVyIC0tPlxuICAgICAgICAgICAgICAgIDxuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tZGl2aWRlci1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZGl2aWRlcidcIlxuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWRpdmlkZXItaXRlbT5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JvdXAgLS0+XG4gICAgICAgICAgICAgICAgPG5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1ncm91cC1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZ3JvdXAnXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbYXV0b0NvbGxhcHNlXT1cImF1dG9Db2xsYXBzZVwiXG4gICAgICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWdyb3VwLWl0ZW0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciAtLT5cbiAgICAgICAgICAgICAgICA8bmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLXNwYWNlci1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnc3BhY2VyJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICA+PC9uaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tc3BhY2VyLWl0ZW0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDb250ZW50IGZvb3RlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5pY2UtdmVydGljYWwtbmF2aWdhdGlvbi1jb250ZW50LWZvb3RlclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW25pY2VWZXJ0aWNhbE5hdmlnYXRpb25Db250ZW50Rm9vdGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9vdGVyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJuaWNlLXZlcnRpY2FsLW5hdmlnYXRpb24tZm9vdGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltuaWNlVmVydGljYWxOYXZpZ2F0aW9uRm9vdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEFzaWRlIC0tPlxuPGRpdlxuICAgIGNsYXNzPVwibmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLXdyYXBwZXJcIlxuICAgICpuZ0lmPVwiYWN0aXZlQXNpZGVJdGVtSWRcIlxuICAgIG5pY2VTY3JvbGxiYXJcbiAgICBbbmljZVNjcm9sbGJhck9wdGlvbnNdPVwieyB3aGVlbFByb3BhZ2F0aW9uOiBmYWxzZSwgc3VwcHJlc3NTY3JvbGxYOiB0cnVlIH1cIlxuICAgIFtAZmFkZUluTGVmdF09XCJwb3NpdGlvbiA9PT0gJ2xlZnQnXCJcbiAgICBbQGZhZGVJblJpZ2h0XT1cInBvc2l0aW9uID09PSAncmlnaHQnXCJcbiAgICBbQGZhZGVPdXRMZWZ0XT1cInBvc2l0aW9uID09PSAnbGVmdCdcIlxuICAgIFtAZmFkZU91dFJpZ2h0XT1cInBvc2l0aW9uID09PSAncmlnaHQnXCJcbj5cblxuICAgIDwhLS0gSXRlbXMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBuYXZpZ2F0aW9uOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPCEtLSBTa2lwIHRoZSBoaWRkZW4gaXRlbXMgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXRlbS5oaWRkZW4gJiYgIWl0ZW0uaGlkZGVuKGl0ZW0pKSB8fCAhaXRlbS5oaWRkZW5cIj5cbiAgICAgICAgICAgIDwhLS0gQXNpZGUgLS0+XG4gICAgICAgICAgICA8bmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLWl0ZW1cbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2FzaWRlJyAmJiBpdGVtLmlkID09PSBhY3RpdmVBc2lkZUl0ZW1JZFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgW2F1dG9Db2xsYXBzZV09XCJhdXRvQ29sbGFwc2VcIlxuICAgICAgICAgICAgPjwvbmljZS12ZXJ0aWNhbC1uYXZpZ2F0aW9uLWFzaWRlLWl0ZW0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=