UNPKG

@blox/material

Version:

Material Components for Angular

141 lines 21.3 kB
import { ContentChildren, EventEmitter, Directive, ElementRef, HostBinding, Output, HostListener, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { Subject } from 'rxjs'; import { MDCTabBarFoundation } from '@material/tab-bar'; import { MdcTabScrollerDirective } from './mdc.tab.scroller.directive'; import { takeUntil } from 'rxjs/operators'; /** * Directive for a tab bar. This directive must have an `mdcTabScroller` as only child. */ export class MdcTabBarDirective { constructor(_el, doc) { this._el = _el; /** @internal */ this._cls = true; /** @internal */ this._role = 'tablist'; this.onDestroy$ = new Subject(); this.onTabsChange$ = new Subject(); /** * Event emitted when the active tab changes. */ this.tabChange = new EventEmitter(); this._adapter = { scrollTo: (scrollX) => this._scroller._foundation.scrollTo(scrollX), incrementScroll: (scrollXIncrement) => this._scroller._foundation.incrementScroll(scrollXIncrement), getScrollPosition: () => this._scroller._foundation.getScrollPosition(), getScrollContentWidth: () => this._scroller._getScrollContentWidth(), getOffsetWidth: () => this._el.nativeElement.offsetWidth, isRTL: () => getComputedStyle(this._el.nativeElement).getPropertyValue('direction') === 'rtl', setActiveTab: (index) => this._foundation.activateTab(index), activateTabAtIndex: (index, clientRect) => this._tabs.toArray()[index]._activate(index, clientRect), deactivateTabAtIndex: (index) => this._tabs.toArray()[index]._deactivate(), focusTabAtIndex: (index) => this._tabs.toArray()[index]._focus(), getTabIndicatorClientRectAtIndex: (index) => this._tabs.toArray()[index]._computeIndicatorClientRect(), getTabDimensionsAtIndex: (index) => this._tabs.toArray()[index]._computeDimensions(), getPreviousActiveTabIndex: () => this._tabs.toArray().findIndex(e => e.isActive()), getFocusedTabIndex: () => this._tabs.map(t => t._root.nativeElement).indexOf(this.document.activeElement), getIndexOfTabById: () => -1, getTabListLength: () => this._tabs.length, notifyTabActivated: (tabIndex) => this.tabChange.emit({ tab: this._tabs.toArray()[tabIndex], tabIndex }) }; this._subscriptions = []; this._foundation = null; this.document = doc; } ngAfterContentInit() { let scrollersObservable$ = this._scrollers.changes.pipe(takeUntil(this.onDestroy$)); const tabChangeInit = () => { if (this._tabs) { this._tabs.changes.pipe(takeUntil(scrollersObservable$), takeUntil(this.onDestroy$)).subscribe(() => { this.onTabsChange$.next(); }); } }; scrollersObservable$.subscribe(() => { this.onTabsChange$.next(); tabChangeInit(); }); tabChangeInit(); this.onTabsChange$.pipe(takeUntil(this.onDestroy$)).subscribe(() => { this.destroyFoundation(); if (this._tabs) this.initFoundation(); }); if (this._tabs) this.initFoundation(); } ngOnDestroy() { this.onTabsChange$.complete(); this.onDestroy$.next(); this.onDestroy$.complete(); this.destroyFoundation(); } initFoundation() { this._foundation = new MDCTabBarFoundation(this._adapter); this._foundation.init(); this._listenTabSelected(); } destroyFoundation() { this._unlistenTabSelected(); let destroy = this._foundation != null; if (destroy) { this._foundation.destroy(); } this._foundation = null; return destroy; } _listenTabSelected() { var _a; this._unlistenTabSelected(); this._subscriptions = new Array(); (_a = this._tabs) === null || _a === void 0 ? void 0 : _a.forEach(tab => { this._subscriptions.push(tab.activationRequest$.subscribe(activated => { if (activated) this._setActive(tab); })); }); } _unlistenTabSelected() { this._subscriptions.forEach(sub => sub.unsubscribe()); this._subscriptions = []; } _setActive(tab) { if (this._foundation && this._tabs) { let index = this._tabs.toArray().indexOf(tab); // This is what foundation.handleTabInteraction would do, but more accessible, without // the need for assigned tabIds: if (index >= 0) this._adapter.setActiveTab(index); } } /** @internal */ _handleInteraction(event) { if (this._foundation) this._foundation.handleKeyDown(event); } get _scroller() { return this._scrollers && this._scrollers.length > 0 ? this._scrollers.first : null; } get _tabs() { return this._scroller ? this._scroller._tabs : null; } } MdcTabBarDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcTabBar]' },] } ]; MdcTabBarDirective.ctorParameters = () => [ { type: ElementRef }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; MdcTabBarDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-tab-bar',] }], _role: [{ type: HostBinding, args: ['attr.role',] }], _scrollers: [{ type: ContentChildren, args: [MdcTabScrollerDirective,] }], tabChange: [{ type: Output }], _handleInteraction: [{ type: HostListener, args: ['keydown', ['$event'],] }] }; export const TAB_BAR_DIRECTIVES = [MdcTabBarDirective]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnRhYi5iYXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGFiL21kYy50YWIuYmFyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUMxRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sa0JBQWtCO0lBb0MzQixZQUFtQixHQUFlLEVBQW9CLEdBQVE7UUFBM0MsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQW5DbEMsZ0JBQWdCO1FBQzJCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFFdkQsZ0JBQWdCO1FBQ1UsVUFBSyxHQUFHLFNBQVMsQ0FBQztRQUNwQyxlQUFVLEdBQWlCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDekMsa0JBQWEsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUdwRDs7V0FFRztRQUNnQixjQUFTLEdBQStCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdEUsYUFBUSxHQUFxQjtZQUNqQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckUsZUFBZSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBWSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyRyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLFdBQVksQ0FBQyxpQkFBaUIsRUFBRTtZQUN6RSxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLHNCQUFzQixFQUFFO1lBQ3JFLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQTZCLENBQUMsV0FBVztZQUN6RSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxLQUFLO1lBQzdGLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQzdELGtCQUFrQixFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQztZQUNwRyxvQkFBb0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDM0UsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUNqRSxnQ0FBZ0MsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQywyQkFBMkIsRUFBRztZQUN4Ryx1QkFBdUIsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsRUFBRztZQUN0Rix5QkFBeUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuRixrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQzFHLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLE1BQU07WUFDMUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFDLENBQUM7U0FDMUcsQ0FBQztRQUNNLG1CQUFjLEdBQW1CLEVBQUUsQ0FBQztRQUNwQyxnQkFBVyxHQUErQixJQUFJLENBQUM7UUFHbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFlLENBQUM7SUFDcEMsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNyRixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDbkIsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDOUQsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDTCxDQUFDLENBQUE7UUFDRCxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUIsYUFBYSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxhQUFhLEVBQUUsQ0FBQztRQUVoQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDbkIsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDN0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSztnQkFDVixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ1YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sY0FBYztRQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztRQUN2QyxJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksQ0FBQyxXQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDL0I7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRU8sa0JBQWtCOztRQUN0QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksS0FBSyxFQUFnQixDQUFDO1FBQ2hELE1BQUEsSUFBSSxDQUFDLEtBQUssMENBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ25FLElBQUksU0FBUztvQkFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEVBQUU7SUFDUCxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLFVBQVUsQ0FBQyxHQUE0QjtRQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxzRkFBc0Y7WUFDdEYsZ0NBQWdDO1lBQ2hDLElBQUksS0FBSyxJQUFJLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ3FCLGtCQUFrQixDQUFDLEtBQW9CO1FBQ3hFLElBQUksSUFBSSxDQUFDLFdBQVc7WUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQVksU0FBUztRQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hGLENBQUM7SUFFRCxJQUFZLEtBQUs7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEQsQ0FBQzs7O1lBbklKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsYUFBYTthQUMxQjs7O1lBZDZELFVBQVU7NENBbUQvQixNQUFNLFNBQUMsUUFBUTs7O21CQWxDbkQsV0FBVyxTQUFDLG1CQUFtQjtvQkFHL0IsV0FBVyxTQUFDLFdBQVc7eUJBSXZCLGVBQWUsU0FBQyx1QkFBdUI7d0JBSXZDLE1BQU07aUNBd0dOLFlBQVksU0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0FBY3ZDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRlbnRDaGlsZHJlbiwgRXZlbnRFbWl0dGVyLCBRdWVyeUxpc3QsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIE91dHB1dCwgSG9zdExpc3RlbmVyLFxuICAgIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1EQ1RhYkJhckZvdW5kYXRpb24sIE1EQ1RhYkJhckFkYXB0ZXIgfSBmcm9tICdAbWF0ZXJpYWwvdGFiLWJhcic7XG5pbXBvcnQgeyBBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZSwgTWRjVGFiQ2hhbmdlIH0gZnJvbSAnLi9tZGMudGFiLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNZGNUYWJTY3JvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4vbWRjLnRhYi5zY3JvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgYSB0YWIgYmFyLiBUaGlzIGRpcmVjdGl2ZSBtdXN0IGhhdmUgYW4gYG1kY1RhYlNjcm9sbGVyYCBhcyBvbmx5IGNoaWxkLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNUYWJCYXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBNZGNUYWJCYXJEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy10YWItYmFyJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG4gICAgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQ7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJykgX3JvbGUgPSAndGFibGlzdCc7XG4gICAgcHJpdmF0ZSBvbkRlc3Ryb3kkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIHByaXZhdGUgb25UYWJzQ2hhbmdlJDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZGNUYWJTY3JvbGxlckRpcmVjdGl2ZSkgX3Njcm9sbGVycz86IFF1ZXJ5TGlzdDxNZGNUYWJTY3JvbGxlckRpcmVjdGl2ZT47XG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHRhYkNoYW5nZTogRXZlbnRFbWl0dGVyPE1kY1RhYkNoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfYWRhcHRlcjogTURDVGFiQmFyQWRhcHRlciA9IHtcbiAgICAgICAgc2Nyb2xsVG86IChzY3JvbGxYKSA9PiB0aGlzLl9zY3JvbGxlciEuX2ZvdW5kYXRpb24hLnNjcm9sbFRvKHNjcm9sbFgpLFxuICAgICAgICBpbmNyZW1lbnRTY3JvbGw6IChzY3JvbGxYSW5jcmVtZW50KSA9PiB0aGlzLl9zY3JvbGxlciEuX2ZvdW5kYXRpb24hLmluY3JlbWVudFNjcm9sbChzY3JvbGxYSW5jcmVtZW50KSxcbiAgICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHRoaXMuX3Njcm9sbGVyIS5fZm91bmRhdGlvbiEuZ2V0U2Nyb2xsUG9zaXRpb24oKSxcbiAgICAgICAgZ2V0U2Nyb2xsQ29udGVudFdpZHRoOiAoKSA9PiB0aGlzLl9zY3JvbGxlciEuX2dldFNjcm9sbENvbnRlbnRXaWR0aCgpLFxuICAgICAgICBnZXRPZmZzZXRXaWR0aDogKCkgPT4gKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoLFxuICAgICAgICBpc1JUTDogKCkgPT4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCcsXG4gICAgICAgIHNldEFjdGl2ZVRhYjogKGluZGV4KSA9PiB0aGlzLl9mb3VuZGF0aW9uIS5hY3RpdmF0ZVRhYihpbmRleCksXG4gICAgICAgIGFjdGl2YXRlVGFiQXRJbmRleDogKGluZGV4LCBjbGllbnRSZWN0KSA9PiB0aGlzLl90YWJzIS50b0FycmF5KClbaW5kZXhdLl9hY3RpdmF0ZShpbmRleCwgY2xpZW50UmVjdCksXG4gICAgICAgIGRlYWN0aXZhdGVUYWJBdEluZGV4OiAoaW5kZXgpID0+IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVtpbmRleF0uX2RlYWN0aXZhdGUoKSxcbiAgICAgICAgZm9jdXNUYWJBdEluZGV4OiAoaW5kZXgpID0+IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVtpbmRleF0uX2ZvY3VzKCksXG4gICAgICAgIGdldFRhYkluZGljYXRvckNsaWVudFJlY3RBdEluZGV4OiAoaW5kZXgpID0+IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVtpbmRleF0uX2NvbXB1dGVJbmRpY2F0b3JDbGllbnRSZWN0KCkhLFxuICAgICAgICBnZXRUYWJEaW1lbnNpb25zQXRJbmRleDogKGluZGV4KSA9PiB0aGlzLl90YWJzIS50b0FycmF5KClbaW5kZXhdLl9jb21wdXRlRGltZW5zaW9ucygpISxcbiAgICAgICAgZ2V0UHJldmlvdXNBY3RpdmVUYWJJbmRleDogKCkgPT4gdGhpcy5fdGFicyEudG9BcnJheSgpLmZpbmRJbmRleChlID0+IGUuaXNBY3RpdmUoKSksXG4gICAgICAgIGdldEZvY3VzZWRUYWJJbmRleDogKCkgPT4gdGhpcy5fdGFicyEubWFwKHQgPT4gdC5fcm9vdC5uYXRpdmVFbGVtZW50KS5pbmRleE9mKHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksXG4gICAgICAgIGdldEluZGV4T2ZUYWJCeUlkOiAoKSA9PiAtMSwgLy8gd2UncmUgbm90IHVzaW5nIHRoZSBpZCdzLCBhbmQgbm90aGluZyBzaG91bGQgY2FsbCBnZXRJbmRleE9mVGFiQnlJZFxuICAgICAgICBnZXRUYWJMaXN0TGVuZ3RoOiAoKSA9PiB0aGlzLl90YWJzIS5sZW5ndGgsXG4gICAgICAgIG5vdGlmeVRhYkFjdGl2YXRlZDogKHRhYkluZGV4KSA9PiB0aGlzLnRhYkNoYW5nZS5lbWl0KHt0YWI6IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVt0YWJJbmRleF0sIHRhYkluZGV4fSlcbiAgICB9O1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBfZm91bmRhdGlvbjogTURDVGFiQmFyRm91bmRhdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIF9lbDogRWxlbWVudFJlZiwgQEluamVjdChET0NVTUVOVCkgZG9jOiBhbnkpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudCA9IGRvYyBhcyBEb2N1bWVudDtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIGxldCBzY3JvbGxlcnNPYnNlcnZhYmxlJCA9IHRoaXMuX3Njcm9sbGVycyEuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKTtcbiAgICAgICAgY29uc3QgdGFiQ2hhbmdlSW5pdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFicy5jaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChzY3JvbGxlcnNPYnNlcnZhYmxlJCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uVGFic0NoYW5nZSQubmV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjcm9sbGVyc09ic2VydmFibGUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVGFic0NoYW5nZSQubmV4dCgpO1xuICAgICAgICAgICAgdGFiQ2hhbmdlSW5pdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGFiQ2hhbmdlSW5pdCgpO1xuXG4gICAgICAgIHRoaXMub25UYWJzQ2hhbmdlJC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcbiAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Rm91bmRhdGlvbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnMpXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Rm91bmRhdGlvbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMpXG4gICAgICAgICAgICB0aGlzLmluaXRGb3VuZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMub25UYWJzQ2hhbmdlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpOyB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95Rm91bmRhdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZvdW5kYXRpb24oKSB7XG4gICAgICAgIHRoaXMuX2ZvdW5kYXRpb24gPSBuZXcgTURDVGFiQmFyRm91bmRhdGlvbih0aGlzLl9hZGFwdGVyKTtcbiAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5pbml0KCk7XG4gICAgICAgIHRoaXMuX2xpc3RlblRhYlNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95Rm91bmRhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW5UYWJTZWxlY3RlZCgpO1xuICAgICAgICBsZXQgZGVzdHJveSA9IHRoaXMuX2ZvdW5kYXRpb24gIT0gbnVsbDtcbiAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvdW5kYXRpb24hLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb3VuZGF0aW9uID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3k7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbGlzdGVuVGFiU2VsZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuVGFiU2VsZWN0ZWQoKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheTxTdWJzY3JpcHRpb24+KCk7XG4gICAgICAgIHRoaXMuX3RhYnM/LmZvckVhY2godGFiID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMhLnB1c2godGFiLmFjdGl2YXRpb25SZXF1ZXN0JC5zdWJzY3JpYmUoYWN0aXZhdGVkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdGVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRBY3RpdmUodGFiKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdW5saXN0ZW5UYWJTZWxlY3RlZCgpIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRBY3RpdmUodGFiOiBBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZSkge1xuICAgICAgICBpZiAodGhpcy5fZm91bmRhdGlvbiAmJiB0aGlzLl90YWJzKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLl90YWJzLnRvQXJyYXkoKS5pbmRleE9mKHRhYik7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHdoYXQgZm91bmRhdGlvbi5oYW5kbGVUYWJJbnRlcmFjdGlvbiB3b3VsZCBkbywgYnV0IG1vcmUgYWNjZXNzaWJsZSwgd2l0aG91dFxuICAgICAgICAgICAgLy8gdGhlIG5lZWQgZm9yIGFzc2lnbmVkIHRhYklkczpcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuc2V0QWN0aXZlVGFiKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgX2hhbmRsZUludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9mb3VuZGF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5oYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBfc2Nyb2xsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxlcnMgJiYgdGhpcy5fc2Nyb2xsZXJzLmxlbmd0aCA+IDAgPyB0aGlzLl9zY3JvbGxlcnMuZmlyc3QgOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IF90YWJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsZXIgPyB0aGlzLl9zY3JvbGxlci5fdGFicyA6IG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVEFCX0JBUl9ESVJFQ1RJVkVTID0gW01kY1RhYkJhckRpcmVjdGl2ZV07XG4iXX0=