@leanix/components 0.4.108 → 0.4.109

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,16 @@
1
+ import { __decorate } from "tslib";
1
2
  import { PortalModule } from '@angular/cdk/portal';
2
3
  import { NgIf, NgTemplateOutlet } from '@angular/common';
3
4
  import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
4
5
  import { RouterLink, RouterLinkActive } from '@angular/router';
5
6
  import { uniqueId } from 'lodash/fp';
7
+ import { switchMap } from 'rxjs';
6
8
  import { BadgeComponent } from '../../../core-ui/components/badge/badge.component';
9
+ import { Observe } from '../../../shared/observe';
10
+ import { LxTabGroupKeyCode } from '../tab-group/tab-group-key-codes.enum';
7
11
  import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/cdk/portal";
12
+ import * as i1 from "@angular/router";
13
+ import * as i2 from "@angular/cdk/portal";
9
14
  export class TabComponent {
10
15
  set isActive(value) {
11
16
  this._isActive = value;
@@ -17,8 +22,10 @@ export class TabComponent {
17
22
  }
18
23
  return this._isActive;
19
24
  }
20
- constructor(cd) {
25
+ constructor(cd, router, activatedRoute) {
21
26
  this.cd = cd;
27
+ this.router = router;
28
+ this.activatedRoute = activatedRoute;
22
29
  this.label = '';
23
30
  this.routerLinkActiveOptions = { exact: true };
24
31
  this.counterBadgeSize = 'default';
@@ -27,20 +34,52 @@ export class TabComponent {
27
34
  this.background = 'white';
28
35
  this.disabled = false;
29
36
  this.switch = new EventEmitter();
37
+ this.keyDownAction = new EventEmitter();
30
38
  this._isActive = false;
31
- this.tabPanelId = uniqueId('panelId');
32
39
  this.tabId = uniqueId('tab');
40
+ this.routerLinkActiveChange$ = this.routerLinkActive$.pipe(switchMap((routerLinkActive) => routerLinkActive.isActiveChange));
33
41
  }
34
42
  select() {
35
- this.switch.emit({ tabId: this.tabId, tabPanelId: this.tabPanelId });
43
+ this.switch.emit();
36
44
  }
37
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TabComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
38
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TabComponent, isStandalone: true, selector: "lx-tab", inputs: { icon: "icon", label: "label", title: "title", tabLink: "tabLink", counter: "counter", routerLinkActiveOptions: "routerLinkActiveOptions", counterBadgeSize: "counterBadgeSize", noMargin: "noMargin", noLeftMarginForFirstTab: "noLeftMarginForFirstTab", background: "background", disabled: "disabled" }, outputs: { switch: "switch" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["contentTemplate"], descendants: true, static: true }, { propertyName: "routerLinkActive", first: true, predicate: RouterLinkActive, descendants: true }], ngImport: i0, template: "<li\n class=\"tab\"\n [class.active]=\"isActive\"\n [class.withIcon]=\"icon\"\n [class.noMargin]=\"noMargin\"\n [class.noLeftMarginForFirstTab]=\"noLeftMarginForFirstTab\"\n [class.backgroundGray]=\"background === 'gray'\"\n [class.disabled]=\"disabled\"\n [class.portalTab]=\"!tabLink\"\n [class.routerLinkTab]=\"tabLink\"\n [attr.title]=\"title\"\n (click)=\"select()\"\n (keyup.enter)=\"select()\"\n (keyup.space)=\"select()\"\n [attr.role]=\"tabLink ? 'presentation' : 'tab'\"\n [attr.id]=\"tabLink ? null : tabId\"\n [attr.aria-selected]=\"tabLink ? null : isActive\"\n [attr.aria-controls]=\"tabLink ? null : tabPanelId\"\n [attr.tabindex]=\"tabLink ? null : isActive || disabled || tabLink ? '-1' : '0'\"\n>\n <a\n *ngIf=\"tabLink; else portalTab\"\n role=\"tab\"\n [attr.id]=\"tabId\"\n [attr.aria-selected]=\"isActive\"\n [attr.aria-controls]=\"tabPanelId\"\n [routerLink]=\"tabLink\"\n routerLinkActive\n [routerLinkActiveOptions]=\"routerLinkActiveOptions\"\n >\n <ng-container *ngTemplateOutlet=\"portalTab\"></ng-container>\n </a>\n\n <ng-template #portalTab>\n <i *ngIf=\"icon\" class=\"icon {{ icon }}\"></i>\n <span *ngIf=\"label\" class=\"tabLabel\">{{ label }}</span>\n <lx-badge *ngIf=\"counter\" [size]=\"counterBadgeSize\" [content]=\"counter\" [color]=\"'gray'\"></lx-badge>\n </ng-template>\n\n <ng-template cdkPortal #contentTemplate=\"cdkPortal\">\n <div *ngIf=\"!tabLink\" class=\"content\" role=\"tabpanel\" [attr.id]=\"tabPanelId\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n</li>\n", styles: [":host{display:inline-block}.tab{position:relative;display:inline-block;margin:0 8px;text-align:center;transition:border-bottom .5s;cursor:pointer}.tab:after{position:absolute;content:\"\";left:0;right:0;bottom:-1px;height:2px;background-color:transparent}.tab:hover:after,.tab.active:after{transition:background-color .1s;background-color:#1666ee;outline:0}.tab:hover,.tab.active{outline:0}.tab.active{cursor:default}.tab.disabled{opacity:.3;cursor:default}.tab:hover .tabLabel,.tab.active .tabLabel{color:#2a303d;transition:color .1s}.portalTab,.routerLinkTab a{display:inline-block;padding:8px 8px 12px;line-height:20px}.portalTab.withIcon,.routerLinkTab a.withIcon{padding:10px 14px;line-height:16px}.routerLinkTab a:focus{outline:0}.routerLinkTab.active a,.routerLinkTab.disabled a{cursor:default}.icon{font-size:16px;opacity:.6}.noMargin{margin:0}.noLeftMarginForFirstTab{margin-left:0}.backgroundGray{background-color:#c2c9d6}.backgroundGray:not(.active):not(.disabled){background-color:#cfd5df}.tabLabel{color:#61779d;display:inline-block;font-size:13px;text-decoration:none}.content{height:100%}lx-badge{margin-left:8px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BadgeComponent, selector: "lx-badge", inputs: ["content", "size", "color"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1.CdkPortal, selector: "[cdkPortal]", exportAs: ["cdkPortal"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
45
+ setFocus() {
46
+ this.tabElement?.nativeElement?.focus();
47
+ }
48
+ handleKeyDown(event) {
49
+ if (Object.values(LxTabGroupKeyCode).includes(event.code)) {
50
+ // Send this KeyDown event up to our parent to be handled there
51
+ this.keyDownAction.emit(event);
52
+ return;
53
+ }
54
+ const isKeyCodeToSelectFocusedTab = event.code === 'Enter' || event.code === 'Space';
55
+ if (!isKeyCodeToSelectFocusedTab) {
56
+ return;
57
+ }
58
+ /**
59
+ * We are preventing the default browser behavior when the `SPACE` key is pressed, in which
60
+ * case the browser would scroll down the page.
61
+ */
62
+ event.preventDefault();
63
+ if (this.tabLink) {
64
+ const formattedTabLink = typeof this.tabLink === 'string' ? [this.tabLink] : this.tabLink;
65
+ this.router.navigate(formattedTabLink, { relativeTo: this.activatedRoute }).then(() => {
66
+ this.select();
67
+ });
68
+ }
69
+ else {
70
+ this.select();
71
+ }
72
+ }
73
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TabComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
74
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TabComponent, isStandalone: true, selector: "lx-tab", inputs: { icon: "icon", label: "label", title: "title", tabLink: "tabLink", counter: "counter", routerLinkActiveOptions: "routerLinkActiveOptions", counterBadgeSize: "counterBadgeSize", noMargin: "noMargin", noLeftMarginForFirstTab: "noLeftMarginForFirstTab", background: "background", disabled: "disabled" }, outputs: { switch: "switch", keyDownAction: "keyDownAction" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["contentTemplate"], descendants: true, static: true }, { propertyName: "tabElement", first: true, predicate: ["tabElement"], descendants: true }, { propertyName: "routerLinkActive", first: true, predicate: RouterLinkActive, descendants: true }], ngImport: i0, template: "<li\n #tabElement\n class=\"tab\"\n [class.active]=\"isActive\"\n [class.withIcon]=\"icon\"\n [class.noMargin]=\"noMargin\"\n [class.noLeftMarginForFirstTab]=\"noLeftMarginForFirstTab\"\n [class.backgroundGray]=\"background === 'gray'\"\n [class.disabled]=\"disabled\"\n [class.portalTab]=\"!tabLink\"\n [class.routerLinkTab]=\"tabLink\"\n [attr.title]=\"title\"\n (click)=\"select()\"\n (keydown)=\"handleKeyDown($event)\"\n role=\"tab\"\n [attr.id]=\"tabId\"\n [attr.aria-selected]=\"isActive\"\n [attr.tabindex]=\"isActive ? '0' : '-1'\"\n>\n <a\n *ngIf=\"tabLink; else portalTab\"\n tabindex=\"-1\"\n [routerLink]=\"tabLink\"\n routerLinkActive\n [routerLinkActiveOptions]=\"routerLinkActiveOptions\"\n >\n <ng-container *ngTemplateOutlet=\"portalTab\"></ng-container>\n </a>\n\n <ng-template #portalTab>\n <i *ngIf=\"icon\" class=\"icon {{ icon }}\"></i>\n <span *ngIf=\"label\" class=\"tabLabel\">{{ label }}</span>\n <lx-badge *ngIf=\"counter\" [size]=\"counterBadgeSize\" [content]=\"counter\" [color]=\"'gray'\"></lx-badge>\n </ng-template>\n\n <ng-template cdkPortal #contentTemplate=\"cdkPortal\">\n <div *ngIf=\"!tabLink\" class=\"content\" role=\"tabpanel\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n</li>\n", styles: [":host{display:inline-block}.tab{position:relative;display:inline-block;margin:0 8px;text-align:center;transition:border-bottom .5s;cursor:pointer}.tab:after{position:absolute;content:\"\";left:0;right:0;bottom:-1px;height:2px;background-color:transparent}.tab:hover:after,.tab.active:after{transition:background-color .1s;background-color:#1666ee}.tab.active{cursor:default}.tab.disabled{opacity:.3;cursor:default}.tab:hover .tabLabel,.tab.active .tabLabel{color:#2a303d;transition:color .1s}.portalTab,.routerLinkTab a{display:inline-block;padding:8px 8px 12px;line-height:20px}.portalTab.withIcon,.routerLinkTab a.withIcon{padding:10px 14px;line-height:16px}.routerLinkTab a:focus{outline:0}.routerLinkTab.active a,.routerLinkTab.disabled a{cursor:default}.icon{font-size:16px;opacity:.6}.noMargin{margin:0}.noLeftMarginForFirstTab{margin-left:0}.backgroundGray{background-color:#c2c9d6}.backgroundGray:not(.active):not(.disabled){background-color:#cfd5df}.tabLabel{color:#61779d;display:inline-block;font-size:13px;text-decoration:none}.content{height:100%}lx-badge{margin-left:8px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BadgeComponent, selector: "lx-badge", inputs: ["content", "size", "color"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i2.CdkPortal, selector: "[cdkPortal]", exportAs: ["cdkPortal"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39
75
  }
76
+ __decorate([
77
+ Observe('routerLinkActive')
78
+ ], TabComponent.prototype, "routerLinkActive$", void 0);
40
79
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TabComponent, decorators: [{
41
80
  type: Component,
42
- args: [{ selector: 'lx-tab', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, RouterLinkActive, RouterLink, NgTemplateOutlet, BadgeComponent, PortalModule], template: "<li\n class=\"tab\"\n [class.active]=\"isActive\"\n [class.withIcon]=\"icon\"\n [class.noMargin]=\"noMargin\"\n [class.noLeftMarginForFirstTab]=\"noLeftMarginForFirstTab\"\n [class.backgroundGray]=\"background === 'gray'\"\n [class.disabled]=\"disabled\"\n [class.portalTab]=\"!tabLink\"\n [class.routerLinkTab]=\"tabLink\"\n [attr.title]=\"title\"\n (click)=\"select()\"\n (keyup.enter)=\"select()\"\n (keyup.space)=\"select()\"\n [attr.role]=\"tabLink ? 'presentation' : 'tab'\"\n [attr.id]=\"tabLink ? null : tabId\"\n [attr.aria-selected]=\"tabLink ? null : isActive\"\n [attr.aria-controls]=\"tabLink ? null : tabPanelId\"\n [attr.tabindex]=\"tabLink ? null : isActive || disabled || tabLink ? '-1' : '0'\"\n>\n <a\n *ngIf=\"tabLink; else portalTab\"\n role=\"tab\"\n [attr.id]=\"tabId\"\n [attr.aria-selected]=\"isActive\"\n [attr.aria-controls]=\"tabPanelId\"\n [routerLink]=\"tabLink\"\n routerLinkActive\n [routerLinkActiveOptions]=\"routerLinkActiveOptions\"\n >\n <ng-container *ngTemplateOutlet=\"portalTab\"></ng-container>\n </a>\n\n <ng-template #portalTab>\n <i *ngIf=\"icon\" class=\"icon {{ icon }}\"></i>\n <span *ngIf=\"label\" class=\"tabLabel\">{{ label }}</span>\n <lx-badge *ngIf=\"counter\" [size]=\"counterBadgeSize\" [content]=\"counter\" [color]=\"'gray'\"></lx-badge>\n </ng-template>\n\n <ng-template cdkPortal #contentTemplate=\"cdkPortal\">\n <div *ngIf=\"!tabLink\" class=\"content\" role=\"tabpanel\" [attr.id]=\"tabPanelId\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n</li>\n", styles: [":host{display:inline-block}.tab{position:relative;display:inline-block;margin:0 8px;text-align:center;transition:border-bottom .5s;cursor:pointer}.tab:after{position:absolute;content:\"\";left:0;right:0;bottom:-1px;height:2px;background-color:transparent}.tab:hover:after,.tab.active:after{transition:background-color .1s;background-color:#1666ee;outline:0}.tab:hover,.tab.active{outline:0}.tab.active{cursor:default}.tab.disabled{opacity:.3;cursor:default}.tab:hover .tabLabel,.tab.active .tabLabel{color:#2a303d;transition:color .1s}.portalTab,.routerLinkTab a{display:inline-block;padding:8px 8px 12px;line-height:20px}.portalTab.withIcon,.routerLinkTab a.withIcon{padding:10px 14px;line-height:16px}.routerLinkTab a:focus{outline:0}.routerLinkTab.active a,.routerLinkTab.disabled a{cursor:default}.icon{font-size:16px;opacity:.6}.noMargin{margin:0}.noLeftMarginForFirstTab{margin-left:0}.backgroundGray{background-color:#c2c9d6}.backgroundGray:not(.active):not(.disabled){background-color:#cfd5df}.tabLabel{color:#61779d;display:inline-block;font-size:13px;text-decoration:none}.content{height:100%}lx-badge{margin-left:8px}\n"] }]
43
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { icon: [{
81
+ args: [{ selector: 'lx-tab', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, RouterLinkActive, RouterLink, NgTemplateOutlet, BadgeComponent, PortalModule], template: "<li\n #tabElement\n class=\"tab\"\n [class.active]=\"isActive\"\n [class.withIcon]=\"icon\"\n [class.noMargin]=\"noMargin\"\n [class.noLeftMarginForFirstTab]=\"noLeftMarginForFirstTab\"\n [class.backgroundGray]=\"background === 'gray'\"\n [class.disabled]=\"disabled\"\n [class.portalTab]=\"!tabLink\"\n [class.routerLinkTab]=\"tabLink\"\n [attr.title]=\"title\"\n (click)=\"select()\"\n (keydown)=\"handleKeyDown($event)\"\n role=\"tab\"\n [attr.id]=\"tabId\"\n [attr.aria-selected]=\"isActive\"\n [attr.tabindex]=\"isActive ? '0' : '-1'\"\n>\n <a\n *ngIf=\"tabLink; else portalTab\"\n tabindex=\"-1\"\n [routerLink]=\"tabLink\"\n routerLinkActive\n [routerLinkActiveOptions]=\"routerLinkActiveOptions\"\n >\n <ng-container *ngTemplateOutlet=\"portalTab\"></ng-container>\n </a>\n\n <ng-template #portalTab>\n <i *ngIf=\"icon\" class=\"icon {{ icon }}\"></i>\n <span *ngIf=\"label\" class=\"tabLabel\">{{ label }}</span>\n <lx-badge *ngIf=\"counter\" [size]=\"counterBadgeSize\" [content]=\"counter\" [color]=\"'gray'\"></lx-badge>\n </ng-template>\n\n <ng-template cdkPortal #contentTemplate=\"cdkPortal\">\n <div *ngIf=\"!tabLink\" class=\"content\" role=\"tabpanel\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n</li>\n", styles: [":host{display:inline-block}.tab{position:relative;display:inline-block;margin:0 8px;text-align:center;transition:border-bottom .5s;cursor:pointer}.tab:after{position:absolute;content:\"\";left:0;right:0;bottom:-1px;height:2px;background-color:transparent}.tab:hover:after,.tab.active:after{transition:background-color .1s;background-color:#1666ee}.tab.active{cursor:default}.tab.disabled{opacity:.3;cursor:default}.tab:hover .tabLabel,.tab.active .tabLabel{color:#2a303d;transition:color .1s}.portalTab,.routerLinkTab a{display:inline-block;padding:8px 8px 12px;line-height:20px}.portalTab.withIcon,.routerLinkTab a.withIcon{padding:10px 14px;line-height:16px}.routerLinkTab a:focus{outline:0}.routerLinkTab.active a,.routerLinkTab.disabled a{cursor:default}.icon{font-size:16px;opacity:.6}.noMargin{margin:0}.noLeftMarginForFirstTab{margin-left:0}.backgroundGray{background-color:#c2c9d6}.backgroundGray:not(.active):not(.disabled){background-color:#cfd5df}.tabLabel{color:#61779d;display:inline-block;font-size:13px;text-decoration:none}.content{height:100%}lx-badge{margin-left:8px}\n"] }]
82
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.Router }, { type: i1.ActivatedRoute }], propDecorators: { icon: [{
44
83
  type: Input
45
84
  }], label: [{
46
85
  type: Input
@@ -64,11 +103,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImpor
64
103
  type: Input
65
104
  }], switch: [{
66
105
  type: Output
106
+ }], keyDownAction: [{
107
+ type: Output
67
108
  }], content: [{
68
109
  type: ViewChild,
69
110
  args: ['contentTemplate', { static: true }]
70
- }], routerLinkActive: [{
111
+ }], tabElement: [{
112
+ type: ViewChild,
113
+ args: ['tabElement']
114
+ }], routerLinkActive$: [], routerLinkActive: [{
71
115
  type: ViewChild,
72
116
  args: [RouterLinkActive]
73
117
  }] } });
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9zcmMvbGliL3RhYi11aS9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdGFiLXVpL2NvbXBvbmVudHMvdGFiL3RhYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1EQUFtRCxDQUFDOzs7QUFVbkYsTUFBTSxPQUFPLFlBQVk7SUEyQnZCLElBQUksUUFBUSxDQUFDLEtBQWM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFHRCxZQUFvQixFQUFxQjtRQUFyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQWpDaEMsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUluQiw0QkFBdUIsR0FBdUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDOUQscUJBQWdCLEdBQXdCLFNBQVMsQ0FBQztRQUNsRCxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUN6QyxlQUFVLEdBQXFCLE9BQU8sQ0FBQztRQUN2QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRXpCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBb0I5QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQzs4R0E5Q1UsWUFBWTtrR0FBWixZQUFZLG9qQkF5QlosZ0JBQWdCLGdEQ3hDN0IsNmpEQTZDQSxvcUNEaENZLElBQUksNkZBQUUsZ0JBQWdCLDhNQUFFLFVBQVUsNE5BQUUsZ0JBQWdCLG9KQUFFLGNBQWMsMEZBQUUsWUFBWTs7MkZBRWpGLFlBQVk7a0JBUnhCLFNBQVM7K0JBQ0UsUUFBUSxtQkFHRCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQztzRkFPcEYsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxNQUFNO3NCQUFmLE1BQU07Z0JBTVAsT0FBTztzQkFETixTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHakIsZ0JBQWdCO3NCQUE1QyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvcnRhbE1vZHVsZSwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJMaW5rLCBSb3V0ZXJMaW5rQWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnbG9kYXNoL2ZwJztcbmltcG9ydCB7IEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS11aS9jb21wb25lbnRzL2JhZGdlL2JhZGdlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x4LXRhYicsXG4gIHRlbXBsYXRlVXJsOiAndGFiLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3RhYi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIFJvdXRlckxpbmtBY3RpdmUsIFJvdXRlckxpbmssIE5nVGVtcGxhdGVPdXRsZXQsIEJhZGdlQ29tcG9uZW50LCBQb3J0YWxNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFRhYkNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWNvbiBpbnB1dCB0YWtlcyBhIGZvbnQgYXdlc29tZSBzZWxlY3RvclxuICAgKiBXQVJOSU5HOiBDdXJyZW50bHkgdGhpcyBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCB1c2luZyBhbiBpY29uIHRvZ2V0aGVyIHdpdGggYSBsYWJlbCBvciBjb3VudGVyLlxuICAgKi9cbiAgQElucHV0KCkgaWNvbj86IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgdGFiTGluaz86IHN0cmluZztcbiAgQElucHV0KCkgY291bnRlcj86IG51bWJlcjtcbiAgQElucHV0KCkgcm91dGVyTGlua0FjdGl2ZU9wdGlvbnM6IHsgZXhhY3Q6IGJvb2xlYW4gfSA9IHsgZXhhY3Q6IHRydWUgfTtcbiAgQElucHV0KCkgY291bnRlckJhZGdlU2l6ZTogJ2RlZmF1bHQnIHwgJ3NtYWxsJyA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgbm9NYXJnaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbm9MZWZ0TWFyZ2luRm9yRmlyc3RUYWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYmFja2dyb3VuZDogJ3doaXRlJyB8ICdncmF5JyA9ICd3aGl0ZSc7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHN3aXRjaCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICB0YWJQYW5lbElkOiBzdHJpbmc7XG4gIHRhYklkOiBzdHJpbmc7XG5cbiAgQFZpZXdDaGlsZCgnY29udGVudFRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgY29udGVudD86IFRlbXBsYXRlUG9ydGFsPGFueT47XG5cbiAgQFZpZXdDaGlsZChSb3V0ZXJMaW5rQWN0aXZlKSByb3V0ZXJMaW5rQWN0aXZlPzogUm91dGVyTGlua0FjdGl2ZTtcblxuICBzZXQgaXNBY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLnJvdXRlckxpbmtBY3RpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlckxpbmtBY3RpdmUuaXNBY3RpdmU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy50YWJQYW5lbElkID0gdW5pcXVlSWQoJ3BhbmVsSWQnKTtcbiAgICB0aGlzLnRhYklkID0gdW5pcXVlSWQoJ3RhYicpO1xuICB9XG5cbiAgc2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuc3dpdGNoLmVtaXQoeyB0YWJJZDogdGhpcy50YWJJZCwgdGFiUGFuZWxJZDogdGhpcy50YWJQYW5lbElkIH0pO1xuICB9XG59XG4iLCI8bGlcbiAgY2xhc3M9XCJ0YWJcIlxuICBbY2xhc3MuYWN0aXZlXT1cImlzQWN0aXZlXCJcbiAgW2NsYXNzLndpdGhJY29uXT1cImljb25cIlxuICBbY2xhc3Mubm9NYXJnaW5dPVwibm9NYXJnaW5cIlxuICBbY2xhc3Mubm9MZWZ0TWFyZ2luRm9yRmlyc3RUYWJdPVwibm9MZWZ0TWFyZ2luRm9yRmlyc3RUYWJcIlxuICBbY2xhc3MuYmFja2dyb3VuZEdyYXldPVwiYmFja2dyb3VuZCA9PT0gJ2dyYXknXCJcbiAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2NsYXNzLnBvcnRhbFRhYl09XCIhdGFiTGlua1wiXG4gIFtjbGFzcy5yb3V0ZXJMaW5rVGFiXT1cInRhYkxpbmtcIlxuICBbYXR0ci50aXRsZV09XCJ0aXRsZVwiXG4gIChjbGljayk9XCJzZWxlY3QoKVwiXG4gIChrZXl1cC5lbnRlcik9XCJzZWxlY3QoKVwiXG4gIChrZXl1cC5zcGFjZSk9XCJzZWxlY3QoKVwiXG4gIFthdHRyLnJvbGVdPVwidGFiTGluayA/ICdwcmVzZW50YXRpb24nIDogJ3RhYidcIlxuICBbYXR0ci5pZF09XCJ0YWJMaW5rID8gbnVsbCA6IHRhYklkXCJcbiAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJ0YWJMaW5rID8gbnVsbCA6IGlzQWN0aXZlXCJcbiAgW2F0dHIuYXJpYS1jb250cm9sc109XCJ0YWJMaW5rID8gbnVsbCA6IHRhYlBhbmVsSWRcIlxuICBbYXR0ci50YWJpbmRleF09XCJ0YWJMaW5rID8gbnVsbCA6IGlzQWN0aXZlIHx8IGRpc2FibGVkIHx8IHRhYkxpbmsgPyAnLTEnIDogJzAnXCJcbj5cbiAgPGFcbiAgICAqbmdJZj1cInRhYkxpbms7IGVsc2UgcG9ydGFsVGFiXCJcbiAgICByb2xlPVwidGFiXCJcbiAgICBbYXR0ci5pZF09XCJ0YWJJZFwiXG4gICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0FjdGl2ZVwiXG4gICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJ0YWJQYW5lbElkXCJcbiAgICBbcm91dGVyTGlua109XCJ0YWJMaW5rXCJcbiAgICByb3V0ZXJMaW5rQWN0aXZlXG4gICAgW3JvdXRlckxpbmtBY3RpdmVPcHRpb25zXT1cInJvdXRlckxpbmtBY3RpdmVPcHRpb25zXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwb3J0YWxUYWJcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9hPlxuXG4gIDxuZy10ZW1wbGF0ZSAjcG9ydGFsVGFiPlxuICAgIDxpICpuZ0lmPVwiaWNvblwiIGNsYXNzPVwiaWNvbiB7eyBpY29uIH19XCI+PC9pPlxuICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cInRhYkxhYmVsXCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgPGx4LWJhZGdlICpuZ0lmPVwiY291bnRlclwiIFtzaXplXT1cImNvdW50ZXJCYWRnZVNpemVcIiBbY29udGVudF09XCJjb3VudGVyXCIgW2NvbG9yXT1cIidncmF5J1wiPjwvbHgtYmFkZ2U+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIGNka1BvcnRhbCAjY29udGVudFRlbXBsYXRlPVwiY2RrUG9ydGFsXCI+XG4gICAgPGRpdiAqbmdJZj1cIiF0YWJMaW5rXCIgY2xhc3M9XCJjb250ZW50XCIgcm9sZT1cInRhYnBhbmVsXCIgW2F0dHIuaWRdPVwidGFiUGFuZWxJZFwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9saT5cbiJdfQ==
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9zcmMvbGliL3RhYi11aS9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdGFiLXVpL2NvbXBvbmVudHMvdGFiL3RhYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFJLE9BQU8sRUFBMEIsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7QUFVMUUsTUFBTSxPQUFPLFlBQVk7SUF3Q3ZCLElBQUksUUFBUSxDQUFDLEtBQWM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFHRCxZQUNVLEVBQXFCLEVBQ3JCLE1BQWMsRUFDZCxjQUE4QjtRQUY5QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBakQvQixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBU25CLDRCQUF1QixHQUF1QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxxQkFBZ0IsR0FBd0IsU0FBUyxDQUFDO1FBQ2xELGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBQ3pDLGVBQVUsR0FBcUIsT0FBTyxDQUFDO1FBQ3ZDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFekIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQTJCcEQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQU94QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUMvSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQW9CO1FBQ2hDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBUyxpQkFBaUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakUsK0RBQStEO1lBQy9ELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLE9BQU87U0FDUjtRQUVELE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7UUFDckYsSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ2hDLE9BQU87U0FDUjtRQUVEOzs7V0FHRztRQUNILEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUMxRixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNwRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDOzhHQTlGVSxZQUFZO2tHQUFaLFlBQVksK3FCQWlDWixnQkFBZ0IsZ0RDbkQ3QixreENBeUNBLHluQ0R6QlksSUFBSSw2RkFBRSxnQkFBZ0IsOE1BQUUsVUFBVSw0TkFBRSxnQkFBZ0Isb0pBQUUsY0FBYywwRkFBRSxZQUFZOztBQWtDL0Q7SUFBNUIsT0FBTyxDQUFDLGtCQUFrQixDQUFDO3VEQUFrRDsyRkFoQ25FLFlBQVk7a0JBUnhCLFNBQVM7K0JBQ0UsUUFBUSxtQkFHRCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQzt3SUFPcEYsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBTUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFLUCxPQUFPO3NCQUROLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBRU0saUJBQWlCLE1BQ2pCLGdCQUFnQjtzQkFBNUMsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb3J0YWxNb2R1bGUsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluaywgUm91dGVyTGlua0FjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB1bmlxdWVJZCB9IGZyb20gJ2xvZGFzaC9mcCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS11aS9jb21wb25lbnRzL2JhZGdlL2JhZGdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPYnNlcnZlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmUnO1xuaW1wb3J0IHsgTHhUYWJHcm91cEtleUNvZGUgfSBmcm9tICcuLi90YWItZ3JvdXAvdGFiLWdyb3VwLWtleS1jb2Rlcy5lbnVtJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHgtdGFiJyxcbiAgdGVtcGxhdGVVcmw6ICd0YWIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsndGFiLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdJZiwgUm91dGVyTGlua0FjdGl2ZSwgUm91dGVyTGluaywgTmdUZW1wbGF0ZU91dGxldCwgQmFkZ2VDb21wb25lbnQsIFBvcnRhbE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgVGFiQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpY29uIGlucHV0IHRha2VzIGEgZm9udCBhd2Vzb21lIHNlbGVjdG9yXG4gICAqIFdBUk5JTkc6IEN1cnJlbnRseSB0aGlzIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IHVzaW5nIGFuIGljb24gdG9nZXRoZXIgd2l0aCBhIGxhYmVsIG9yIGNvdW50ZXIuXG4gICAqL1xuICBASW5wdXQoKSBpY29uPzogc3RyaW5nO1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuICAvKipcbiAgICogSW4gc29tZSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb24sIHdlIGFyZSBwYXNzaW5nIGEgcGxhaW4gc3RyaW5nIHRvIHRoZSB0YWJMaW5rIGlucHV0LCB3aGVyZWFzIGluXG4gICAqIG1vc3QgcGFydHMsIHRoZSBpbnB1dCBpcyBwYXNzZWQgYXMgYW4gYXJyYXkuIFRoZSBSb3V0ZXJMaW5rIGRpcmVjdGl2ZSBhbHNvIGFjY2VwdHMgYm90aCB0eXBlcyxcbiAgICogdGhlcmVmb3JlIHdlIGFyZSB1c2luZyB0eXBlIG9mIHRoZSBpbnB1dCBhcyBzdHJpbmcgfCBhbnlbXS5cbiAgICovXG4gIEBJbnB1dCgpIHRhYkxpbms/OiBzdHJpbmcgfCBhbnlbXTtcbiAgQElucHV0KCkgY291bnRlcj86IG51bWJlcjtcbiAgQElucHV0KCkgcm91dGVyTGlua0FjdGl2ZU9wdGlvbnM6IHsgZXhhY3Q6IGJvb2xlYW4gfSA9IHsgZXhhY3Q6IHRydWUgfTtcbiAgQElucHV0KCkgY291bnRlckJhZGdlU2l6ZTogJ2RlZmF1bHQnIHwgJ3NtYWxsJyA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgbm9NYXJnaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbm9MZWZ0TWFyZ2luRm9yRmlyc3RUYWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYmFja2dyb3VuZDogJ3doaXRlJyB8ICdncmF5JyA9ICd3aGl0ZSc7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHN3aXRjaCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGtleURvd25BY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG5cbiAgdGFiSWQ6IHN0cmluZztcblxuICBAVmlld0NoaWxkKCdjb250ZW50VGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBjb250ZW50PzogVGVtcGxhdGVQb3J0YWw8YW55PjtcblxuICBAVmlld0NoaWxkKCd0YWJFbGVtZW50JykgdGFiRWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIEBPYnNlcnZlKCdyb3V0ZXJMaW5rQWN0aXZlJykgcm91dGVyTGlua0FjdGl2ZSQhOiBPYnNlcnZhYmxlPFJvdXRlckxpbmtBY3RpdmU+O1xuICBAVmlld0NoaWxkKFJvdXRlckxpbmtBY3RpdmUpIHJvdXRlckxpbmtBY3RpdmU/OiBSb3V0ZXJMaW5rQWN0aXZlO1xuICAvKipcbiAgICogVXNlZCBieSB0aGUgbHgtdGFiLWdyb3VwIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBseC10YWIgdGhhdCBpcyBhIGxpbmtcbiAgICogaXMgc2V0IHRvIGFjdGl2ZSBieSB0aGUgQW5ndWxhciByb3V0ZXIuXG4gICAqL1xuICByb3V0ZXJMaW5rQWN0aXZlQ2hhbmdlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBzZXQgaXNBY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLnJvdXRlckxpbmtBY3RpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlckxpbmtBY3RpdmUuaXNBY3RpdmU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG4gICAgdGhpcy50YWJJZCA9IHVuaXF1ZUlkKCd0YWInKTtcbiAgICB0aGlzLnJvdXRlckxpbmtBY3RpdmVDaGFuZ2UkID0gdGhpcy5yb3V0ZXJMaW5rQWN0aXZlJC5waXBlKHN3aXRjaE1hcCgocm91dGVyTGlua0FjdGl2ZSkgPT4gcm91dGVyTGlua0FjdGl2ZS5pc0FjdGl2ZUNoYW5nZSkpO1xuICB9XG5cbiAgc2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuc3dpdGNoLmVtaXQoKTtcbiAgfVxuXG4gIHNldEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMudGFiRWxlbWVudD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlczxzdHJpbmc+KEx4VGFiR3JvdXBLZXlDb2RlKS5pbmNsdWRlcyhldmVudC5jb2RlKSkge1xuICAgICAgLy8gU2VuZCB0aGlzIEtleURvd24gZXZlbnQgdXAgdG8gb3VyIHBhcmVudCB0byBiZSBoYW5kbGVkIHRoZXJlXG4gICAgICB0aGlzLmtleURvd25BY3Rpb24uZW1pdChldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXNLZXlDb2RlVG9TZWxlY3RGb2N1c2VkVGFiID0gZXZlbnQuY29kZSA9PT0gJ0VudGVyJyB8fCBldmVudC5jb2RlID09PSAnU3BhY2UnO1xuICAgIGlmICghaXNLZXlDb2RlVG9TZWxlY3RGb2N1c2VkVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2UgYXJlIHByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvciB3aGVuIHRoZSBgU1BBQ0VgIGtleSBpcyBwcmVzc2VkLCBpbiB3aGljaFxuICAgICAqIGNhc2UgdGhlIGJyb3dzZXIgd291bGQgc2Nyb2xsIGRvd24gdGhlIHBhZ2UuXG4gICAgICovXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy50YWJMaW5rKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRUYWJMaW5rID0gdHlwZW9mIHRoaXMudGFiTGluayA9PT0gJ3N0cmluZycgPyBbdGhpcy50YWJMaW5rXSA6IHRoaXMudGFiTGluaztcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKGZvcm1hdHRlZFRhYkxpbmssIHsgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3QoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGxpXG4gICN0YWJFbGVtZW50XG4gIGNsYXNzPVwidGFiXCJcbiAgW2NsYXNzLmFjdGl2ZV09XCJpc0FjdGl2ZVwiXG4gIFtjbGFzcy53aXRoSWNvbl09XCJpY29uXCJcbiAgW2NsYXNzLm5vTWFyZ2luXT1cIm5vTWFyZ2luXCJcbiAgW2NsYXNzLm5vTGVmdE1hcmdpbkZvckZpcnN0VGFiXT1cIm5vTGVmdE1hcmdpbkZvckZpcnN0VGFiXCJcbiAgW2NsYXNzLmJhY2tncm91bmRHcmF5XT1cImJhY2tncm91bmQgPT09ICdncmF5J1wiXG4gIFtjbGFzcy5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtjbGFzcy5wb3J0YWxUYWJdPVwiIXRhYkxpbmtcIlxuICBbY2xhc3Mucm91dGVyTGlua1RhYl09XCJ0YWJMaW5rXCJcbiAgW2F0dHIudGl0bGVdPVwidGl0bGVcIlxuICAoY2xpY2spPVwic2VsZWN0KClcIlxuICAoa2V5ZG93bik9XCJoYW5kbGVLZXlEb3duKCRldmVudClcIlxuICByb2xlPVwidGFiXCJcbiAgW2F0dHIuaWRdPVwidGFiSWRcIlxuICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzQWN0aXZlXCJcbiAgW2F0dHIudGFiaW5kZXhdPVwiaXNBY3RpdmUgPyAnMCcgOiAnLTEnXCJcbj5cbiAgPGFcbiAgICAqbmdJZj1cInRhYkxpbms7IGVsc2UgcG9ydGFsVGFiXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgICBbcm91dGVyTGlua109XCJ0YWJMaW5rXCJcbiAgICByb3V0ZXJMaW5rQWN0aXZlXG4gICAgW3JvdXRlckxpbmtBY3RpdmVPcHRpb25zXT1cInJvdXRlckxpbmtBY3RpdmVPcHRpb25zXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwb3J0YWxUYWJcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9hPlxuXG4gIDxuZy10ZW1wbGF0ZSAjcG9ydGFsVGFiPlxuICAgIDxpICpuZ0lmPVwiaWNvblwiIGNsYXNzPVwiaWNvbiB7eyBpY29uIH19XCI+PC9pPlxuICAgIDxzcGFuICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cInRhYkxhYmVsXCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgPGx4LWJhZGdlICpuZ0lmPVwiY291bnRlclwiIFtzaXplXT1cImNvdW50ZXJCYWRnZVNpemVcIiBbY29udGVudF09XCJjb3VudGVyXCIgW2NvbG9yXT1cIidncmF5J1wiPjwvbHgtYmFkZ2U+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIGNka1BvcnRhbCAjY29udGVudFRlbXBsYXRlPVwiY2RrUG9ydGFsXCI+XG4gICAgPGRpdiAqbmdJZj1cIiF0YWJMaW5rXCIgY2xhc3M9XCJjb250ZW50XCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2xpPlxuIl19
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Key codes that we listen to for
3
+ * user action on our lx-tab-group
4
+ */
5
+ export var LxTabGroupKeyCode;
6
+ (function (LxTabGroupKeyCode) {
7
+ LxTabGroupKeyCode["ArrowRight"] = "ArrowRight";
8
+ LxTabGroupKeyCode["ArrowLeft"] = "ArrowLeft";
9
+ LxTabGroupKeyCode["Home"] = "Home";
10
+ LxTabGroupKeyCode["End"] = "End";
11
+ })(LxTabGroupKeyCode || (LxTabGroupKeyCode = {}));
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdyb3VwLWtleS1jb2Rlcy5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdGFiLXVpL2NvbXBvbmVudHMvdGFiLWdyb3VwL3RhYi1ncm91cC1rZXktY29kZXMuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQU4sSUFBWSxpQkFLWDtBQUxELFdBQVksaUJBQWlCO0lBQzNCLDhDQUF5QixDQUFBO0lBQ3pCLDRDQUF1QixDQUFBO0lBQ3ZCLGtDQUFhLENBQUE7SUFDYixnQ0FBVyxDQUFBO0FBQ2IsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEtleSBjb2RlcyB0aGF0IHdlIGxpc3RlbiB0byBmb3JcbiAqIHVzZXIgYWN0aW9uIG9uIG91ciBseC10YWItZ3JvdXBcbiAqL1xuZXhwb3J0IGVudW0gTHhUYWJHcm91cEtleUNvZGUge1xuICBBcnJvd1JpZ2h0ID0gJ0Fycm93UmlnaHQnLFxuICBBcnJvd0xlZnQgPSAnQXJyb3dMZWZ0JyxcbiAgSG9tZSA9ICdIb21lJyxcbiAgRW5kID0gJ0VuZCdcbn1cbiJdfQ==
@@ -1,11 +1,17 @@
1
+ import { __decorate } from "tslib";
1
2
  import { PortalModule } from '@angular/cdk/portal';
2
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output } from '@angular/core';
3
+ import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
4
  import { Subject, merge } from 'rxjs';
4
- import { map, startWith, switchMap, takeUntil } from 'rxjs/operators';
5
+ import { first, map, startWith, switchMap, takeUntil } from 'rxjs/operators';
6
+ import { Observe } from '../../../shared/observe';
5
7
  import { TabComponent } from '../tab/tab.component';
8
+ import { LxTabGroupKeyCode } from './tab-group-key-codes.enum';
6
9
  import * as i0 from "@angular/core";
7
10
  import * as i1 from "@angular/cdk/portal";
8
11
  export class TabGroupComponent {
12
+ get tabIds() {
13
+ return this.tabs.map((t) => t.tabId);
14
+ }
9
15
  get tabs() {
10
16
  return this.tabsQueryList?.toArray() || [];
11
17
  }
@@ -15,9 +21,20 @@ export class TabGroupComponent {
15
21
  constructor(cd) {
16
22
  this.cd = cd;
17
23
  this.isCentered = false;
24
+ /**
25
+ * The tab whose content should be displayed.
26
+ */
18
27
  this.selectedIndex = 0;
19
28
  this.indexChange = new EventEmitter();
29
+ /**
30
+ * The tab that is currently focused via keyboard.
31
+ */
32
+ this.focusedIndex = 0;
20
33
  this.destroyed$ = new Subject();
34
+ this.listenToFirstTabSelectByAngularRouterForTabLinks().subscribe((tab) => {
35
+ // synchonize the focusedIndex and selectedIndex state with the tab that is active through the current route.
36
+ this.switchTo(tab);
37
+ });
21
38
  }
22
39
  ngOnChanges(changes) {
23
40
  const tab = this.tabs[this.selectedIndex];
@@ -30,7 +47,7 @@ export class TabGroupComponent {
30
47
  this.tabs[0].noLeftMarginForFirstTab = true;
31
48
  }
32
49
  const tab = this.tabs[this.selectedIndex];
33
- if (tab) {
50
+ if (tab && !tab.tabLink) {
34
51
  this.switchTo(tab);
35
52
  }
36
53
  const listenToTabsSwitch = (tabs) => merge(...tabs.map((tab) => tab.switch.asObservable().pipe(map(() => tab))));
@@ -39,37 +56,87 @@ export class TabGroupComponent {
39
56
  .subscribe((tab) => {
40
57
  this.switchTo(tab);
41
58
  });
59
+ this.tabsQueryList?.changes
60
+ .pipe(startWith(null), switchMap(() => merge(...this.tabs.map((tab) => tab.keyDownAction))), takeUntil(this.destroyed$))
61
+ .subscribe((event) => {
62
+ this.handleKeyDown(event);
63
+ });
42
64
  }
43
65
  ngOnDestroy() {
44
66
  this.destroyed$.next();
45
67
  }
46
- tabIds() {
47
- return this.tabs.map((t) => t.tabId);
68
+ onFocusOut(event) {
69
+ if (!this.tabListElement?.nativeElement?.contains(event.relatedTarget)) {
70
+ // resync focused index on selected index when leaving tabs
71
+ this.focusedIndex = this.selectedIndex;
72
+ }
48
73
  }
49
74
  switchTo(tab) {
50
75
  this.tabsQueryList?.forEach((t, index) => {
51
76
  t.isActive = t === tab;
52
77
  if (t.isActive) {
53
78
  this.selectedIndex = index;
79
+ this.focusedIndex = index;
54
80
  this.indexChange.emit(index);
55
81
  }
56
82
  });
57
83
  this.cd.markForCheck();
58
84
  }
85
+ handleKeyDown(event) {
86
+ switch (event.code) {
87
+ case LxTabGroupKeyCode.ArrowRight:
88
+ const newTabIndex = (this.focusedIndex + 1) % this.tabs.length;
89
+ this.focusTab(newTabIndex);
90
+ break;
91
+ case LxTabGroupKeyCode.ArrowLeft:
92
+ const previousTabIndex = this.focusedIndex === 0 ? this.tabs.length - 1 : this.focusedIndex - 1;
93
+ this.focusTab(previousTabIndex);
94
+ break;
95
+ case LxTabGroupKeyCode.Home:
96
+ event.preventDefault();
97
+ this.focusTab(0);
98
+ break;
99
+ case LxTabGroupKeyCode.End:
100
+ event.preventDefault();
101
+ this.focusTab(this.tabs.length - 1);
102
+ break;
103
+ }
104
+ }
105
+ focusTab(tabIndex) {
106
+ const tab = this.tabs[tabIndex];
107
+ if (!tab) {
108
+ return;
109
+ }
110
+ tab.setFocus();
111
+ this.focusedIndex = tabIndex;
112
+ }
113
+ listenToFirstTabSelectByAngularRouterForTabLinks() {
114
+ return this.tabsQueryList$.pipe(switchMap(() => {
115
+ const tabLinks = this.tabs.filter((tab) => !!tab.tabLink);
116
+ return merge(...tabLinks.map((tab) => tab.routerLinkActiveChange$.pipe(map(() => tab))));
117
+ }), first(), takeUntil(this.destroyed$) // added in addition to first() here since for tab groups without links no single value will ever be emit.
118
+ );
119
+ }
59
120
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TabGroupComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
60
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TabGroupComponent, isStandalone: true, selector: "lx-tab-group", inputs: { isCentered: "isCentered", selectedIndex: "selectedIndex" }, outputs: { indexChange: "indexChange" }, queries: [{ propertyName: "tabsQueryList", predicate: TabComponent }], usesOnChanges: true, ngImport: i0, template: "<ul class=\"tabs\" role=\"tablist\" [attr.aria-owns]=\"tabIds().join(' ')\" [class.centered]=\"isCentered\">\n <ng-content></ng-content>\n</ul>\n\n<ng-template [cdkPortalOutlet]=\"activeTabPortal\"></ng-template>\n", styles: [".tabs{display:inline-block;list-style:none;border-bottom:solid 1px #cfd5df;width:100%;margin:0;padding:0}.tabs.centered{text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.2", type: TabGroupComponent, isStandalone: true, selector: "lx-tab-group", inputs: { isCentered: "isCentered", selectedIndex: "selectedIndex" }, outputs: { indexChange: "indexChange" }, queries: [{ propertyName: "tabsQueryList", predicate: TabComponent }], viewQueries: [{ propertyName: "tabListElement", first: true, predicate: ["tabListElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ul\n #tabListElement\n class=\"tabs\"\n role=\"tablist\"\n (focusout)=\"onFocusOut($event)\"\n [attr.aria-owns]=\"tabIds.join(' ')\"\n [class.centered]=\"isCentered\"\n>\n <ng-content></ng-content>\n</ul>\n\n<ng-template [cdkPortalOutlet]=\"activeTabPortal\"></ng-template>\n", styles: [":host{--tab-group-padding-y: 0}.tabs{display:inline-block;list-style:none;border-bottom:solid 1px #cfd5df;width:100%;margin:0;padding:0 var(--tab-group-padding-y);text-align:left}.tabs.centered{text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
61
122
  }
123
+ __decorate([
124
+ Observe('tabsQueryList')
125
+ ], TabGroupComponent.prototype, "tabsQueryList$", void 0);
62
126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: TabGroupComponent, decorators: [{
63
127
  type: Component,
64
- args: [{ selector: 'lx-tab-group', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [PortalModule], template: "<ul class=\"tabs\" role=\"tablist\" [attr.aria-owns]=\"tabIds().join(' ')\" [class.centered]=\"isCentered\">\n <ng-content></ng-content>\n</ul>\n\n<ng-template [cdkPortalOutlet]=\"activeTabPortal\"></ng-template>\n", styles: [".tabs{display:inline-block;list-style:none;border-bottom:solid 1px #cfd5df;width:100%;margin:0;padding:0}.tabs.centered{text-align:center}\n"] }]
128
+ args: [{ selector: 'lx-tab-group', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [PortalModule], template: "<ul\n #tabListElement\n class=\"tabs\"\n role=\"tablist\"\n (focusout)=\"onFocusOut($event)\"\n [attr.aria-owns]=\"tabIds.join(' ')\"\n [class.centered]=\"isCentered\"\n>\n <ng-content></ng-content>\n</ul>\n\n<ng-template [cdkPortalOutlet]=\"activeTabPortal\"></ng-template>\n", styles: [":host{--tab-group-padding-y: 0}.tabs{display:inline-block;list-style:none;border-bottom:solid 1px #cfd5df;width:100%;margin:0;padding:0 var(--tab-group-padding-y);text-align:left}.tabs.centered{text-align:center}\n"] }]
65
129
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { isCentered: [{
66
130
  type: Input
67
131
  }], selectedIndex: [{
68
132
  type: Input
69
133
  }], indexChange: [{
70
134
  type: Output
71
- }], tabsQueryList: [{
135
+ }], tabsQueryList$: [], tabsQueryList: [{
72
136
  type: ContentChildren,
73
137
  args: [TabComponent]
138
+ }], tabListElement: [{
139
+ type: ViewChild,
140
+ args: ['tabListElement']
74
141
  }] } });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9zcmMvbGliL3RhYi11aS9jb21wb25lbnRzL3RhYi1ncm91cC90YWItZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdGFiLXVpL2NvbXBvbmVudHMvdGFiLWdyb3VwL3RhYi1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQVVwRCxNQUFNLE9BQU8saUJBQWlCO0lBTzVCLElBQVksSUFBSTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNoRCxDQUFDO0lBSUQsWUFBb0IsRUFBcUI7UUFBckIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFoQmhDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7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QixhQUFhO3NCQUEzQyxlQUFlO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb3J0YWxNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUYWJDb21wb25lbnQgfSBmcm9tICcuLi90YWIvdGFiLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x4LXRhYi1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAndGFiLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3RhYi1ncm91cC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1BvcnRhbE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgVGFiR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGlzQ2VudGVyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWRJbmRleDogbnVtYmVyID0gMDtcbiAgQE91dHB1dCgpIGluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJDb21wb25lbnQpIHRhYnNRdWVyeUxpc3Q/OiBRdWVyeUxpc3Q8VGFiQ29tcG9uZW50PjtcblxuICBwcml2YXRlIGdldCB0YWJzKCk6IFRhYkNvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy50YWJzUXVlcnlMaXN0Py50b0FycmF5KCkgfHwgW107XG4gIH1cblxuICBnZXQgYWN0aXZlVGFiUG9ydGFsKCkge1xuICAgIHJldHVybiB0aGlzLnRhYnNbdGhpcy5zZWxlY3RlZEluZGV4XT8uY29udGVudDtcbiAgfVxuXG4gIHJlYWRvbmx5IGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCB0YWIgPSB0aGlzLnRhYnNbdGhpcy5zZWxlY3RlZEluZGV4XTtcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRJbmRleCddICYmICFjaGFuZ2VzWydzZWxlY3RlZEluZGV4J10uaXNGaXJzdENoYW5nZSgpICYmIHRhYikge1xuICAgICAgdGhpcy5zd2l0Y2hUbyh0YWIpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy50YWJzWzBdKSB7XG4gICAgICB0aGlzLnRhYnNbMF0ubm9MZWZ0TWFyZ2luRm9yRmlyc3RUYWIgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0YWIgPSB0aGlzLnRhYnNbdGhpcy5zZWxlY3RlZEluZGV4XTtcbiAgICBpZiAodGFiKSB7XG4gICAgICB0aGlzLnN3aXRjaFRvKHRhYik7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdGVuVG9UYWJzU3dpdGNoID0gKHRhYnM6IFRhYkNvbXBvbmVudFtdKSA9PiBtZXJnZSguLi50YWJzLm1hcCgodGFiKSA9PiB0YWIuc3dpdGNoLmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKCgpID0+IHRhYikpKSk7XG5cbiAgICB0aGlzLnRhYnNRdWVyeUxpc3Q/LmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiBsaXN0ZW5Ub1RhYnNTd2l0Y2godGhpcy50YWJzKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh0YWIpID0+IHtcbiAgICAgICAgdGhpcy5zd2l0Y2hUbyh0YWIpO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICB9XG5cbiAgdGFiSWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy50YWJzLm1hcCgodCkgPT4gdC50YWJJZCk7XG4gIH1cblxuICBzd2l0Y2hUbyh0YWI6IFRhYkNvbXBvbmVudCkge1xuICAgIHRoaXMudGFic1F1ZXJ5TGlzdD8uZm9yRWFjaCgodCwgaW5kZXgpID0+IHtcbiAgICAgIHQuaXNBY3RpdmUgPSB0ID09PSB0YWI7XG4gICAgICBpZiAodC5pc0FjdGl2ZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5pbmRleENoYW5nZS5lbWl0KGluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8dWwgY2xhc3M9XCJ0YWJzXCIgcm9sZT1cInRhYmxpc3RcIiBbYXR0ci5hcmlhLW93bnNdPVwidGFiSWRzKCkuam9pbignICcpXCIgW2NsYXNzLmNlbnRlcmVkXT1cImlzQ2VudGVyZWRcIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC91bD5cblxuPG5nLXRlbXBsYXRlIFtjZGtQb3J0YWxPdXRsZXRdPVwiYWN0aXZlVGFiUG9ydGFsXCI+PC9uZy10ZW1wbGF0ZT5cbiJdfQ==
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9zcmMvbGliL3RhYi11aS9jb21wb25lbnRzL3RhYi1ncm91cC90YWItZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdGFiLXVpL2NvbXBvbmVudHMvdGFiLWdyb3VwL3RhYi1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFVL0QsTUFBTSxPQUFPLGlCQUFpQjtJQWlCNUIsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFZLElBQUk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUs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QUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0YsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxFQUFFLEVBQ1AsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQywwR0FBMEc7U0FDdEksQ0FBQztJQUNKLENBQUM7OEdBM0lVLGlCQUFpQjtrR0FBakIsaUJBQWlCLHFOQVNYLFlBQVksb0tDeEMvQiw2UkFZQSwrUURpQlksWUFBWTs7QUFVSTtJQUF6QixPQUFPLENBQUMsZUFBZSxDQUFDO3lEQUFzRDsyRkFScEUsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNFLGNBQWMsbUJBR1AsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7c0ZBR2QsVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBRW1CLGNBQWMsTUFDVCxhQUFhO3NCQUEzQyxlQUFlO3VCQUFDLFlBQVk7Z0JBQ0EsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb3J0YWxNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpcnN0LCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmUnO1xuaW1wb3J0IHsgVGFiQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFiL3RhYi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTHhUYWJHcm91cEtleUNvZGUgfSBmcm9tICcuL3RhYi1ncm91cC1rZXktY29kZXMuZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x4LXRhYi1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAndGFiLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3RhYi1ncm91cC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1BvcnRhbE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgVGFiR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGlzQ2VudGVyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSB0YWIgd2hvc2UgY29udGVudCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRJbmRleDogbnVtYmVyID0gMDtcbiAgQE91dHB1dCgpIGluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE9ic2VydmUoJ3RhYnNRdWVyeUxpc3QnKSB0YWJzUXVlcnlMaXN0JCE6IE9ic2VydmFibGU8UXVlcnlMaXN0PFRhYkNvbXBvbmVudD4+O1xuICBAQ29udGVudENoaWxkcmVuKFRhYkNvbXBvbmVudCkgdGFic1F1ZXJ5TGlzdD86IFF1ZXJ5TGlzdDxUYWJDb21wb25lbnQ+O1xuICBAVmlld0NoaWxkKCd0YWJMaXN0RWxlbWVudCcpIHRhYkxpc3RFbGVtZW50PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIFRoZSB0YWIgdGhhdCBpcyBjdXJyZW50bHkgZm9jdXNlZCB2aWEga2V5Ym9hcmQuXG4gICAqL1xuICBmb2N1c2VkSW5kZXg6IG51bWJlciA9IDA7XG5cbiAgZ2V0IHRhYklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudGFicy5tYXAoKHQpID0+IHQudGFiSWQpO1xuICB9XG4gIHByaXZhdGUgZ2V0IHRhYnMoKTogVGFiQ29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLnRhYnNRdWVyeUxpc3Q/LnRvQXJyYXkoKSB8fCBbXTtcbiAgfVxuXG4gIGdldCBhY3RpdmVUYWJQb3J0YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLnNlbGVjdGVkSW5kZXhdPy5jb250ZW50O1xuICB9XG5cbiAgcmVhZG9ubHkgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB0aGlzLmxpc3RlblRvRmlyc3RUYWJTZWxlY3RCeUFuZ3VsYXJSb3V0ZXJGb3JUYWJMaW5rcygpLnN1YnNjcmliZSgodGFiKSA9PiB7XG4gICAgICAvLyBzeW5jaG9uaXplIHRoZSBmb2N1c2VkSW5kZXggYW5kIHNlbGVjdGVkSW5kZXggc3RhdGUgd2l0aCB0aGUgdGFiIHRoYXQgaXMgYWN0aXZlIHRocm91Z2ggdGhlIGN1cnJlbnQgcm91dGUuXG4gICAgICB0aGlzLnN3aXRjaFRvKHRhYik7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgdGFiID0gdGhpcy50YWJzW3RoaXMuc2VsZWN0ZWRJbmRleF07XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSW5kZXgnXSAmJiAhY2hhbmdlc1snc2VsZWN0ZWRJbmRleCddLmlzRmlyc3RDaGFuZ2UoKSAmJiB0YWIpIHtcbiAgICAgIHRoaXMuc3dpdGNoVG8odGFiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMudGFic1swXSkge1xuICAgICAgdGhpcy50YWJzWzBdLm5vTGVmdE1hcmdpbkZvckZpcnN0VGFiID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdGFiID0gdGhpcy50YWJzW3RoaXMuc2VsZWN0ZWRJbmRleF07XG4gICAgaWYgKHRhYiAmJiAhdGFiLnRhYkxpbmspIHtcbiAgICAgIHRoaXMuc3dpdGNoVG8odGFiKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5Ub1RhYnNTd2l0Y2ggPSAodGFiczogVGFiQ29tcG9uZW50W10pID0+IG1lcmdlKC4uLnRhYnMubWFwKCh0YWIpID0+IHRhYi5zd2l0Y2guYXNPYnNlcnZhYmxlKCkucGlwZShtYXAoKCkgPT4gdGFiKSkpKTtcblxuICAgIHRoaXMudGFic1F1ZXJ5TGlzdD8uY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IGxpc3RlblRvVGFic1N3aXRjaCh0aGlzLnRhYnMpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHRhYikgPT4ge1xuICAgICAgICB0aGlzLnN3aXRjaFRvKHRhYik7XG4gICAgICB9KTtcblxuICAgIHRoaXMudGFic1F1ZXJ5TGlzdD8uY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IG1lcmdlKC4uLnRoaXMudGFicy5tYXAoKHRhYikgPT4gdGFiLmtleURvd25BY3Rpb24pKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUtleURvd24oZXZlbnQpO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICB9XG5cbiAgb25Gb2N1c091dChldmVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLnRhYkxpc3RFbGVtZW50Py5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgLy8gcmVzeW5jIGZvY3VzZWQgaW5kZXggb24gc2VsZWN0ZWQgaW5kZXggd2hlbiBsZWF2aW5nIHRhYnNcbiAgICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHN3aXRjaFRvKHRhYjogVGFiQ29tcG9uZW50KSB7XG4gICAgdGhpcy50YWJzUXVlcnlMaXN0Py5mb3JFYWNoKCh0LCBpbmRleCkgPT4ge1xuICAgICAgdC5pc0FjdGl2ZSA9IHQgPT09IHRhYjtcbiAgICAgIGlmICh0LmlzQWN0aXZlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmluZGV4Q2hhbmdlLmVtaXQoaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlIEx4VGFiR3JvdXBLZXlDb2RlLkFycm93UmlnaHQ6XG4gICAgICAgIGNvbnN0IG5ld1RhYkluZGV4ID0gKHRoaXMuZm9jdXNlZEluZGV4ICsgMSkgJSB0aGlzLnRhYnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmZvY3VzVGFiKG5ld1RhYkluZGV4KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEx4VGFiR3JvdXBLZXlDb2RlLkFycm93TGVmdDpcbiAgICAgICAgY29uc3QgcHJldmlvdXNUYWJJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4ID09PSAwID8gdGhpcy50YWJzLmxlbmd0aCAtIDEgOiB0aGlzLmZvY3VzZWRJbmRleCAtIDE7XG4gICAgICAgIHRoaXMuZm9jdXNUYWIocHJldmlvdXNUYWJJbmRleCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMeFRhYkdyb3VwS2V5Q29kZS5Ib21lOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzVGFiKDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTHhUYWJHcm91cEtleUNvZGUuRW5kOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzVGFiKHRoaXMudGFicy5sZW5ndGggLSAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c1RhYih0YWJJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGFiID0gdGhpcy50YWJzW3RhYkluZGV4XTtcbiAgICBpZiAoIXRhYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRhYi5zZXRGb2N1cygpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gdGFiSW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRvRmlyc3RUYWJTZWxlY3RCeUFuZ3VsYXJSb3V0ZXJGb3JUYWJMaW5rcygpIHtcbiAgICByZXR1cm4gdGhpcy50YWJzUXVlcnlMaXN0JC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgY29uc3QgdGFiTGlua3MgPSB0aGlzLnRhYnMuZmlsdGVyKCh0YWIpID0+ICEhdGFiLnRhYkxpbmspO1xuICAgICAgICByZXR1cm4gbWVyZ2UoLi4udGFiTGlua3MubWFwKCh0YWIpID0+IHRhYi5yb3V0ZXJMaW5rQWN0aXZlQ2hhbmdlJC5waXBlKG1hcCgoKSA9PiB0YWIpKSkpO1xuICAgICAgfSksXG4gICAgICBmaXJzdCgpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkgLy8gYWRkZWQgaW4gYWRkaXRpb24gdG8gZmlyc3QoKSBoZXJlIHNpbmNlIGZvciB0YWIgZ3JvdXBzIHdpdGhvdXQgbGlua3Mgbm8gc2luZ2xlIHZhbHVlIHdpbGwgZXZlciBiZSBlbWl0LlxuICAgICk7XG4gIH1cbn1cbiIsIjx1bFxuICAjdGFiTGlzdEVsZW1lbnRcbiAgY2xhc3M9XCJ0YWJzXCJcbiAgcm9sZT1cInRhYmxpc3RcIlxuICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCJcbiAgW2F0dHIuYXJpYS1vd25zXT1cInRhYklkcy5qb2luKCcgJylcIlxuICBbY2xhc3MuY2VudGVyZWRdPVwiaXNDZW50ZXJlZFwiXG4+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvdWw+XG5cbjxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT1cImFjdGl2ZVRhYlBvcnRhbFwiPjwvbmctdGVtcGxhdGU+XG4iXX0=