UNPKG

@blox/material

Version:

Material Components for Angular

262 lines 30.9 kB
import { ContentChildren, EventEmitter, forwardRef, Directive, ElementRef, HostBinding, Input, Output, Renderer2, HostListener, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { MDCTabFoundation } from '@material/tab'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { asBoolean } from '../../utils/value.utils'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; import { MdcTabIndicatorDirective } from './mdc.tab.indicator.directive'; import { takeUntil } from 'rxjs/operators'; import { ReplaySubject, Subject } from 'rxjs'; /** * Directive for an optional icon when having a tab bar with icons. * This directive must be used as a child of an `mdcTabContent`, and as a sibbling * to a following `mdcTabLabel`. */ export class MdcTabIconDirective { constructor() { /** @internal */ this._cls = true; /** @internal */ this._ariaHidden = true; } } MdcTabIconDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcTabIcon]' },] } ]; MdcTabIconDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-tab__icon',] }], _ariaHidden: [{ type: HostBinding, args: ['attr.aria-hidden',] }] }; /** * Directive for the text label of a tab. * This directive must be used as a child of an `mdcTabContent`. * It can be preceded by an optional `mdcTabIcon`. */ export class MdcTabLabelDirective { constructor() { /** @internal */ this._cls = true; } } MdcTabLabelDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcTabLabel]' },] } ]; MdcTabLabelDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-tab__text-label',] }] }; /** * Directive for the content (label and optional icon of the tab). * This directive must be used as a child of an `mdcTab`, and * can contain an (optional) `mdcTabIcon` and an `mdcTabLabel`. */ export class MdcTabContentDirective { constructor(_root) { this._root = _root; /** @internal */ this._cls = true; } } MdcTabContentDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcTabContent]' },] } ]; MdcTabContentDirective.ctorParameters = () => [ { type: ElementRef } ]; MdcTabContentDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-tab__content',] }] }; export class AbstractMdcTabDirective extends AbstractMdcRipple { constructor(_rndr, _root, _registry, doc) { super(_root, _rndr, _registry, doc); this._rndr = _rndr; this._root = _root; this._registry = _registry; /** @internal */ this._cls = true; this.onDestroy$ = new Subject(); /** @internal */ this._active = false; /** @internal */ this._role = 'tab'; /** * Event called when the tab is activated. */ this.activate = new EventEmitter(); this.activationRequest = new ReplaySubject(1); /** @internal */ this._adapter = { addClass: (className) => this._rndr.addClass(this._root.nativeElement, className), removeClass: (className) => this._rndr.removeClass(this._root.nativeElement, className), hasClass: (className) => this._root.nativeElement.classList.contains(className), setAttr: (attr, value) => this._rndr.setAttribute(this._root.nativeElement, attr, value), activateIndicator: (previousIndicatorClientRect) => { var _a; return (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.activate(previousIndicatorClientRect); }, deactivateIndicator: () => { var _a; return (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.deactivate(); }, notifyInteracted: () => this.activationRequest.next(true), getOffsetLeft: () => this._root.nativeElement.offsetLeft, getOffsetWidth: () => this._root.nativeElement.offsetWidth, getContentOffsetLeft: () => this._content._root.nativeElement.offsetLeft, getContentOffsetWidth: () => this._content._root.nativeElement.offsetWidth, focus: () => this._root.nativeElement.focus() }; /** @internal */ this._foundation = null; } ngAfterContentInit() { this.addRippleSurface('mdc-tab__ripple'); this.initRipple(); let initializer = () => { this.destroyFoundation(); if (this._content && this._indicator) this.initFoundation(); }; initializer(); this._contents.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer); this._indicators.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer); } ngOnDestroy() { this.onDestroy$.next(); this.onDestroy$.complete(); this.destroyRipple(); this.destroyFoundation(); } destroyFoundation() { let destroy = this._foundation != null; if (destroy) this._foundation.destroy(); this._foundation = null; return destroy; } initFoundation() { this._foundation = new MDCTabFoundation(this._adapter); this._foundation.init(); if (this._active) { let clientRect = typeof this._active === 'boolean' ? undefined : this._active; this._foundation.activate(clientRect); } else { // foundation doesn't initialize these attributes: this._rndr.setAttribute(this._root.nativeElement, 'aria-selected', 'false'); this._rndr.setAttribute(this._root.nativeElement, 'tabindex', '-1'); } } /** @internal */ getRippleStylingElement() { return this.rippleSurface; } /** @internal */ _activate(tabIndex, previousIndicatorClientRect) { this._active = previousIndicatorClientRect || true; if (this._foundation) this._foundation.activate(previousIndicatorClientRect); this.activate.emit({ tab: this, tabIndex }); } /** @internal */ _deactivate() { this._active = false; if (this._foundation) this._foundation.deactivate(); } /** @internal */ _focus() { this._adapter.focus(); } /** @internal */ _computeIndicatorClientRect() { var _a; return (_a = this._indicator) === null || _a === void 0 ? void 0 : _a._computeContentClientRect(); } /** @internal */ _computeDimensions() { var _a; return (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.computeDimensions(); } /** @internal */ isActive() { return !!this._active; } /** @internal */ triggerActivation(value = true) { // Note: this should not set the _active property. It just notifies the tab-bar // that it wants to be activated. The tab-bar will deactivate the previous tab, and activate // this one. this.activationRequest.next(value); } /** @internal */ get activationRequest$() { return this.activationRequest.asObservable(); } /** @internal */ _onClick() { if (this._foundation) this._foundation.handleClick(); } /** @internal */ get _indicator() { return this._indicators && this._indicators.length > 0 ? this._indicators.first : null; } /** @internal */ get _content() { return this._contents && this._contents.length > 0 ? this._contents.first : null; } } AbstractMdcTabDirective.decorators = [ { type: Directive } ]; AbstractMdcTabDirective.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef }, { type: MdcEventRegistry }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; AbstractMdcTabDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-tab',] }], _role: [{ type: HostBinding, args: ['attr.role',] }], _contents: [{ type: ContentChildren, args: [MdcTabContentDirective,] }], _indicators: [{ type: ContentChildren, args: [MdcTabIndicatorDirective, { descendants: true },] }], activate: [{ type: Output }], _onClick: [{ type: HostListener, args: ['click',] }] }; /** * Directive for a tab. This directive must be used as a child of <code>mdcTabBar</code>. * When using tabs in combination with angular routes, add a `routerLink` property, so that * the `MdcTabRouterDirective` is selected instead of this directive. */ export class MdcTabDirective extends AbstractMdcTabDirective { constructor(rndr, root, registry, doc) { super(rndr, root, registry, doc); } /** * Input for activating the tab. Assign a truthy value to activate the tab. A falsy value * will have no effect. In order to deactivate the tab, you must activate another tab. */ get active() { return this.isActive(); } set active(value) { this.triggerActivation(asBoolean(value)); } } MdcTabDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcTab]:not([routerLink])', exportAs: 'mdcTab', providers: [{ provide: AbstractMdcTabDirective, useExisting: forwardRef(() => MdcTabDirective) }] },] } ]; MdcTabDirective.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef }, { type: MdcEventRegistry }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; MdcTabDirective.propDecorators = { active: [{ type: Input }] }; export const TAB_DIRECTIVES = [MdcTabIconDirective, MdcTabLabelDirective, MdcTabContentDirective, MdcTabDirective]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnRhYi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90YWIvbWRjLnRhYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUN2RixXQUFXLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQWEsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBaUI5Qzs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQUhoQztRQUlJLGdCQUFnQjtRQUM2QixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3pELGdCQUFnQjtRQUNpQixnQkFBVyxHQUFHLElBQUksQ0FBQztJQUN4RCxDQUFDOzs7WUFSQSxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGNBQWM7YUFDM0I7OzttQkFHSSxXQUFXLFNBQUMscUJBQXFCOzBCQUVqQyxXQUFXLFNBQUMsa0JBQWtCOztBQUduQzs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUhqQztRQUlJLGdCQUFnQjtRQUNtQyxTQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25FLENBQUM7OztZQU5BLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZUFBZTthQUM1Qjs7O21CQUdJLFdBQVcsU0FBQywyQkFBMkI7O0FBRzVDOzs7O0dBSUc7QUFJSCxNQUFNLE9BQU8sc0JBQXNCO0lBSS9CLFlBQW1CLEtBQWlCO1FBQWpCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFIcEMsZ0JBQWdCO1FBQ2dDLFNBQUksR0FBRyxJQUFJLENBQUM7SUFFckIsQ0FBQzs7O1lBUDNDLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsaUJBQWlCO2FBQzlCOzs7WUE3RGdGLFVBQVU7OzttQkFnRXRGLFdBQVcsU0FBQyx3QkFBd0I7O0FBTXpDLE1BQU0sT0FBZ0IsdUJBQXdCLFNBQVEsaUJBQWlCO0lBbUNuRSxZQUFzQixLQUFnQixFQUFTLEtBQWlCLEVBQVksU0FBMkIsRUFBb0IsR0FBUTtRQUMvSCxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBZSxDQUFDLENBQUM7UUFEOUIsVUFBSyxHQUFMLEtBQUssQ0FBVztRQUFTLFVBQUssR0FBTCxLQUFLLENBQVk7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWxDdkcsZ0JBQWdCO1FBQ3VCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDM0MsZUFBVSxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2pELGdCQUFnQjtRQUNOLFlBQU8sR0FBeUIsS0FBSyxDQUFDO1FBQ2hELGdCQUFnQjtRQUNVLFVBQUssR0FBRyxLQUFLLENBQUM7UUFLeEM7O1dBRUc7UUFDZ0IsYUFBUSxHQUErQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JFLHNCQUFpQixHQUFxQixJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUM1RSxnQkFBZ0I7UUFDTixhQUFRLEdBQWtCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDO1lBQ2pGLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDO1lBQ3ZGLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDL0UsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztZQUN4RixpQkFBaUIsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsUUFBUSxDQUFDLDJCQUEyQixJQUFDO1lBQzFHLG1CQUFtQixFQUFFLEdBQUcsRUFBRSx3QkFBQyxJQUFJLENBQUMsVUFBVSwwQ0FBRSxVQUFVLEtBQUU7WUFDeEQsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDekQsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVU7WUFDeEQsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFDMUQsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVU7WUFDekUscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFDM0UsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtTQUNoRCxDQUFDO1FBQ0YsZ0JBQWdCO1FBQ2hCLGdCQUFXLEdBQTRCLElBQUksQ0FBQztJQUk1QyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVU7Z0JBQ2hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFDRixXQUFXLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxTQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxXQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO1FBQ3ZDLElBQUksT0FBTztZQUNQLElBQUksQ0FBQyxXQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksVUFBVSxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM5RSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN6QzthQUFNO1lBQ0gsa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdkU7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ04sdUJBQXVCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQVMsQ0FBQyxRQUFnQixFQUFFLDJCQUF3QztRQUNoRSxJQUFJLENBQUMsT0FBTyxHQUFHLDJCQUEyQixJQUFJLElBQUksQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixXQUFXO1FBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVztZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsTUFBTTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQiwyQkFBMkI7O1FBQ3ZCLGFBQU8sSUFBSSxDQUFDLFVBQVUsMENBQUUseUJBQXlCLEdBQUc7SUFDeEQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0I7O1FBQ2QsYUFBTyxJQUFJLENBQUMsV0FBVywwQ0FBRSxpQkFBaUIsR0FBRztJQUNqRCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFFBQVE7UUFDSixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsaUJBQWlCLENBQUMsUUFBaUIsSUFBSTtRQUNuQywrRUFBK0U7UUFDL0UsNEZBQTRGO1FBQzVGLFlBQVk7UUFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBSSxrQkFBa0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQjtJQUNPLFFBQVE7UUFDM0IsSUFBSSxJQUFJLENBQUMsV0FBVztZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBWSxVQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0YsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFZLFFBQVE7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRixDQUFDOzs7WUFySkosU0FBUzs7O1lBcEVpQyxTQUFTO1lBRDZCLFVBQVU7WUFNbEYsZ0JBQWdCOzRDQW1HcUYsTUFBTSxTQUFDLFFBQVE7OzttQkFqQ3hILFdBQVcsU0FBQyxlQUFlO29CQUszQixXQUFXLFNBQUMsV0FBVzt3QkFFdkIsZUFBZSxTQUFDLHNCQUFzQjswQkFFdEMsZUFBZSxTQUFDLHdCQUF3QixFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQzt1QkFJN0QsTUFBTTt1QkF3SE4sWUFBWSxTQUFDLE9BQU87O0FBZ0J6Qjs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLGVBQWdCLFNBQVEsdUJBQXVCO0lBQ3hELFlBQVksSUFBZSxFQUFFLElBQWdCLEVBQUUsUUFBMEIsRUFBb0IsR0FBUTtRQUNqRyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBZSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQWEsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFjO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDOzs7WUFwQkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSw0QkFBNEI7Z0JBQ3RDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7YUFDbkc7OztZQXJPMEMsU0FBUztZQUQ2QixVQUFVO1lBTWxGLGdCQUFnQjs0Q0FrT3VELE1BQU0sU0FBQyxRQUFROzs7cUJBUTFGLEtBQUs7O0FBV1YsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFJlbmRlcmVyMiwgUXVlcnlMaXN0LCBIb3N0TGlzdGVuZXIsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTURDVGFiRm91bmRhdGlvbiwgTURDVGFiQWRhcHRlciB9IGZyb20gJ0BtYXRlcmlhbC90YWInO1xuaW1wb3J0IHsgQWJzdHJhY3RNZGNSaXBwbGUgfSBmcm9tICcuLi9yaXBwbGUvYWJzdHJhY3QubWRjLnJpcHBsZSc7XG5pbXBvcnQgeyBhc0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy92YWx1ZS51dGlscyc7XG5pbXBvcnQgeyBNZGNFdmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvbWRjLmV2ZW50LnJlZ2lzdHJ5JztcbmltcG9ydCB7IE1kY1RhYkluZGljYXRvckRpcmVjdGl2ZSB9IGZyb20gJy4vbWRjLnRhYi5pbmRpY2F0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJzsgIFxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIGV2ZW50cyBzZW5kIGJ5IHRoZSA8Y29kZT5hY3RpdmF0ZTwvY29kZT4gb3V0cHV0IG9mIGFuXG4gKiBgbWRjVGFiYCBkaXJlY3RpdmUsIG9yIGJ5IHRoZSA8Y29kZT50YWJDaGFuZ2U8L2NvZGU+IG91dHB1dCBvZiBhbiA8Y29kZT5tZGNUYWJCYXI8L2NvZGU+LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1kY1RhYkNoYW5nZSB7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHRhYiB0aGF0IHNlbmRzIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICB0YWI6IEFic3RyYWN0TWRjVGFiRGlyZWN0aXZlLFxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRoYXQgc2VuZHMgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHRhYkluZGV4OiBudW1iZXJcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGFuIG9wdGlvbmFsIGljb24gd2hlbiBoYXZpbmcgYSB0YWIgYmFyIHdpdGggaWNvbnMuXG4gKiBUaGlzIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiBhbiBgbWRjVGFiQ29udGVudGAsIGFuZCBhcyBhIHNpYmJsaW5nXG4gKiB0byBhIGZvbGxvd2luZyBgbWRjVGFiTGFiZWxgLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNUYWJJY29uXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiSWNvbkRpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXRhYl9faWNvbicpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oaWRkZW4nKSBfYXJpYUhpZGRlbiA9IHRydWU7XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciB0aGUgdGV4dCBsYWJlbCBvZiBhIHRhYi5cbiAqIFRoaXMgZGlyZWN0aXZlIG11c3QgYmUgdXNlZCBhcyBhIGNoaWxkIG9mIGFuIGBtZGNUYWJDb250ZW50YC5cbiAqIEl0IGNhbiBiZSBwcmVjZWRlZCBieSBhbiBvcHRpb25hbCBgbWRjVGFiSWNvbmAuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY1RhYkxhYmVsXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiTGFiZWxEaXJlY3RpdmUge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy10YWJfX3RleHQtbGFiZWwnKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIHRoZSBjb250ZW50IChsYWJlbCBhbmQgb3B0aW9uYWwgaWNvbiBvZiB0aGUgdGFiKS5cbiAqIFRoaXMgZGlyZWN0aXZlIG11c3QgYmUgdXNlZCBhcyBhIGNoaWxkIG9mIGFuIGBtZGNUYWJgLCBhbmRcbiAqIGNhbiBjb250YWluIGFuIChvcHRpb25hbCkgYG1kY1RhYkljb25gIGFuZCBhbiBgbWRjVGFiTGFiZWxgLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNUYWJDb250ZW50XSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiQ29udGVudERpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXRhYl9fY29udGVudCcpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIF9yb290OiBFbGVtZW50UmVmKSB7fVxufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjUmlwcGxlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtdGFiJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG4gICAgcHJpdmF0ZSBvbkRlc3Ryb3kkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcm90ZWN0ZWQgX2FjdGl2ZTogQ2xpZW50UmVjdCB8IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSBfcm9sZSA9ICd0YWInO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKE1kY1RhYkNvbnRlbnREaXJlY3RpdmUpIF9jb250ZW50cz86IFF1ZXJ5TGlzdDxNZGNUYWJDb250ZW50RGlyZWN0aXZlPjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZGNUYWJJbmRpY2F0b3JEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9pbmRpY2F0b3JzPzogUXVlcnlMaXN0PE1kY1RhYkluZGljYXRvckRpcmVjdGl2ZT47XG4gICAgLyoqXG4gICAgICogRXZlbnQgY2FsbGVkIHdoZW4gdGhlIHRhYiBpcyBhY3RpdmF0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2YXRlOiBFdmVudEVtaXR0ZXI8TWRjVGFiQ2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIGFjdGl2YXRpb25SZXF1ZXN0OiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByb3RlY3RlZCBfYWRhcHRlcjogTURDVGFiQWRhcHRlciA9IHtcbiAgICAgICAgYWRkQ2xhc3M6IChjbGFzc05hbWUpID0+IHRoaXMuX3JuZHIuYWRkQ2xhc3ModGhpcy5fcm9vdC5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpLFxuICAgICAgICByZW1vdmVDbGFzczogKGNsYXNzTmFtZSkgPT4gdGhpcy5fcm5kci5yZW1vdmVDbGFzcyh0aGlzLl9yb290Lm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSksXG4gICAgICAgIGhhc0NsYXNzOiAoY2xhc3NOYW1lKSA9PiB0aGlzLl9yb290Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSksXG4gICAgICAgIHNldEF0dHI6IChhdHRyLCB2YWx1ZSkgPT4gdGhpcy5fcm5kci5zZXRBdHRyaWJ1dGUodGhpcy5fcm9vdC5uYXRpdmVFbGVtZW50LCBhdHRyLCB2YWx1ZSksXG4gICAgICAgIGFjdGl2YXRlSW5kaWNhdG9yOiAocHJldmlvdXNJbmRpY2F0b3JDbGllbnRSZWN0KSA9PiB0aGlzLl9pbmRpY2F0b3I/LmFjdGl2YXRlKHByZXZpb3VzSW5kaWNhdG9yQ2xpZW50UmVjdCksXG4gICAgICAgIGRlYWN0aXZhdGVJbmRpY2F0b3I6ICgpID0+IHRoaXMuX2luZGljYXRvcj8uZGVhY3RpdmF0ZSgpLFxuICAgICAgICBub3RpZnlJbnRlcmFjdGVkOiAoKSA9PiB0aGlzLmFjdGl2YXRpb25SZXF1ZXN0Lm5leHQodHJ1ZSksXG4gICAgICAgIGdldE9mZnNldExlZnQ6ICgpID0+IHRoaXMuX3Jvb3QubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgICAgICBnZXRPZmZzZXRXaWR0aDogKCkgPT4gdGhpcy5fcm9vdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgICBnZXRDb250ZW50T2Zmc2V0TGVmdDogKCkgPT4gdGhpcy5fY29udGVudCEuX3Jvb3QubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgICAgICBnZXRDb250ZW50T2Zmc2V0V2lkdGg6ICgpID0+IHRoaXMuX2NvbnRlbnQhLl9yb290Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICAgIGZvY3VzOiAoKSA9PiB0aGlzLl9yb290Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9mb3VuZGF0aW9uOiBNRENUYWJGb3VuZGF0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3JuZHI6IFJlbmRlcmVyMiwgcHVibGljIF9yb290OiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgX3JlZ2lzdHJ5OiBNZGNFdmVudFJlZ2lzdHJ5LCBASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgICAgICBzdXBlcihfcm9vdCwgX3JuZHIsIF9yZWdpc3RyeSwgZG9jIGFzIERvY3VtZW50KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuYWRkUmlwcGxlU3VyZmFjZSgnbWRjLXRhYl9fcmlwcGxlJyk7XG4gICAgICAgIHRoaXMuaW5pdFJpcHBsZSgpO1xuXG4gICAgICAgIGxldCBpbml0aWFsaXplciA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUZvdW5kYXRpb24oKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb250ZW50ICYmIHRoaXMuX2luZGljYXRvcilcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRGb3VuZGF0aW9uKCk7XG4gICAgICAgIH07XG4gICAgICAgIGluaXRpYWxpemVyKCk7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRzIS5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpLnN1YnNjcmliZShpbml0aWFsaXplcik7XG4gICAgICAgIHRoaXMuX2luZGljYXRvcnMhLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKGluaXRpYWxpemVyKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveVJpcHBsZSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lGb3VuZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95Rm91bmRhdGlvbigpIHtcbiAgICAgICAgbGV0IGRlc3Ryb3kgPSB0aGlzLl9mb3VuZGF0aW9uICE9IG51bGw7XG4gICAgICAgIGlmIChkZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbiEuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9mb3VuZGF0aW9uID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3k7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Rm91bmRhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZm91bmRhdGlvbiA9IG5ldyBNRENUYWJGb3VuZGF0aW9uKHRoaXMuX2FkYXB0ZXIpO1xuICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmluaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgICAgICAgbGV0IGNsaWVudFJlY3QgPSB0eXBlb2YgdGhpcy5fYWN0aXZlID09PSAnYm9vbGVhbicgPyB1bmRlZmluZWQgOiB0aGlzLl9hY3RpdmU7XG4gICAgICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmFjdGl2YXRlKGNsaWVudFJlY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm91bmRhdGlvbiBkb2Vzbid0IGluaXRpYWxpemUgdGhlc2UgYXR0cmlidXRlczpcbiAgICAgICAgICAgIHRoaXMuX3JuZHIuc2V0QXR0cmlidXRlKHRoaXMuX3Jvb3QubmF0aXZlRWxlbWVudCwgJ2FyaWEtc2VsZWN0ZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIHRoaXMuX3JuZHIuc2V0QXR0cmlidXRlKHRoaXMuX3Jvb3QubmF0aXZlRWxlbWVudCwgJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJvdGVjdGVkIGdldFJpcHBsZVN0eWxpbmdFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaXBwbGVTdXJmYWNlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYWN0aXZhdGUodGFiSW5kZXg6IG51bWJlciwgcHJldmlvdXNJbmRpY2F0b3JDbGllbnRSZWN0PzogQ2xpZW50UmVjdCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBwcmV2aW91c0luZGljYXRvckNsaWVudFJlY3QgfHwgdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2ZvdW5kYXRpb24pXG4gICAgICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmFjdGl2YXRlKHByZXZpb3VzSW5kaWNhdG9yQ2xpZW50UmVjdCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGUuZW1pdCh7dGFiOiB0aGlzLCB0YWJJbmRleH0pO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9mb3VuZGF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5kZWFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9mb2N1cygpIHtcbiAgICAgICAgdGhpcy5fYWRhcHRlci5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tcHV0ZUluZGljYXRvckNsaWVudFJlY3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmRpY2F0b3I/Ll9jb21wdXRlQ29udGVudENsaWVudFJlY3QoKTtcbiAgICB9XG4gICAgXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jb21wdXRlRGltZW5zaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvdW5kYXRpb24/LmNvbXB1dGVEaW1lbnNpb25zKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmU7XG4gICAgfSBcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0cmlnZ2VyQWN0aXZhdGlvbih2YWx1ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgLy8gTm90ZTogdGhpcyBzaG91bGQgbm90IHNldCB0aGUgX2FjdGl2ZSBwcm9wZXJ0eS4gSXQganVzdCBub3RpZmllcyB0aGUgdGFiLWJhclxuICAgICAgICAvLyB0aGF0IGl0IHdhbnRzIHRvIGJlIGFjdGl2YXRlZC4gVGhlIHRhYi1iYXIgd2lsbCBkZWFjdGl2YXRlIHRoZSBwcmV2aW91cyB0YWIsIGFuZCBhY3RpdmF0ZVxuICAgICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uUmVxdWVzdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgZ2V0IGFjdGl2YXRpb25SZXF1ZXN0JCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGlvblJlcXVlc3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJykgX29uQ2xpY2soKSB7XG4gICAgICAgIGlmICh0aGlzLl9mb3VuZGF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5oYW5kbGVDbGljaygpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIGdldCBfaW5kaWNhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kaWNhdG9ycyAmJiB0aGlzLl9pbmRpY2F0b3JzLmxlbmd0aCA+IDAgPyB0aGlzLl9pbmRpY2F0b3JzLmZpcnN0IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBnZXQgX2NvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50cyAmJiB0aGlzLl9jb250ZW50cy5sZW5ndGggPiAwID8gdGhpcy5fY29udGVudHMuZmlyc3QgOiBudWxsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGEgdGFiLiBUaGlzIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiA8Y29kZT5tZGNUYWJCYXI8L2NvZGU+LlxuICogV2hlbiB1c2luZyB0YWJzIGluIGNvbWJpbmF0aW9uIHdpdGggYW5ndWxhciByb3V0ZXMsIGFkZCBhIGByb3V0ZXJMaW5rYCBwcm9wZXJ0eSwgc28gdGhhdFxuICogdGhlIGBNZGNUYWJSb3V0ZXJEaXJlY3RpdmVgIGlzIHNlbGVjdGVkIGluc3RlYWQgb2YgdGhpcyBkaXJlY3RpdmUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY1RhYl06bm90KFtyb3V0ZXJMaW5rXSknLFxuICAgIGV4cG9ydEFzOiAnbWRjVGFiJyxcbiAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogQWJzdHJhY3RNZGNUYWJEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1kY1RhYkRpcmVjdGl2ZSkgfV1cbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiRGlyZWN0aXZlIGV4dGVuZHMgQWJzdHJhY3RNZGNUYWJEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHJuZHI6IFJlbmRlcmVyMiwgcm9vdDogRWxlbWVudFJlZiwgcmVnaXN0cnk6IE1kY0V2ZW50UmVnaXN0cnksIEBJbmplY3QoRE9DVU1FTlQpIGRvYzogYW55KSB7XG4gICAgICAgIHN1cGVyKHJuZHIsIHJvb3QsIHJlZ2lzdHJ5LCBkb2MgYXMgRG9jdW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElucHV0IGZvciBhY3RpdmF0aW5nIHRoZSB0YWIuIEFzc2lnbiBhIHRydXRoeSB2YWx1ZSB0byBhY3RpdmF0ZSB0aGUgdGFiLiBBIGZhbHN5IHZhbHVlXG4gICAgICogd2lsbCBoYXZlIG5vIGVmZmVjdC4gSW4gb3JkZXIgdG8gZGVhY3RpdmF0ZSB0aGUgdGFiLCB5b3UgbXVzdCBhY3RpdmF0ZSBhbm90aGVyIHRhYi5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FjdGl2ZSgpO1xuICAgIH1cblxuICAgIHNldCBhY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyQWN0aXZhdGlvbihhc0Jvb2xlYW4odmFsdWUpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfYWN0aXZlOiBib29sZWFuIHwgJyc7XG59XG5cbmV4cG9ydCBjb25zdCBUQUJfRElSRUNUSVZFUyA9IFtNZGNUYWJJY29uRGlyZWN0aXZlLCBNZGNUYWJMYWJlbERpcmVjdGl2ZSwgTWRjVGFiQ29udGVudERpcmVjdGl2ZSwgTWRjVGFiRGlyZWN0aXZlXTtcbiJdfQ==