carbon-components-angular
Version:
Next generation components
243 lines • 19.2 kB
JavaScript
import { Component, Input, Output, EventEmitter, ContentChildren, ContentChild } from "@angular/core";
import { Tab } from "./tab.component";
import { TabHeaders } from "./tab-headers.component";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "./tab-headers.component";
import * as i3 from "./tab-skeleton.component";
/**
* Build out your application's tabs using this component.
* This is the parent of the `Tab` and `TabHeader` components.
*
* [See demo](../../?path=/story/components-tabs--basic)
*
* `Tabs` expects a set of `n-tab` elements
*
* ```html
* <cds-tabs>
* <cds-tab heading='tab1'>
* tab 1 content
* </cds-tab>
* <cds-tab heading='tab1'>
* tab 2 content
* </cds-tab>
* <!-- ... -->
* <cds-tab heading='tab1'>
* tab n content
* </cds-tab>
* </cds-tabs>
* ```
*/
export class Tabs {
constructor() {
/**
* Takes either `top` or `bottom` to place `TabHeader` relative to the tab panels.
*/
this.position = "top";
/**
* Set to `true` to have `Tab` items cached and not reloaded on tab switching.
*/
this.cacheActive = false;
/**
* Set to 'true' to have tabs automatically activated and have their content displayed when they receive focus.
*/
this.followFocus = true;
/**
* When `true`, sets each tab panel `tabindex` to `-1` for navigation-style usage.
*/
this.isNavigation = false;
/**
* Visual style of the tab headers: `line` or `contained`.
*/
this.type = "line";
/**
* Theme for tab headers: `light` or `dark`.
*/
this.theme = "dark";
/**
* When `true`, renders the tabs skeleton loading state.
*/
this.skeleton = false;
/**
* Evenly sized tabs across the row (contained, fewer than 9 tabs).
*/
this.fullWidth = false;
/**
* Show a close control on each tab.
*/
this.dismissable = false;
/**
* Scroll the active tab into view on focus/select.
*/
this.scrollIntoView = false;
/**
* Debounce (ms) for tab list scroll events; affects overflow chevron updates.
*/
this.scrollDebounceWait = 200;
/**
* Emits when a tab close control is used (with `dismissable`).
* The emitted value is the tab index.
*/
this.tabClose = new EventEmitter();
}
/**
* After content is initialized update `Tab`s to cache (if turned on) and set the initial
* selected Tab item.
*/
ngAfterContentInit() {
if (this.tabHeaders) {
this.tabHeaders.cacheActive = this.cacheActive;
}
this.tabs.forEach(tab => {
tab.tabIndex = this.isNavigation ? null : 0;
});
}
ngOnChanges(changes) {
if (this.tabHeaders && changes.cacheActive) {
this.tabHeaders.cacheActive = this.cacheActive;
}
if (this.tabs && changes.isNavigation) {
this.tabs.forEach(tab => {
tab.tabIndex = this.isNavigation ? null : 0;
});
}
}
/**
* true if the cds-tab's are passed directly to the component as children
*/
hasTabHeaders() {
return this.tabs.length > 0;
}
}
Tabs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tabs, deps: [], target: i0.ɵɵFactoryTarget.Component });
Tabs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Tabs, selector: "cds-tabs, ibm-tabs", inputs: { position: "position", cacheActive: "cacheActive", followFocus: "followFocus", isNavigation: "isNavigation", ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby", type: "type", theme: "theme", skeleton: "skeleton", iconSize: "iconSize", fullWidth: "fullWidth", dismissable: "dismissable", scrollIntoView: "scrollIntoView", scrollDebounceWait: "scrollDebounceWait" }, outputs: { tabClose: "tabClose" }, queries: [{ propertyName: "tabHeaders", first: true, predicate: TabHeaders, descendants: true }, { propertyName: "tabs", predicate: Tab }], usesOnChanges: true, ngImport: i0, template: `
<ng-container *ngIf="skeleton">
<cds-tabs-skeleton [contained]="type === 'contained'"></cds-tabs-skeleton>
</ng-container>
<ng-container *ngIf="!skeleton">
<cds-tab-headers
*ngIf="hasTabHeaders() && position === 'top'"
[]="theme"
[]="tabs"
[]="followFocus"
[]="cacheActive"
[]="before"
[]="after"
[]="ariaLabel"
[]="ariaLabelledby"
[]="type"
[]="iconSize"
[]="fullWidth"
[]="dismissable"
[]="scrollIntoView"
[]="scrollDebounceWait"
(tabClose)="tabClose.emit($event)">
</cds-tab-headers>
<ng-content></ng-content>
<ng-template
<ng-content select="[before]"></ng-content>
</ng-template>
<ng-template
<ng-content select="[after]"></ng-content>
</ng-template>
<cds-tab-headers
*ngIf="hasTabHeaders() && position === 'bottom'"
[]="tabs"
[]="cacheActive"
[]="type"
[]="iconSize"
[]="fullWidth"
[]="dismissable"
[]="scrollIntoView"
[]="scrollDebounceWait"
(tabClose)="tabClose.emit($event)">
</cds-tab-headers>
</ng-container>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TabHeaders, selector: "cds-tab-headers, ibm-tab-headers", inputs: ["tabs", "translations"], outputs: ["tabClose"] }, { kind: "component", type: i3.TabSkeleton, selector: "cds-tabs-skeleton, ibm-tabs-skeleton", inputs: ["numOftabs", "contained"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tabs, decorators: [{
type: Component,
args: [{
selector: "cds-tabs, ibm-tabs",
template: `
<ng-container *ngIf="skeleton">
<cds-tabs-skeleton [contained]="type === 'contained'"></cds-tabs-skeleton>
</ng-container>
<ng-container *ngIf="!skeleton">
<cds-tab-headers
*ngIf="hasTabHeaders() && position === 'top'"
[]="theme"
[]="tabs"
[]="followFocus"
[]="cacheActive"
[]="before"
[]="after"
[]="ariaLabel"
[]="ariaLabelledby"
[]="type"
[]="iconSize"
[]="fullWidth"
[]="dismissable"
[]="scrollIntoView"
[]="scrollDebounceWait"
(tabClose)="tabClose.emit($event)">
</cds-tab-headers>
<ng-content></ng-content>
<ng-template
<ng-content select="[before]"></ng-content>
</ng-template>
<ng-template
<ng-content select="[after]"></ng-content>
</ng-template>
<cds-tab-headers
*ngIf="hasTabHeaders() && position === 'bottom'"
[]="tabs"
[]="cacheActive"
[]="type"
[]="iconSize"
[]="fullWidth"
[]="dismissable"
[]="scrollIntoView"
[]="scrollDebounceWait"
(tabClose)="tabClose.emit($event)">
</cds-tab-headers>
</ng-container>
`
}]
}], propDecorators: { position: [{
type: Input
}], cacheActive: [{
type: Input
}], followFocus: [{
type: Input
}], isNavigation: [{
type: Input
}], ariaLabel: [{
type: Input
}], ariaLabelledby: [{
type: Input
}], type: [{
type: Input
}], theme: [{
type: Input
}], skeleton: [{
type: Input
}], iconSize: [{
type: Input
}], fullWidth: [{
type: Input
}], dismissable: [{
type: Input
}], scrollIntoView: [{
type: Input
}], scrollDebounceWait: [{
type: Input
}], tabClose: [{
type: Output
}], tabs: [{
type: ContentChildren,
args: [Tab, { descendants: false }]
}], tabHeaders: [{
type: ContentChild,
args: [TabHeaders]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFicy90YWJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGVBQWUsRUFHZixZQUFZLEVBR1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFnREgsTUFBTSxPQUFPLElBQUk7SUEvQ2pCO1FBZ0RDOztXQUVHO1FBQ00sYUFBUSxHQUFxQixLQUFLLENBQUM7UUFDNUM7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUM3Qjs7V0FFRztRQUNNLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzVCOztXQUVHO1FBQ00saUJBQVksR0FBRyxLQUFLLENBQUM7UUFTOUI7O1dBRUc7UUFDTSxTQUFJLEdBQXlCLE1BQU0sQ0FBQztRQUM3Qzs7V0FFRztRQUNNLFVBQUssR0FBcUIsTUFBTSxDQUFDO1FBQzFDOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUsxQjs7V0FFRztRQUNNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDM0I7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUM3Qjs7V0FFRztRQUNNLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ2hDOztXQUVHO1FBQ00sdUJBQWtCLEdBQUcsR0FBRyxDQUFDO1FBRWxDOzs7V0FHRztRQUNPLGFBQVEsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztLQTJDdEU7SUFoQ0E7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUMvQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1NBQ0g7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7aUdBeEdXLElBQUk7cUZBQUosSUFBSSxpZ0JBdUVGLFVBQVUsMERBSlAsR0FBRyxrREFoSFY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyQ1Q7MkZBRVcsSUFBSTtrQkEvQ2hCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMkNUO2lCQUNEOzhCQUtTLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFNSSxRQUFRO3NCQUFqQixNQUFNO2dCQUt1QyxJQUFJO3NCQUFqRCxlQUFlO3VCQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBSWxCLFVBQVU7c0JBQW5DLFlBQVk7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0SW5wdXQsXG5cdE91dHB1dCxcblx0RXZlbnRFbWl0dGVyLFxuXHRDb250ZW50Q2hpbGRyZW4sXG5cdFF1ZXJ5TGlzdCxcblx0QWZ0ZXJDb250ZW50SW5pdCxcblx0Q29udGVudENoaWxkLFxuXHRPbkNoYW5nZXMsXG5cdFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFRhYiB9IGZyb20gXCIuL3RhYi5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRhYkhlYWRlcnMgfSBmcm9tIFwiLi90YWItaGVhZGVycy5jb21wb25lbnRcIjtcblxuLyoqXG4gKiBCdWlsZCBvdXQgeW91ciBhcHBsaWNhdGlvbidzIHRhYnMgdXNpbmcgdGhpcyBjb21wb25lbnQuXG4gKiBUaGlzIGlzIHRoZSBwYXJlbnQgb2YgdGhlIGBUYWJgIGFuZCBgVGFiSGVhZGVyYCBjb21wb25lbnRzLlxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtdGFicy0tYmFzaWMpXG4gKlxuICogYFRhYnNgIGV4cGVjdHMgYSBzZXQgb2YgYG4tdGFiYCBlbGVtZW50c1xuICpcbiAqIGBgYGh0bWxcbiAqIDxjZHMtdGFicz5cbiAqIFx0PGNkcy10YWIgaGVhZGluZz0ndGFiMSc+XG4gKiBcdFx0dGFiIDEgY29udGVudFxuICogXHQ8L2Nkcy10YWI+XG4gKiBcdDxjZHMtdGFiIGhlYWRpbmc9J3RhYjEnPlxuICogXHRcdHRhYiAyIGNvbnRlbnRcbiAqIFx0PC9jZHMtdGFiPlxuICogXHQ8IS0tIC4uLiAtLT5cbiAqIFx0PGNkcy10YWIgaGVhZGluZz0ndGFiMSc+XG4gKiBcdFx0dGFiIG4gY29udGVudFxuICogXHQ8L2Nkcy10YWI+XG4gKiA8L2Nkcy10YWJzPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtdGFicywgaWJtLXRhYnNcIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25cIj5cblx0XHRcdDxjZHMtdGFicy1za2VsZXRvbiBbY29udGFpbmVkXT1cInR5cGUgPT09ICdjb250YWluZWQnXCI+PC9jZHMtdGFicy1za2VsZXRvbj5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uXCI+XG5cdFx0XHQ8Y2RzLXRhYi1oZWFkZXJzXG5cdFx0XHRcdCpuZ0lmPVwiaGFzVGFiSGVhZGVycygpICYmIHBvc2l0aW9uID09PSAndG9wJ1wiXG5cdFx0XHRcdFt0aGVtZV09XCJ0aGVtZVwiXG5cdFx0XHRcdFt0YWJzXT1cInRhYnNcIlxuXHRcdFx0XHRbZm9sbG93Rm9jdXNdPVwiZm9sbG93Rm9jdXNcIlxuXHRcdFx0XHRbY2FjaGVBY3RpdmVdPVwiY2FjaGVBY3RpdmVcIlxuXHRcdFx0XHRbY29udGVudEJlZm9yZV09XCJiZWZvcmVcIlxuXHRcdFx0XHRbY29udGVudEFmdGVyXT1cImFmdGVyXCJcblx0XHRcdFx0W2FyaWFMYWJlbF09XCJhcmlhTGFiZWxcIlxuXHRcdFx0XHRbYXJpYUxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkYnlcIlxuXHRcdFx0XHRbdHlwZV09XCJ0eXBlXCJcblx0XHRcdFx0W2ljb25TaXplXT1cImljb25TaXplXCJcblx0XHRcdFx0W2Z1bGxXaWR0aF09XCJmdWxsV2lkdGhcIlxuXHRcdFx0XHRbZGlzbWlzc2FibGVdPVwiZGlzbWlzc2FibGVcIlxuXHRcdFx0XHRbc2Nyb2xsSW50b1ZpZXddPVwic2Nyb2xsSW50b1ZpZXdcIlxuXHRcdFx0XHRbc2Nyb2xsRGVib3VuY2VXYWl0XT1cInNjcm9sbERlYm91bmNlV2FpdFwiXG5cdFx0XHRcdCh0YWJDbG9zZSk9XCJ0YWJDbG9zZS5lbWl0KCRldmVudClcIj5cblx0XHRcdDwvY2RzLXRhYi1oZWFkZXJzPlxuXHRcdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRcdFx0PG5nLXRlbXBsYXRlICNiZWZvcmU+XG5cdFx0XHRcdDxuZy1jb250ZW50IHNlbGVjdD1cIltiZWZvcmVdXCI+PC9uZy1jb250ZW50PlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDxuZy10ZW1wbGF0ZSAjYWZ0ZXI+XG5cdFx0XHRcdDxuZy1jb250ZW50IHNlbGVjdD1cIlthZnRlcl1cIj48L25nLWNvbnRlbnQ+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PGNkcy10YWItaGVhZGVyc1xuXHRcdFx0XHQqbmdJZj1cImhhc1RhYkhlYWRlcnMoKSAmJiBwb3NpdGlvbiA9PT0gJ2JvdHRvbSdcIlxuXHRcdFx0XHRbdGFic109XCJ0YWJzXCJcblx0XHRcdFx0W2NhY2hlQWN0aXZlXT1cImNhY2hlQWN0aXZlXCJcblx0XHRcdFx0W3R5cGVdPVwidHlwZVwiXG5cdFx0XHRcdFtpY29uU2l6ZV09XCJpY29uU2l6ZVwiXG5cdFx0XHRcdFtmdWxsV2lkdGhdPVwiZnVsbFdpZHRoXCJcblx0XHRcdFx0W2Rpc21pc3NhYmxlXT1cImRpc21pc3NhYmxlXCJcblx0XHRcdFx0W3Njcm9sbEludG9WaWV3XT1cInNjcm9sbEludG9WaWV3XCJcblx0XHRcdFx0W3Njcm9sbERlYm91bmNlV2FpdF09XCJzY3JvbGxEZWJvdW5jZVdhaXRcIlxuXHRcdFx0XHQodGFiQ2xvc2UpPVwidGFiQ2xvc2UuZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHQ8L2Nkcy10YWItaGVhZGVycz5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcblx0LyoqXG5cdCAqIFRha2VzIGVpdGhlciBgdG9wYCBvciBgYm90dG9tYCB0byBwbGFjZSBgVGFiSGVhZGVyYCByZWxhdGl2ZSB0byB0aGUgdGFiIHBhbmVscy5cblx0ICovXG5cdEBJbnB1dCgpIHBvc2l0aW9uOiBcInRvcFwiIHwgXCJib3R0b21cIiA9IFwidG9wXCI7XG5cdC8qKlxuXHQgKiBTZXQgdG8gYHRydWVgIHRvIGhhdmUgYFRhYmAgaXRlbXMgY2FjaGVkIGFuZCBub3QgcmVsb2FkZWQgb24gdGFiIHN3aXRjaGluZy5cblx0ICovXG5cdEBJbnB1dCgpIGNhY2hlQWN0aXZlID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBTZXQgdG8gJ3RydWUnIHRvIGhhdmUgdGFicyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZCBhbmQgaGF2ZSB0aGVpciBjb250ZW50IGRpc3BsYXllZCB3aGVuIHRoZXkgcmVjZWl2ZSBmb2N1cy5cblx0ICovXG5cdEBJbnB1dCgpIGZvbGxvd0ZvY3VzID0gdHJ1ZTtcblx0LyoqXG5cdCAqIFdoZW4gYHRydWVgLCBzZXRzIGVhY2ggdGFiIHBhbmVsIGB0YWJpbmRleGAgdG8gYC0xYCBmb3IgbmF2aWdhdGlvbi1zdHlsZSB1c2FnZS5cblx0ICovXG5cdEBJbnB1dCgpIGlzTmF2aWdhdGlvbiA9IGZhbHNlO1xuXHQvKipcblx0ICogU2V0cyB0aGUgYXJpYSBsYWJlbCBvbiB0aGUgYFRhYkhlYWRlcmBzIG5hdiBlbGVtZW50LlxuXHQgKi9cblx0QElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhcmlhIGxhYmVsbGVkYnkgb24gdGhlIGBUYWJIZWFkZXJgcyBuYXYgZWxlbWVudC5cblx0ICovXG5cdEBJbnB1dCgpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBWaXN1YWwgc3R5bGUgb2YgdGhlIHRhYiBoZWFkZXJzOiBgbGluZWAgb3IgYGNvbnRhaW5lZGAuXG5cdCAqL1xuXHRASW5wdXQoKSB0eXBlOiBcImxpbmVcIiB8IFwiY29udGFpbmVkXCIgPSBcImxpbmVcIjtcblx0LyoqXG5cdCAqIFRoZW1lIGZvciB0YWIgaGVhZGVyczogYGxpZ2h0YCBvciBgZGFya2AuXG5cdCAqL1xuXHRASW5wdXQoKSB0aGVtZTogXCJsaWdodFwiIHwgXCJkYXJrXCIgPSBcImRhcmtcIjtcblx0LyoqXG5cdCAqIFdoZW4gYHRydWVgLCByZW5kZXJzIHRoZSB0YWJzIHNrZWxldG9uIGxvYWRpbmcgc3RhdGUuXG5cdCAqL1xuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXHQvKipcblx0ICogV2hlbiB1c2luZyBpY29uLW9ubHkgdGFicywgaWNvbiBzaXplOiBgZGVmYXVsdGAgKDE2cHgpIG9yIGBsZ2AgKDIwcHgpLlxuXHQgKi9cblx0QElucHV0KCkgaWNvblNpemU6IFwiZGVmYXVsdFwiIHwgXCJsZ1wiO1xuXHQvKipcblx0ICogRXZlbmx5IHNpemVkIHRhYnMgYWNyb3NzIHRoZSByb3cgKGNvbnRhaW5lZCwgZmV3ZXIgdGhhbiA5IHRhYnMpLlxuXHQgKi9cblx0QElucHV0KCkgZnVsbFdpZHRoID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBTaG93IGEgY2xvc2UgY29udHJvbCBvbiBlYWNoIHRhYi5cblx0ICovXG5cdEBJbnB1dCgpIGRpc21pc3NhYmxlID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIGFjdGl2ZSB0YWIgaW50byB2aWV3IG9uIGZvY3VzL3NlbGVjdC5cblx0ICovXG5cdEBJbnB1dCgpIHNjcm9sbEludG9WaWV3ID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBEZWJvdW5jZSAobXMpIGZvciB0YWIgbGlzdCBzY3JvbGwgZXZlbnRzOyBhZmZlY3RzIG92ZXJmbG93IGNoZXZyb24gdXBkYXRlcy5cblx0ICovXG5cdEBJbnB1dCgpIHNjcm9sbERlYm91bmNlV2FpdCA9IDIwMDtcblxuXHQvKipcblx0ICogRW1pdHMgd2hlbiBhIHRhYiBjbG9zZSBjb250cm9sIGlzIHVzZWQgKHdpdGggYGRpc21pc3NhYmxlYCkuXG5cdCAqIFRoZSBlbWl0dGVkIHZhbHVlIGlzIHRoZSB0YWIgaW5kZXguXG5cdCAqL1xuXHRAT3V0cHV0KCkgdGFiQ2xvc2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cblx0LyoqXG5cdCAqIE1haW50YWlucyBhIGBRdWVyeUxpc3RgIG9mIHRoZSBgVGFiYCBlbGVtZW50cyBhbmQgdXBkYXRlcyBpZiBgVGFiYHMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuXG5cdCAqL1xuXHRAQ29udGVudENoaWxkcmVuKFRhYiwgeyBkZXNjZW5kYW50czogZmFsc2UgfSkgdGFiczogUXVlcnlMaXN0PFRhYj47XG5cdC8qKlxuXHQgKiBDb250ZW50IGNoaWxkIG9mIHRoZSBwcm9qZWN0ZWQgaGVhZGVyIGNvbXBvbmVudFxuXHQgKi9cblx0QENvbnRlbnRDaGlsZChUYWJIZWFkZXJzKSB0YWJIZWFkZXJzO1xuXG5cdC8qKlxuXHQgKiBBZnRlciBjb250ZW50IGlzIGluaXRpYWxpemVkIHVwZGF0ZSBgVGFiYHMgdG8gY2FjaGUgKGlmIHR1cm5lZCBvbikgYW5kIHNldCB0aGUgaW5pdGlhbFxuXHQgKiBzZWxlY3RlZCBUYWIgaXRlbS5cblx0ICovXG5cdG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcblx0XHRpZiAodGhpcy50YWJIZWFkZXJzKSB7XG5cdFx0XHR0aGlzLnRhYkhlYWRlcnMuY2FjaGVBY3RpdmUgPSB0aGlzLmNhY2hlQWN0aXZlO1xuXHRcdH1cblxuXHRcdHRoaXMudGFicy5mb3JFYWNoKHRhYiA9PiB7XG5cdFx0XHR0YWIudGFiSW5kZXggPSB0aGlzLmlzTmF2aWdhdGlvbiA/IG51bGwgOiAwO1xuXHRcdH0pO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmICh0aGlzLnRhYkhlYWRlcnMgJiYgY2hhbmdlcy5jYWNoZUFjdGl2ZSkge1xuXHRcdFx0dGhpcy50YWJIZWFkZXJzLmNhY2hlQWN0aXZlID0gdGhpcy5jYWNoZUFjdGl2ZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy50YWJzICYmIGNoYW5nZXMuaXNOYXZpZ2F0aW9uKSB7XG5cdFx0XHR0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuXHRcdFx0XHR0YWIudGFiSW5kZXggPSB0aGlzLmlzTmF2aWdhdGlvbiA/IG51bGwgOiAwO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIHRydWUgaWYgdGhlIGNkcy10YWIncyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQgYXMgY2hpbGRyZW5cblx0ICovXG5cdGhhc1RhYkhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMudGFicy5sZW5ndGggPiAwO1xuXHR9XG59XG4iXX0=