UNPKG

@ohayojp.com/components

Version:

Common business components of ohayojp.

413 lines 33.2 kB
/** * @fileoverview added by tsickle * Generated from: page-header.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __decorate, __metadata } from "tslib"; import { Platform } from '@angular/cdk/platform'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Input, Optional, Renderer2, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { ReuseTabService } from '@ohayojp.com/components/reuse-tab'; import { OHAYO_I18N_TOKEN, MenuService, SettingsService, TitleService } from '@ohayojp.com/theme'; import { OhayoConfigService, InputBoolean, InputNumber, isEmpty } from '@ohayojp.com/util'; import { NzAffixComponent } from 'ng-zorro-antd/affix'; import { merge, Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; /** * @record */ function PageHeaderPath() { } if (false) { /** @type {?|undefined} */ PageHeaderPath.prototype.title; /** @type {?|undefined} */ PageHeaderPath.prototype.link; } export class PageHeaderComponent { // #endregion /** * @param {?} settings * @param {?} renderer * @param {?} router * @param {?} menuSrv * @param {?} i18nSrv * @param {?} titleSrv * @param {?} reuseSrv * @param {?} cdr * @param {?} configSrv * @param {?} platform */ constructor(settings, renderer, router, menuSrv, i18nSrv, titleSrv, reuseSrv, cdr, configSrv, platform) { this.renderer = renderer; this.router = router; this.menuSrv = menuSrv; this.i18nSrv = i18nSrv; this.titleSrv = titleSrv; this.reuseSrv = reuseSrv; this.cdr = cdr; this.inited = false; this.unsubscribe$ = new Subject(); this.isBrowser = true; this._titleVal = ''; this.paths = []; this.loading = false; this.wide = false; this.isBrowser = platform.isBrowser; configSrv.attach(this, 'pageHeader', { home: '首页', homeLink: '/', autoBreadcrumb: true, recursiveBreadcrumb: false, autoTitle: true, syncTitle: true, fixed: false, fixedOffsetTop: 64, }); settings.notify .pipe(takeUntil(this.unsubscribe$), filter((/** * @param {?} w * @return {?} */ w => this.affix && w.type === 'layout' && w.name === 'collapsed'))) .subscribe((/** * @return {?} */ () => this.affix.updatePosition((/** @type {?} */ ({}))))); merge(menuSrv.change.pipe(filter((/** * @return {?} */ () => this.inited))), router.events.pipe(filter((/** * @param {?} ev * @return {?} */ ev => ev instanceof NavigationEnd))), i18nSrv.change) .pipe(takeUntil(this.unsubscribe$)) .subscribe((/** * @return {?} */ () => this.refresh())); } /** * @private * @return {?} */ get menus() { return this.menuSrv.getPathByUrl(this.router.url, this.recursiveBreadcrumb); } /** * @param {?} value * @return {?} */ set title(value) { if (value instanceof TemplateRef) { this._title = null; this._titleTpl = value; this._titleVal = ''; } else { this._title = value; this._titleVal = this._title; } } /** * @return {?} */ refresh() { this.setTitle().genBreadcrumb(); this.cdr.detectChanges(); } /** * @private * @return {?} */ genBreadcrumb() { if (this.breadcrumb || !this.autoBreadcrumb || this.menus.length <= 0) { this.paths = []; return; } /** @type {?} */ const paths = []; this.menus.forEach((/** * @param {?} item * @return {?} */ item => { if (typeof item.hideInBreadcrumb !== 'undefined' && item.hideInBreadcrumb) return; /** @type {?} */ let title = item.text; if (item.i18n && this.i18nSrv) title = this.i18nSrv.fanyi(item.i18n); paths.push({ title, link: (/** @type {?} */ ((item.link && [item.link]))) }); })); // add home if (this.home) { paths.splice(0, 0, { title: (this.homeI18n && this.i18nSrv && this.i18nSrv.fanyi(this.homeI18n)) || this.home, link: [this.homeLink], }); } this.paths = paths; } /** * @private * @template THIS * @this {THIS} * @return {THIS} */ setTitle() { if ((/** @type {?} */ (this))._title == null && (/** @type {?} */ (this))._titleTpl == null && (/** @type {?} */ (this)).autoTitle && (/** @type {?} */ (this)).menus.length > 0) { /** @type {?} */ const item = (/** @type {?} */ (this)).menus[(/** @type {?} */ (this)).menus.length - 1]; /** @type {?} */ let title = item.text; if (item.i18n && (/** @type {?} */ (this)).i18nSrv) { title = (/** @type {?} */ (this)).i18nSrv.fanyi(item.i18n); } (/** @type {?} */ (this))._titleVal = (/** @type {?} */ (title)); } if ((/** @type {?} */ (this))._titleVal && (/** @type {?} */ (this)).syncTitle) { if ((/** @type {?} */ (this)).titleSrv) { (/** @type {?} */ (this)).titleSrv.setTitle((/** @type {?} */ (this))._titleVal); } if (!(/** @type {?} */ (this)).inited && (/** @type {?} */ (this)).reuseSrv) { (/** @type {?} */ (this)).reuseSrv.title = (/** @type {?} */ (this))._titleVal; } } return (/** @type {?} */ (this)); } /** * @return {?} */ checkContent() { if (isEmpty(this.conTpl.nativeElement)) { this.renderer.setAttribute(this.conTpl.nativeElement, 'hidden', ''); } else { this.renderer.removeAttribute(this.conTpl.nativeElement, 'hidden'); } } /** * @return {?} */ ngOnInit() { this.refresh(); this.inited = true; } /** * @return {?} */ ngAfterViewInit() { this.checkContent(); } /** * @return {?} */ ngOnChanges() { if (this.inited) { this.refresh(); } } /** * @return {?} */ ngOnDestroy() { const { unsubscribe$ } = this; unsubscribe$.next(); unsubscribe$.complete(); } } PageHeaderComponent.decorators = [ { type: Component, args: [{ selector: 'page-header', exportAs: 'pageHeader', template: "<nz-affix #affix *ngIf=\"isBrowser && fixed; else phTpl\" [nzOffsetTop]=\"fixedOffsetTop\">\n <ng-template [ngTemplateOutlet]=\"phTpl\"></ng-template>\n</nz-affix>\n<ng-template #phTpl>\n <div class=\"page-header\">\n <div [ngClass]=\"{ 'page-header__wide': wide }\">\n <nz-skeleton [nzLoading]=\"loading\" [nzTitle]=\"false\" [nzActive]=\"true\" [nzParagraph]=\"{ rows: 3 }\" [nzAvatar]=\"{ size: 'large', shape: 'circle' }\">\n <ng-container *ngIf=\"!breadcrumb; else breadcrumb\">\n <nz-breadcrumb *ngIf=\"paths && paths.length > 0\">\n <nz-breadcrumb-item *ngFor=\"let i of paths\">\n <ng-container *ngIf=\"i.link\">\n <a [routerLink]=\"i.link\">{{ i.title }}</a>\n </ng-container>\n <ng-container *ngIf=\"!i.link\">{{ i.title }}</ng-container>\n </nz-breadcrumb-item>\n </nz-breadcrumb>\n </ng-container>\n <div class=\"page-header__detail\">\n <div *ngIf=\"logo\" class=\"page-header__logo\">\n <ng-template [ngTemplateOutlet]=\"logo\"></ng-template>\n </div>\n <div class=\"page-header__main\">\n <div class=\"page-header__row\">\n <h1 *ngIf=\"_titleVal || _titleTpl\" class=\"page-header__title\">\n <ng-container *ngIf=\"_titleVal; else _titleTpl\">{{ _titleVal }}</ng-container>\n </h1>\n <div *ngIf=\"action\" class=\"page-header__action\">\n <ng-template [ngTemplateOutlet]=\"action\"></ng-template>\n </div>\n </div>\n <div class=\"page-header__row\">\n <div class=\"page-header__desc\" (cdkObserveContent)=\"checkContent()\" #conTpl>\n <ng-content></ng-content>\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </div>\n <div *ngIf=\"extra\" class=\"page-header__extra\">\n <ng-template [ngTemplateOutlet]=\"extra\"></ng-template>\n </div>\n </div>\n </div>\n </div>\n <ng-template [ngTemplateOutlet]=\"tab\"></ng-template>\n </nz-skeleton>\n </div>\n </div>\n</ng-template>\n", preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ PageHeaderComponent.ctorParameters = () => [ { type: SettingsService }, { type: Renderer2 }, { type: Router }, { type: MenuService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [OHAYO_I18N_TOKEN,] }] }, { type: TitleService, decorators: [{ type: Optional }, { type: Inject, args: [TitleService,] }] }, { type: ReuseTabService, decorators: [{ type: Optional }, { type: Inject, args: [ReuseTabService,] }] }, { type: ChangeDetectorRef }, { type: OhayoConfigService }, { type: Platform } ]; PageHeaderComponent.propDecorators = { conTpl: [{ type: ViewChild, args: ['conTpl', { static: false },] }], affix: [{ type: ViewChild, args: ['affix', { static: false },] }], title: [{ type: Input }], loading: [{ type: Input }], wide: [{ type: Input }], home: [{ type: Input }], homeLink: [{ type: Input }], homeI18n: [{ type: Input }], autoBreadcrumb: [{ type: Input }], autoTitle: [{ type: Input }], syncTitle: [{ type: Input }], fixed: [{ type: Input }], fixedOffsetTop: [{ type: Input }], breadcrumb: [{ type: Input }], recursiveBreadcrumb: [{ type: Input }], logo: [{ type: Input }], action: [{ type: Input }], content: [{ type: Input }], extra: [{ type: Input }], tab: [{ type: Input }] }; __decorate([ InputBoolean(), __metadata("design:type", Object) ], PageHeaderComponent.prototype, "loading", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], PageHeaderComponent.prototype, "wide", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], PageHeaderComponent.prototype, "autoBreadcrumb", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], PageHeaderComponent.prototype, "autoTitle", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], PageHeaderComponent.prototype, "syncTitle", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], PageHeaderComponent.prototype, "fixed", void 0); __decorate([ InputNumber(), __metadata("design:type", Number) ], PageHeaderComponent.prototype, "fixedOffsetTop", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], PageHeaderComponent.prototype, "recursiveBreadcrumb", void 0); if (false) { /** @type {?} */ PageHeaderComponent.ngAcceptInputType_loading; /** @type {?} */ PageHeaderComponent.ngAcceptInputType_wide; /** @type {?} */ PageHeaderComponent.ngAcceptInputType_autoBreadcrumb; /** @type {?} */ PageHeaderComponent.ngAcceptInputType_autoTitle; /** @type {?} */ PageHeaderComponent.ngAcceptInputType_syncTitle; /** @type {?} */ PageHeaderComponent.ngAcceptInputType_fixed; /** @type {?} */ PageHeaderComponent.ngAcceptInputType_fixedOffsetTop; /** @type {?} */ PageHeaderComponent.ngAcceptInputType_recursiveBreadcrumb; /** @type {?} */ PageHeaderComponent.prototype.inited; /** * @type {?} * @private */ PageHeaderComponent.prototype.unsubscribe$; /** * @type {?} * @private */ PageHeaderComponent.prototype.conTpl; /** * @type {?} * @private */ PageHeaderComponent.prototype.affix; /** @type {?} */ PageHeaderComponent.prototype.isBrowser; /** @type {?} */ PageHeaderComponent.prototype._titleVal; /** @type {?} */ PageHeaderComponent.prototype.paths; /** @type {?} */ PageHeaderComponent.prototype._title; /** @type {?} */ PageHeaderComponent.prototype._titleTpl; /** @type {?} */ PageHeaderComponent.prototype.loading; /** @type {?} */ PageHeaderComponent.prototype.wide; /** @type {?} */ PageHeaderComponent.prototype.home; /** @type {?} */ PageHeaderComponent.prototype.homeLink; /** @type {?} */ PageHeaderComponent.prototype.homeI18n; /** @type {?} */ PageHeaderComponent.prototype.autoBreadcrumb; /** @type {?} */ PageHeaderComponent.prototype.autoTitle; /** @type {?} */ PageHeaderComponent.prototype.syncTitle; /** @type {?} */ PageHeaderComponent.prototype.fixed; /** @type {?} */ PageHeaderComponent.prototype.fixedOffsetTop; /** @type {?} */ PageHeaderComponent.prototype.breadcrumb; /** @type {?} */ PageHeaderComponent.prototype.recursiveBreadcrumb; /** @type {?} */ PageHeaderComponent.prototype.logo; /** @type {?} */ PageHeaderComponent.prototype.action; /** @type {?} */ PageHeaderComponent.prototype.content; /** @type {?} */ PageHeaderComponent.prototype.extra; /** @type {?} */ PageHeaderComponent.prototype.tab; /** * @type {?} * @private */ PageHeaderComponent.prototype.renderer; /** * @type {?} * @private */ PageHeaderComponent.prototype.router; /** * @type {?} * @private */ PageHeaderComponent.prototype.menuSrv; /** * @type {?} * @private */ PageHeaderComponent.prototype.i18nSrv; /** * @type {?} * @private */ PageHeaderComponent.prototype.titleSrv; /** * @type {?} * @private */ PageHeaderComponent.prototype.reuseSrv; /** * @type {?} * @private */ PageHeaderComponent.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L2FuZHJvaWQvQG9oYXlvanAvcGFja2FnZXMvY29tcG9uZW50cy9wYWdlLWhlYWRlci8iLCJzb3VyY2VzIjpbInBhZ2UtaGVhZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUlMLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFvQixnQkFBZ0IsRUFBUSxXQUFXLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwSCxPQUFPLEVBQUUsa0JBQWtCLEVBQWdCLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFlLE1BQU0sYUFBYSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFbkQsNkJBR0M7OztJQUZDLCtCQUFlOztJQUNmLDhCQUFnQjs7QUFXbEIsTUFBTSxPQUFPLG1CQUFtQjs7Ozs7Ozs7Ozs7Ozs7SUEyRDlCLFlBQ0UsUUFBeUIsRUFDakIsUUFBbUIsRUFDbkIsTUFBYyxFQUNkLE9BQW9CLEVBQ2tCLE9BQXlCLEVBQzdCLFFBQXNCLEVBQ25CLFFBQXlCLEVBQzlELEdBQXNCLEVBQzlCLFNBQTZCLEVBQzdCLFFBQWtCO1FBUlYsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNrQixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQzlELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBekRoQyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ1AsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRzNDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFNakIsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixVQUFLLEdBQXFCLEVBQUUsQ0FBQztRQWtCSixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFNBQUksR0FBRyxLQUFLLENBQUM7UUErQnBDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNwQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDbkMsSUFBSSxFQUFFLElBQUk7WUFDVixRQUFRLEVBQUUsR0FBRztZQUNiLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsU0FBUyxFQUFFLElBQUk7WUFDZixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxLQUFLO1lBQ1osY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE1BQU07YUFDWixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDNUIsTUFBTTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBQyxDQUN6RTthQUNBLFNBQVM7OztRQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLG1CQUFBLEVBQUUsRUFBTyxDQUFDLEVBQUMsQ0FBQztRQUV6RCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTs7O1FBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTs7OztRQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLGFBQWEsRUFBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQzthQUNqSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQyxTQUFTOzs7UUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUMsQ0FBQztJQUNyQyxDQUFDOzs7OztJQTVFRCxJQUFZLEtBQUs7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlFLENBQUM7Ozs7O0lBU0QsSUFDSSxLQUFLLENBQUMsS0FBaUM7UUFDekMsSUFBSSxLQUFLLFlBQVksV0FBVyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1NBQ3JCO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDOUI7SUFDSCxDQUFDOzs7O0lBeURELE9BQU87UUFDTCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDOzs7OztJQUVPLGFBQWE7UUFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDckUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsT0FBTztTQUNSOztjQUNLLEtBQUssR0FBcUIsRUFBRTtRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87Ozs7UUFBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCO2dCQUFFLE9BQU87O2dCQUM5RSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDckIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQVksRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQyxFQUFDLENBQUM7UUFDSCxXQUFXO1FBQ1gsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNqQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUk7Z0JBQ3hGLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDdEIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDOzs7Ozs7O0lBRU8sUUFBUTtRQUNkLElBQUksbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLFNBQVMsSUFBSSxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7a0JBQ3RGLElBQUksR0FBRyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLENBQUMsbUJBQUEsSUFBSSxFQUFBLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O2dCQUMxQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDckIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLE9BQU8sRUFBRTtnQkFDN0IsS0FBSyxHQUFHLG1CQUFBLElBQUksRUFBQSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsbUJBQUEsSUFBSSxFQUFBLENBQUMsU0FBUyxHQUFHLG1CQUFBLEtBQUssRUFBQyxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxTQUFTLElBQUksbUJBQUEsSUFBSSxFQUFBLENBQUMsU0FBUyxFQUFFO1lBQ3BDLElBQUksbUJBQUEsSUFBSSxFQUFBLENBQUMsUUFBUSxFQUFFO2dCQUNqQixtQkFBQSxJQUFJLEVBQUEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLG1CQUFBLElBQUksRUFBQSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3hDO1lBQ0QsSUFBSSxDQUFDLG1CQUFBLElBQUksRUFBQSxDQUFDLE1BQU0sSUFBSSxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pDLG1CQUFBLElBQUksRUFBQSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsU0FBUyxDQUFDO2FBQ3RDO1NBQ0Y7UUFFRCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVELFlBQVk7UUFDVixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNyRTthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDcEU7SUFDSCxDQUFDOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQzs7OztJQUVELFdBQVc7Y0FDSCxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUk7UUFDN0IsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7WUFsTEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxhQUFhO2dCQUN2QixRQUFRLEVBQUUsWUFBWTtnQkFDdEIseXJFQUEyQztnQkFDM0MsbUJBQW1CLEVBQUUsS0FBSztnQkFDMUIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07Z0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3RDOzs7O1lBbEIrRCxlQUFlO1lBUDdFLFNBQVM7WUFLYSxNQUFNO1lBRXFCLFdBQVc7NENBbUZ6RCxRQUFRLFlBQUksTUFBTSxTQUFDLGdCQUFnQjtZQW5GeUMsWUFBWSx1QkFvRnhGLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTtZQXJGM0IsZUFBZSx1QkFzRm5CLFFBQVEsWUFBSSxNQUFNLFNBQUMsZUFBZTtZQXJHckMsaUJBQWlCO1lBaUJWLGtCQUFrQjtZQXJCbEIsUUFBUTs7O3FCQW1EZCxTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtvQkFDckMsU0FBUyxTQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7b0JBY3BDLEtBQUs7c0JBWUwsS0FBSzttQkFDTCxLQUFLO21CQUNMLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLOzZCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO29CQUNMLEtBQUs7NkJBQ0wsS0FBSzt5QkFDTCxLQUFLO2tDQUNMLEtBQUs7bUJBQ0wsS0FBSztxQkFDTCxLQUFLO3NCQUNMLEtBQUs7b0JBQ0wsS0FBSztrQkFDTCxLQUFLOztBQWhCbUI7SUFBZixZQUFZLEVBQUU7O29EQUFpQjtBQUNoQjtJQUFmLFlBQVksRUFBRTs7aURBQWM7QUFJYjtJQUFmLFlBQVksRUFBRTs7MkRBQXlCO0FBQ3hCO0lBQWYsWUFBWSxFQUFFOztzREFBb0I7QUFDbkI7SUFBZixZQUFZLEVBQUU7O3NEQUFvQjtBQUNuQjtJQUFmLFlBQVksRUFBRTs7a0RBQWdCO0FBQ2hCO0lBQWQsV0FBVyxFQUFFOzsyREFBd0I7QUFFdEI7SUFBZixZQUFZLEVBQUU7O2dFQUE4Qjs7O0lBakR0RCw4Q0FBK0M7O0lBQy9DLDJDQUE0Qzs7SUFDNUMscURBQXNEOztJQUN0RCxnREFBaUQ7O0lBQ2pELGdEQUFpRDs7SUFDakQsNENBQTZDOztJQUM3QyxxREFBcUQ7O0lBQ3JELDBEQUEyRDs7SUFFM0QscUNBQWU7Ozs7O0lBQ2YsMkNBQTJDOzs7OztJQUMzQyxxQ0FBbUU7Ozs7O0lBQ25FLG9DQUF1RTs7SUFDdkUsd0NBQWlCOztJQU1qQix3Q0FBdUI7O0lBQ3ZCLG9DQUE2Qjs7SUFJN0IscUNBQXNCOztJQUN0Qix3Q0FBNkI7O0lBYTdCLHNDQUF5Qzs7SUFDekMsbUNBQXNDOztJQUN0QyxtQ0FBc0I7O0lBQ3RCLHVDQUEwQjs7SUFDMUIsdUNBQTBCOztJQUMxQiw2Q0FBaUQ7O0lBQ2pELHdDQUE0Qzs7SUFDNUMsd0NBQTRDOztJQUM1QyxvQ0FBd0M7O0lBQ3hDLDZDQUErQzs7SUFDL0MseUNBQXVDOztJQUN2QyxrREFBc0Q7O0lBQ3RELG1DQUFpQzs7SUFDakMscUNBQW1DOztJQUNuQyxzQ0FBb0M7O0lBQ3BDLG9DQUFrQzs7SUFDbEMsa0NBQWdDOzs7OztJQU05Qix1Q0FBMkI7Ozs7O0lBQzNCLHFDQUFzQjs7Ozs7SUFDdEIsc0NBQTRCOzs7OztJQUM1QixzQ0FBdUU7Ozs7O0lBQ3ZFLHVDQUFnRTs7Ozs7SUFDaEUsdUNBQXNFOzs7OztJQUN0RSxrQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFJldXNlVGFiU2VydmljZSB9IGZyb20gJ0BvaGF5by9jb21wb25lbnRzL3JldXNlLXRhYic7XG5pbXBvcnQgeyBPaGF5b0kxOE5TZXJ2aWNlLCBPSEFZT19JMThOX1RPS0VOLCBNZW51LCBNZW51U2VydmljZSwgU2V0dGluZ3NTZXJ2aWNlLCBUaXRsZVNlcnZpY2UgfSBmcm9tICdAb2hheW8vdGhlbWUnO1xuaW1wb3J0IHsgT2hheW9Db25maWdTZXJ2aWNlLCBCb29sZWFuSW5wdXQsIElucHV0Qm9vbGVhbiwgSW5wdXROdW1iZXIsIGlzRW1wdHksIE51bWJlcklucHV0IH0gZnJvbSAnQG9oYXlvL3V0aWwnO1xuaW1wb3J0IHsgTnpBZmZpeENvbXBvbmVudCB9IGZyb20gJ25nLXpvcnJvLWFudGQvYWZmaXgnO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbnRlcmZhY2UgUGFnZUhlYWRlclBhdGgge1xuICB0aXRsZT86IHN0cmluZztcbiAgbGluaz86IHN0cmluZ1tdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwYWdlLWhlYWRlcicsXG4gIGV4cG9ydEFzOiAncGFnZUhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZUhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbG9hZGluZzogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfd2lkZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfYXV0b0JyZWFkY3J1bWI6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2F1dG9UaXRsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfc3luY1RpdGxlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9maXhlZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZml4ZWRPZmZzZXRUb3A6IE51bWJlcklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfcmVjdXJzaXZlQnJlYWRjcnVtYjogQm9vbGVhbklucHV0O1xuXG4gIGluaXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2NvblRwbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIGNvblRwbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnYWZmaXgnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBhZmZpeDogTnpBZmZpeENvbXBvbmVudDtcbiAgaXNCcm93c2VyID0gdHJ1ZTtcblxuICBwcml2YXRlIGdldCBtZW51cygpOiBNZW51W10ge1xuICAgIHJldHVybiB0aGlzLm1lbnVTcnYuZ2V0UGF0aEJ5VXJsKHRoaXMucm91dGVyLnVybCwgdGhpcy5yZWN1cnNpdmVCcmVhZGNydW1iKTtcbiAgfVxuXG4gIF90aXRsZVZhbDogc3RyaW5nID0gJyc7XG4gIHBhdGhzOiBQYWdlSGVhZGVyUGF0aFtdID0gW107XG5cbiAgLy8gI3JlZ2lvbiBmaWVsZHNcblxuICBfdGl0bGU6IHN0cmluZyB8IG51bGw7XG4gIF90aXRsZVRwbDogVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpXG4gIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4pIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgdGhpcy5fdGl0bGUgPSBudWxsO1xuICAgICAgdGhpcy5fdGl0bGVUcGwgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX3RpdGxlVmFsID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gICAgICB0aGlzLl90aXRsZVZhbCA9IHRoaXMuX3RpdGxlO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBsb2FkaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB3aWRlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhvbWU6IHN0cmluZztcbiAgQElucHV0KCkgaG9tZUxpbms6IHN0cmluZztcbiAgQElucHV0KCkgaG9tZUkxOG46IHN0cmluZztcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGF1dG9CcmVhZGNydW1iOiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgYXV0b1RpdGxlOiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc3luY1RpdGxlOiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZml4ZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIGZpeGVkT2Zmc2V0VG9wOiBudW1iZXI7XG4gIEBJbnB1dCgpIGJyZWFkY3J1bWI6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgcmVjdXJzaXZlQnJlYWRjcnVtYjogYm9vbGVhbjtcbiAgQElucHV0KCkgbG9nbzogVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIGFjdGlvbjogVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIGNvbnRlbnQ6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBleHRyYTogVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIHRhYjogVGVtcGxhdGVSZWY8dm9pZD47XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNldHRpbmdzOiBTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBtZW51U3J2OiBNZW51U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE9IQVlPX0kxOE5fVE9LRU4pIHByaXZhdGUgaTE4blNydjogT2hheW9JMThOU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRpdGxlU2VydmljZSkgcHJpdmF0ZSB0aXRsZVNydjogVGl0bGVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUmV1c2VUYWJTZXJ2aWNlKSBwcml2YXRlIHJldXNlU3J2OiBSZXVzZVRhYlNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGNvbmZpZ1NydjogT2hheW9Db25maWdTZXJ2aWNlLFxuICAgIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgKSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBwbGF0Zm9ybS5pc0Jyb3dzZXI7XG4gICAgY29uZmlnU3J2LmF0dGFjaCh0aGlzLCAncGFnZUhlYWRlcicsIHtcbiAgICAgIGhvbWU6ICfpppbpobUnLFxuICAgICAgaG9tZUxpbms6ICcvJyxcbiAgICAgIGF1dG9CcmVhZGNydW1iOiB0cnVlLFxuICAgICAgcmVjdXJzaXZlQnJlYWRjcnVtYjogZmFsc2UsXG4gICAgICBhdXRvVGl0bGU6IHRydWUsXG4gICAgICBzeW5jVGl0bGU6IHRydWUsXG4gICAgICBmaXhlZDogZmFsc2UsXG4gICAgICBmaXhlZE9mZnNldFRvcDogNjQsXG4gICAgfSk7XG4gICAgc2V0dGluZ3Mubm90aWZ5XG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgICAgZmlsdGVyKHcgPT4gdGhpcy5hZmZpeCAmJiB3LnR5cGUgPT09ICdsYXlvdXQnICYmIHcubmFtZSA9PT0gJ2NvbGxhcHNlZCcpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFmZml4LnVwZGF0ZVBvc2l0aW9uKHt9IGFzIGFueSkpO1xuXG4gICAgbWVyZ2UobWVudVNydi5jaGFuZ2UucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5pbml0ZWQpKSwgcm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldiA9PiBldiBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKSwgaTE4blNydi5jaGFuZ2UpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlZnJlc2goKSk7XG4gIH1cblxuICByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0VGl0bGUoKS5nZW5CcmVhZGNydW1iKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5CcmVhZGNydW1iKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJyZWFkY3J1bWIgfHwgIXRoaXMuYXV0b0JyZWFkY3J1bWIgfHwgdGhpcy5tZW51cy5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy5wYXRocyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXRoczogUGFnZUhlYWRlclBhdGhbXSA9IFtdO1xuICAgIHRoaXMubWVudXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbS5oaWRlSW5CcmVhZGNydW1iICE9PSAndW5kZWZpbmVkJyAmJiBpdGVtLmhpZGVJbkJyZWFkY3J1bWIpIHJldHVybjtcbiAgICAgIGxldCB0aXRsZSA9IGl0ZW0udGV4dDtcbiAgICAgIGlmIChpdGVtLmkxOG4gJiYgdGhpcy5pMThuU3J2KSB0aXRsZSA9IHRoaXMuaTE4blNydi5mYW55aShpdGVtLmkxOG4pO1xuICAgICAgcGF0aHMucHVzaCh7IHRpdGxlLCBsaW5rOiAoaXRlbS5saW5rICYmIFtpdGVtLmxpbmtdKSBhcyBzdHJpbmdbXSB9KTtcbiAgICB9KTtcbiAgICAvLyBhZGQgaG9tZVxuICAgIGlmICh0aGlzLmhvbWUpIHtcbiAgICAgIHBhdGhzLnNwbGljZSgwLCAwLCB7XG4gICAgICAgIHRpdGxlOiAodGhpcy5ob21lSTE4biAmJiB0aGlzLmkxOG5TcnYgJiYgdGhpcy5pMThuU3J2LmZhbnlpKHRoaXMuaG9tZUkxOG4pKSB8fCB0aGlzLmhvbWUsXG4gICAgICAgIGxpbms6IFt0aGlzLmhvbWVMaW5rXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnBhdGhzID0gcGF0aHM7XG4gIH1cblxuICBwcml2YXRlIHNldFRpdGxlKCk6IHRoaXMge1xuICAgIGlmICh0aGlzLl90aXRsZSA9PSBudWxsICYmIHRoaXMuX3RpdGxlVHBsID09IG51bGwgJiYgdGhpcy5hdXRvVGl0bGUgJiYgdGhpcy5tZW51cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5tZW51c1t0aGlzLm1lbnVzLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IHRpdGxlID0gaXRlbS50ZXh0O1xuICAgICAgaWYgKGl0ZW0uaTE4biAmJiB0aGlzLmkxOG5TcnYpIHtcbiAgICAgICAgdGl0bGUgPSB0aGlzLmkxOG5TcnYuZmFueWkoaXRlbS5pMThuKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RpdGxlVmFsID0gdGl0bGUhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl90aXRsZVZhbCAmJiB0aGlzLnN5bmNUaXRsZSkge1xuICAgICAgaWYgKHRoaXMudGl0bGVTcnYpIHtcbiAgICAgICAgdGhpcy50aXRsZVNydi5zZXRUaXRsZSh0aGlzLl90aXRsZVZhbCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaW5pdGVkICYmIHRoaXMucmV1c2VTcnYpIHtcbiAgICAgICAgdGhpcy5yZXVzZVNydi50aXRsZSA9IHRoaXMuX3RpdGxlVmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2hlY2tDb250ZW50KCk6IHZvaWQge1xuICAgIGlmIChpc0VtcHR5KHRoaXMuY29uVHBsLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmNvblRwbC5uYXRpdmVFbGVtZW50LCAnaGlkZGVuJywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmNvblRwbC5uYXRpdmVFbGVtZW50LCAnaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy5pbml0ZWQgPSB0cnVlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tDb250ZW50KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0ZWQpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgdW5zdWJzY3JpYmUkIH0gPSB0aGlzO1xuICAgIHVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==