@blox/material
Version:
Material Components for Angular
141 lines • 21.3 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnRhYi5iYXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGFiL21kYy50YWIuYmFyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUMxRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sa0JBQWtCO0lBb0MzQixZQUFtQixHQUFlLEVBQW9CLEdBQVE7UUFBM0MsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQW5DbEMsZ0JBQWdCO1FBQzJCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFFdkQsZ0JBQWdCO1FBQ1UsVUFBSyxHQUFHLFNBQVMsQ0FBQztRQUNwQyxlQUFVLEdBQWlCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDekMsa0JBQWEsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUdwRDs7V0FFRztRQUNnQixjQUFTLEdBQStCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdEUsYUFBUSxHQUFxQjtZQUNqQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckUsZUFBZSxFQUFF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bnRlbnRDaGlsZHJlbiwgRXZlbnRFbWl0dGVyLCBRdWVyeUxpc3QsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIE91dHB1dCwgSG9zdExpc3RlbmVyLFxuICAgIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1EQ1RhYkJhckZvdW5kYXRpb24sIE1EQ1RhYkJhckFkYXB0ZXIgfSBmcm9tICdAbWF0ZXJpYWwvdGFiLWJhcic7XG5pbXBvcnQgeyBBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZSwgTWRjVGFiQ2hhbmdlIH0gZnJvbSAnLi9tZGMudGFiLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNZGNUYWJTY3JvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4vbWRjLnRhYi5zY3JvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgYSB0YWIgYmFyLiBUaGlzIGRpcmVjdGl2ZSBtdXN0IGhhdmUgYW4gYG1kY1RhYlNjcm9sbGVyYCBhcyBvbmx5IGNoaWxkLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNUYWJCYXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBNZGNUYWJCYXJEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy10YWItYmFyJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG4gICAgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQ7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJykgX3JvbGUgPSAndGFibGlzdCc7XG4gICAgcHJpdmF0ZSBvbkRlc3Ryb3kkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIHByaXZhdGUgb25UYWJzQ2hhbmdlJDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZGNUYWJTY3JvbGxlckRpcmVjdGl2ZSkgX3Njcm9sbGVycz86IFF1ZXJ5TGlzdDxNZGNUYWJTY3JvbGxlckRpcmVjdGl2ZT47XG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHRhYkNoYW5nZTogRXZlbnRFbWl0dGVyPE1kY1RhYkNoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfYWRhcHRlcjogTURDVGFiQmFyQWRhcHRlciA9IHtcbiAgICAgICAgc2Nyb2xsVG86IChzY3JvbGxYKSA9PiB0aGlzLl9zY3JvbGxlciEuX2ZvdW5kYXRpb24hLnNjcm9sbFRvKHNjcm9sbFgpLFxuICAgICAgICBpbmNyZW1lbnRTY3JvbGw6IChzY3JvbGxYSW5jcmVtZW50KSA9PiB0aGlzLl9zY3JvbGxlciEuX2ZvdW5kYXRpb24hLmluY3JlbWVudFNjcm9sbChzY3JvbGxYSW5jcmVtZW50KSxcbiAgICAgICAgZ2V0U2Nyb2xsUG9zaXRpb246ICgpID0+IHRoaXMuX3Njcm9sbGVyIS5fZm91bmRhdGlvbiEuZ2V0U2Nyb2xsUG9zaXRpb24oKSxcbiAgICAgICAgZ2V0U2Nyb2xsQ29udGVudFdpZHRoOiAoKSA9PiB0aGlzLl9zY3JvbGxlciEuX2dldFNjcm9sbENvbnRlbnRXaWR0aCgpLFxuICAgICAgICBnZXRPZmZzZXRXaWR0aDogKCkgPT4gKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoLFxuICAgICAgICBpc1JUTDogKCkgPT4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCcsXG4gICAgICAgIHNldEFjdGl2ZVRhYjogKGluZGV4KSA9PiB0aGlzLl9mb3VuZGF0aW9uIS5hY3RpdmF0ZVRhYihpbmRleCksXG4gICAgICAgIGFjdGl2YXRlVGFiQXRJbmRleDogKGluZGV4LCBjbGllbnRSZWN0KSA9PiB0aGlzLl90YWJzIS50b0FycmF5KClbaW5kZXhdLl9hY3RpdmF0ZShpbmRleCwgY2xpZW50UmVjdCksXG4gICAgICAgIGRlYWN0aXZhdGVUYWJBdEluZGV4OiAoaW5kZXgpID0+IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVtpbmRleF0uX2RlYWN0aXZhdGUoKSxcbiAgICAgICAgZm9jdXNUYWJBdEluZGV4OiAoaW5kZXgpID0+IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVtpbmRleF0uX2ZvY3VzKCksXG4gICAgICAgIGdldFRhYkluZGljYXRvckNsaWVudFJlY3RBdEluZGV4OiAoaW5kZXgpID0+IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVtpbmRleF0uX2NvbXB1dGVJbmRpY2F0b3JDbGllbnRSZWN0KCkhLFxuICAgICAgICBnZXRUYWJEaW1lbnNpb25zQXRJbmRleDogKGluZGV4KSA9PiB0aGlzLl90YWJzIS50b0FycmF5KClbaW5kZXhdLl9jb21wdXRlRGltZW5zaW9ucygpISxcbiAgICAgICAgZ2V0UHJldmlvdXNBY3RpdmVUYWJJbmRleDogKCkgPT4gdGhpcy5fdGFicyEudG9BcnJheSgpLmZpbmRJbmRleChlID0+IGUuaXNBY3RpdmUoKSksXG4gICAgICAgIGdldEZvY3VzZWRUYWJJbmRleDogKCkgPT4gdGhpcy5fdGFicyEubWFwKHQgPT4gdC5fcm9vdC5uYXRpdmVFbGVtZW50KS5pbmRleE9mKHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksXG4gICAgICAgIGdldEluZGV4T2ZUYWJCeUlkOiAoKSA9PiAtMSwgLy8gd2UncmUgbm90IHVzaW5nIHRoZSBpZCdzLCBhbmQgbm90aGluZyBzaG91bGQgY2FsbCBnZXRJbmRleE9mVGFiQnlJZFxuICAgICAgICBnZXRUYWJMaXN0TGVuZ3RoOiAoKSA9PiB0aGlzLl90YWJzIS5sZW5ndGgsXG4gICAgICAgIG5vdGlmeVRhYkFjdGl2YXRlZDogKHRhYkluZGV4KSA9PiB0aGlzLnRhYkNoYW5nZS5lbWl0KHt0YWI6IHRoaXMuX3RhYnMhLnRvQXJyYXkoKVt0YWJJbmRleF0sIHRhYkluZGV4fSlcbiAgICB9O1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBfZm91bmRhdGlvbjogTURDVGFiQmFyRm91bmRhdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIF9lbDogRWxlbWVudFJlZiwgQEluamVjdChET0NVTUVOVCkgZG9jOiBhbnkpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudCA9IGRvYyBhcyBEb2N1bWVudDtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIGxldCBzY3JvbGxlcnNPYnNlcnZhYmxlJCA9IHRoaXMuX3Njcm9sbGVycyEuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKTtcbiAgICAgICAgY29uc3QgdGFiQ2hhbmdlSW5pdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFicy5jaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChzY3JvbGxlcnNPYnNlcnZhYmxlJCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uVGFic0NoYW5nZSQubmV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjcm9sbGVyc09ic2VydmFibGUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVGFic0NoYW5nZSQubmV4dCgpO1xuICAgICAgICAgICAgdGFiQ2hhbmdlSW5pdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGFiQ2hhbmdlSW5pdCgpO1xuXG4gICAgICAgIHRoaXMub25UYWJzQ2hhbmdlJC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcbiAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Rm91bmRhdGlvbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnMpXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Rm91bmRhdGlvbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMpXG4gICAgICAgICAgICB0aGlzLmluaXRGb3VuZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMub25UYWJzQ2hhbmdlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpOyB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95Rm91bmRhdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZvdW5kYXRpb24oKSB7XG4gICAgICAgIHRoaXMuX2ZvdW5kYXRpb24gPSBuZXcgTURDVGFiQmFyRm91bmRhdGlvbih0aGlzLl9hZGFwdGVyKTtcbiAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5pbml0KCk7XG4gICAgICAgIHRoaXMuX2xpc3RlblRhYlNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95Rm91bmRhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW5UYWJTZWxlY3RlZCgpO1xuICAgICAgICBsZXQgZGVzdHJveSA9IHRoaXMuX2ZvdW5kYXRpb24gIT0gbnVsbDtcbiAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvdW5kYXRpb24hLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb3VuZGF0aW9uID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3k7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbGlzdGVuVGFiU2VsZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuVGFiU2VsZWN0ZWQoKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheTxTdWJzY3JpcHRpb24+KCk7XG4gICAgICAgIHRoaXMuX3RhYnM/LmZvckVhY2godGFiID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMhLnB1c2godGFiLmFjdGl2YXRpb25SZXF1ZXN0JC5zdWJzY3JpYmUoYWN0aXZhdGVkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdGVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRBY3RpdmUodGFiKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdW5saXN0ZW5UYWJTZWxlY3RlZCgpIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRBY3RpdmUodGFiOiBBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZSkge1xuICAgICAgICBpZiAodGhpcy5fZm91bmRhdGlvbiAmJiB0aGlzLl90YWJzKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLl90YWJzLnRvQXJyYXkoKS5pbmRleE9mKHRhYik7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHdoYXQgZm91bmRhdGlvbi5oYW5kbGVUYWJJbnRlcmFjdGlvbiB3b3VsZCBkbywgYnV0IG1vcmUgYWNjZXNzaWJsZSwgd2l0aG91dFxuICAgICAgICAgICAgLy8gdGhlIG5lZWQgZm9yIGFzc2lnbmVkIHRhYklkczpcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuc2V0QWN0aXZlVGFiKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgX2hhbmRsZUludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9mb3VuZGF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5oYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBfc2Nyb2xsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxlcnMgJiYgdGhpcy5fc2Nyb2xsZXJzLmxlbmd0aCA+IDAgPyB0aGlzLl9zY3JvbGxlcnMuZmlyc3QgOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IF90YWJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsZXIgPyB0aGlzLl9zY3JvbGxlci5fdGFicyA6IG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVEFCX0JBUl9ESVJFQ1RJVkVTID0gW01kY1RhYkJhckRpcmVjdGl2ZV07XG4iXX0=