tp-window
Version:
ThingsPro window component UI
173 lines (165 loc) • 17.5 kB
JavaScript
import { Component, ViewChild, Input, ContentChildren, Output, EventEmitter, NgModule } from '@angular/core';
import { trigger, state, style, animate, transition } from '@angular/animations';
import { PortalModule } from '@angular/cdk/portal';
import 'rxjs';
import { CommonModule } from '@angular/common';
import { MatToolbarModule, MatTooltipModule } from '@angular/material';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatMenuModule } from '@angular/material/menu';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var WindowStateComponent = /** @class */ (function () {
function WindowStateComponent() {
}
WindowStateComponent.decorators = [
{ type: Component, args: [{
selector: 'tp-window-state',
template: "\n <ng-template #templateRef>\n <ng-content></ng-content>\n </ng-template>\n ",
inputs: ['name', 'icon', 'type']
},] },
];
WindowStateComponent.propDecorators = {
templateRef: [{ type: ViewChild, args: ['templateRef',] }],
type: [{ type: Input }]
};
return WindowStateComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ fadeOutAnimation = trigger('fadeOut', [
state('in', style({ opacity: 1 })),
transition('* => void', [
animate(500, style({ opacity: 0 }))
])
]);
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var WindowComponent = /** @class */ (function () {
function WindowComponent() {
this.maxStateNumber = 5;
this.stateChange = new EventEmitter();
this.isShowLoading = false;
}
Object.defineProperty(WindowComponent.prototype, "loading", {
set: /**
* @param {?} loading
* @return {?}
*/
function (loading) {
var _this = this;
if (loading) {
this.isShowLoading = true;
loading.subscribe(function () {
_this.isShowLoading = false;
});
}
},
enumerable: true,
configurable: true
});
/**
* @param {?} portal
* @return {?}
*/
WindowComponent.prototype.setPortal = /**
* @param {?} portal
* @return {?}
*/
function (portal) {
this.optionPortal = portal;
};
/**
* @return {?}
*/
WindowComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.currentState = this.states.first;
};
/**
* @param {?} state
* @return {?}
*/
WindowComponent.prototype.navigate = /**
* @param {?} state
* @return {?}
*/
function (state$$1) {
if (state$$1.type !== 'Button') {
this.currentState = state$$1;
}
this.stateChange.emit(state$$1);
};
WindowComponent.decorators = [
{ type: Component, args: [{
selector: 'tp-window',
template: "<div class=\"tp-window\">\n <mat-toolbar>\n <p class=\"mat-body-2 toolbar-title\">{{name}}</p>\n <div class=\"toolbar-flex\"></div>\n <ng-template [cdkPortalOutlet]=\"optionPortal\"></ng-template>\n <ng-template [ngIf]=\"states.length <= maxStateNumber\">\n <ng-container *ngFor=\"let state of states\">\n <button *ngIf=\"state.type !== 'Content'\" mat-icon-button (click)=\"navigate(state)\" matTooltip=\"{{state.name}}\">\n <mat-icon>{{state.icon}}</mat-icon>\n </button>\n </ng-container>\n </ng-template>\n\n <ng-template [ngIf]=\"states.length > maxStateNumber\">\n <ng-container *ngFor=\"let state of states\">\n <button *ngIf=\"state.type === 'Button'\" mat-icon-button (click)=\"navigate(state)\" matTooltip=\"{{state.name}}\">\n <mat-icon>{{state.icon}}</mat-icon>\n </button>\n </ng-container>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <ng-container *ngFor=\"let state of states\">\n <button *ngIf=\"state.type === 'State'\" mat-menu-item (click)=\"navigate(state)\">\n <mat-icon>{{state.icon}}</mat-icon>\n <span>{{state.name}}</span>\n </button>\n </ng-container>\n </mat-menu>\n </ng-template>\n\n </mat-toolbar>\n <div class=\"loading\">\n <mat-progress-bar *ngIf=\"isShowLoading\" [@fadeOut]=\"'in'\" mode=\"indeterminate\" color=\"primary\"></mat-progress-bar>\n </div>\n <div class=\"content padding\">\n <div *ngTemplateOutlet=\"currentState.templateRef\"></div>\n </div>\n <ng-content></ng-content>\n</div>\n",
styles: [".tp-window{box-shadow:0 1px 3px 0 rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}.tp-window mat-toolbar .toolbar-title{color:#9e9e9e}.tp-window mat-toolbar .toolbar-flex{flex:1}.tp-window button{color:#9e9e9e;transition:background ease-out .2s}.tp-window button:hover{background-color:#e0e0e0}.tp-window .padding{padding:1em 1.5em}.tp-window .loading{height:10px}"],
inputs: ['name'],
exportAs: 'tpWindow',
animations: [fadeOutAnimation]
},] },
];
WindowComponent.propDecorators = {
loadingRef: [{ type: ViewChild, args: ['loadingPortal',] }],
states: [{ type: ContentChildren, args: [WindowStateComponent,] }],
loading: [{ type: Input }],
maxStateNumber: [{ type: Input }],
optionPortal: [{ type: Input }],
stateChange: [{ type: Output }]
};
return WindowComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var WindowModule = /** @class */ (function () {
function WindowModule() {
}
WindowModule.decorators = [
{ type: NgModule, args: [{
imports: [
PortalModule,
MatMenuModule,
MatProgressBarModule,
MatButtonModule,
MatIconModule,
MatTooltipModule,
CommonModule,
MatToolbarModule
],
declarations: [WindowComponent, WindowStateComponent],
exports: [WindowComponent, WindowStateComponent]
},] },
];
return WindowModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/** @enum {number} */
var stateType = {
Button: 0,
Content: 1,
State: 2,
};
stateType[stateType.Button] = "Button";
stateType[stateType.Content] = "Content";
stateType[stateType.State] = "State";
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { stateType, WindowComponent, WindowModule, fadeOutAnimation as ɵb, WindowStateComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtd2luZG93LmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly90cC13aW5kb3cvbGliL3RwLXdpbmRvdy5zdGF0ZS5jb21wb25lbnQudHMiLCJuZzovL3RwLXdpbmRvdy9saWIvdHAtd2luZG93LmFuaW1hdGlvbi50cyIsIm5nOi8vdHAtd2luZG93L2xpYi90cC13aW5kb3cuY29tcG9uZW50LnRzIiwibmc6Ly90cC13aW5kb3cvbGliL3RwLXdpbmRvdy5tb2R1bGUudHMiLCJuZzovL3RwLXdpbmRvdy9wdWJsaWNfYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCB0eXBlIHN0YXRlVHlwZSA9ICdCdXR0b24nIHwgJ0NvbnRlbnQnIHwgJ1N0YXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndHAtd2luZG93LXN0YXRlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlUmVmPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGlucHV0czogWyduYW1lJywgJ2ljb24nLCAndHlwZSddXG59KVxuXG5leHBvcnQgY2xhc3MgV2luZG93U3RhdGVDb21wb25lbnQge1xuXG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlUmVmJykgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpXG4gIHR5cGU6IHN0YXRlVHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQge1xuICB0cmlnZ2VyLFxuICBzdGF0ZSxcbiAgc3R5bGUsXG4gIGFuaW1hdGUsXG4gIHRyYW5zaXRpb24sXG4gIEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YVxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGNvbnN0IGZhZGVPdXRBbmltYXRpb246QW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhID0gdHJpZ2dlcignZmFkZU91dCcsIFtcbiAgc3RhdGUoJ2luJywgc3R5bGUoe29wYWNpdHk6IDF9KSksXG4gIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIFtcbiAgICBhbmltYXRlKDUwMCwgc3R5bGUoe29wYWNpdHk6IDB9KSlcbiAgXSlcbl0pXG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENka1BvcnRhbE91dGxldCwgUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBXaW5kb3dTdGF0ZUNvbXBvbmVudCxzdGF0ZVR5cGUgfSBmcm9tICcuL3RwLXdpbmRvdy5zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmFkZU91dEFuaW1hdGlvbiB9IGZyb20gJy4vdHAtd2luZG93LmFuaW1hdGlvbic7XG5leHBvcnQgeyBzdGF0ZVR5cGUgfSBmcm9tICcuL3RwLXdpbmRvdy5zdGF0ZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0cC13aW5kb3cnLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJ0cC13aW5kb3dcIj5cbiAgPG1hdC10b29sYmFyPlxuICAgIDxwIGNsYXNzPVwibWF0LWJvZHktMiB0b29sYmFyLXRpdGxlXCI+e3tuYW1lfX08L3A+XG4gICAgPGRpdiBjbGFzcz1cInRvb2xiYXItZmxleFwiPjwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlIFtjZGtQb3J0YWxPdXRsZXRdPVwib3B0aW9uUG9ydGFsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzdGF0ZXMubGVuZ3RoIDw9IG1heFN0YXRlTnVtYmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YXRlIG9mIHN0YXRlc1wiPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzdGF0ZS50eXBlICE9PSAnQ29udGVudCdcIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cIm5hdmlnYXRlKHN0YXRlKVwiIG1hdFRvb2x0aXA9XCJ7e3N0YXRlLm5hbWV9fVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7c3RhdGUuaWNvbn19PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic3RhdGVzLmxlbmd0aCA+IG1heFN0YXRlTnVtYmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YXRlIG9mIHN0YXRlc1wiPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzdGF0ZS50eXBlID09PSAnQnV0dG9uJ1wiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGUoc3RhdGUpXCIgbWF0VG9vbHRpcD1cInt7c3RhdGUubmFtZX19XCI+XG4gICAgICAgICAgICA8bWF0LWljb24+e3tzdGF0ZS5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cbiAgICAgICAgICA8bWF0LWljb24+bW9yZV9ob3JpejwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhdGUgb2Ygc3RhdGVzXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic3RhdGUudHlwZSA9PT0gJ1N0YXRlJ1wiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm5hdmlnYXRlKHN0YXRlKVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdGF0ZS5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3Bhbj57e3N0YXRlLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L21hdC1tZW51PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICA8L21hdC10b29sYmFyPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZ1wiPlxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiaXNTaG93TG9hZGluZ1wiIFtAZmFkZU91dF09XCInaW4nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29udGVudCBwYWRkaW5nXCI+XG4gICAgPGRpdiAqbmdUZW1wbGF0ZU91dGxldD1cImN1cnJlbnRTdGF0ZS50ZW1wbGF0ZVJlZlwiPjwvZGl2PlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5gLFxuICBzdHlsZXM6IFtgLnRwLXdpbmRvd3tib3gtc2hhZG93OjAgMXB4IDNweCAwIHJnYmEoMCwwLDAsLjIpLDAgMXB4IDFweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDJweCAxcHggLTFweCByZ2JhKDAsMCwwLC4xMil9LnRwLXdpbmRvdyBtYXQtdG9vbGJhciAudG9vbGJhci10aXRsZXtjb2xvcjojOWU5ZTllfS50cC13aW5kb3cgbWF0LXRvb2xiYXIgLnRvb2xiYXItZmxleHtmbGV4OjF9LnRwLXdpbmRvdyBidXR0b257Y29sb3I6IzllOWU5ZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgZWFzZS1vdXQgLjJzfS50cC13aW5kb3cgYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2UwZTBlMH0udHAtd2luZG93IC5wYWRkaW5ne3BhZGRpbmc6MWVtIDEuNWVtfS50cC13aW5kb3cgLmxvYWRpbmd7aGVpZ2h0OjEwcHh9YF0sXG4gIGlucHV0czogWyduYW1lJ10sXG4gIGV4cG9ydEFzOiAndHBXaW5kb3cnLFxuICBhbmltYXRpb25zOiBbZmFkZU91dEFuaW1hdGlvbl1cbn0pXG5leHBvcnQgY2xhc3MgV2luZG93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2xvYWRpbmdQb3J0YWwnKSBsb2FkaW5nUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkcmVuKFdpbmRvd1N0YXRlQ29tcG9uZW50KSBzdGF0ZXM6IFF1ZXJ5TGlzdDxXaW5kb3dTdGF0ZUNvbXBvbmVudD47XG4gIEBJbnB1dCgpXG4gIHNldCBsb2FkaW5nKGxvYWRpbmc6T2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgaWYobG9hZGluZykge1xuICAgICAgdGhpcy5pc1Nob3dMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIGxvYWRpbmcuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1Nob3dMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgQElucHV0KCkgbWF4U3RhdGVOdW1iZXI6IG51bWJlciA9IDU7XG4gIEBJbnB1dCgpIG9wdGlvblBvcnRhbDogUG9ydGFsPGFueT4gfCB1bmRlZmluZWQ7XG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPFdpbmRvd1N0YXRlQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8V2luZG93U3RhdGVDb21wb25lbnQ+KCk7XG4gIG5hbWU6IHN0cmluZztcbiAgY3VycmVudFN0YXRlOiBXaW5kb3dTdGF0ZUNvbXBvbmVudDtcbiAgaXNTaG93TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNldFBvcnRhbChwb3J0YWw6IFBvcnRhbDxhbnk+KSB7XG4gICAgdGhpcy5vcHRpb25Qb3J0YWwgPSBwb3J0YWw7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlcy5maXJzdDtcbiAgfVxuXG4gIG5hdmlnYXRlKHN0YXRlOiBXaW5kb3dTdGF0ZUNvbXBvbmVudCkge1xuICAgIGlmKHN0YXRlLnR5cGUgIT09ICdCdXR0b24nKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFdpbmRvd0NvbXBvbmVudCB9IGZyb20gJy4vdHAtd2luZG93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaW5kb3dTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdHAtd2luZG93LnN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRUb29sYmFyTW9kdWxlLCBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgUG9ydGFsTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0VG9vbGJhck1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1dpbmRvd0NvbXBvbmVudCwgV2luZG93U3RhdGVDb21wb25lbnRdLFxuICBleHBvcnRzOiBbV2luZG93Q29tcG9uZW50LCBXaW5kb3dTdGF0ZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgV2luZG93TW9kdWxlIHsgfVxuIiwiZXhwb3J0ICogZnJvbSAnLi9saWIvdHAtd2luZG93LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90cC13aW5kb3cubW9kdWxlJztcbmV4cG9ydCBlbnVtIHN0YXRlVHlwZSB7XG4gIEJ1dHRvbiwgQ29udGVudCwgU3RhdGVcbn1cbiJdLCJuYW1lcyI6WyJzdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Z0JBR0MsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRSwyRkFJVDtvQkFDRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztpQkFDakM7Ozs4QkFJRSxTQUFTLFNBQUMsYUFBYTt1QkFDdkIsS0FBSzs7K0JBaEJSOzs7Ozs7O0FDQUEscUJBU2EsZ0JBQWdCLEdBQTRCLE9BQU8sQ0FBQyxTQUFTLEVBQUU7SUFDMUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNoQyxVQUFVLENBQUMsV0FBVyxFQUFFO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7S0FDbEMsQ0FBQztDQUNILENBQUM7Ozs7OztBQ2RGOzs4QkE2RW9DLENBQUM7MkJBRXlCLElBQUksWUFBWSxFQUF3Qjs2QkFHM0UsS0FBSzs7SUFkOUIsc0JBQ0ksb0NBQU87Ozs7O1FBRFgsVUFDWSxPQUF1QjtZQURuQyxpQkFRQztZQU5DLElBQUcsT0FBTyxFQUFFO2dCQUNWLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixPQUFPLENBQUMsU0FBUyxDQUFDO29CQUNoQixLQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztpQkFDNUIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjs7O09BQUE7Ozs7O0lBUUQsbUNBQVM7Ozs7SUFBVCxVQUFVLE1BQW1CO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0tBQzVCOzs7O0lBRUQsNENBQWtCOzs7SUFBbEI7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0tBQ3ZDOzs7OztJQUVELGtDQUFROzs7O0lBQVIsVUFBU0EsUUFBMkI7UUFDbEMsSUFBR0EsUUFBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBR0EsUUFBSyxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUNBLFFBQUssQ0FBQyxDQUFDO0tBQzlCOztnQkFqRkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxXQUFXO29CQUNyQixRQUFRLEVBQUUsMnREQXlDWDtvQkFDQyxNQUFNLEVBQUUsQ0FBQyx3WUFBd1ksQ0FBQztvQkFDbFosTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO29CQUNoQixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQy9COzs7NkJBRUUsU0FBUyxTQUFDLGVBQWU7eUJBQ3pCLGVBQWUsU0FBQyxvQkFBb0I7MEJBQ3BDLEtBQUs7aUNBU0wsS0FBSzsrQkFDTCxLQUFLOzhCQUNMLE1BQU07OzBCQS9FVDs7Ozs7OztBQ0FBOzs7O2dCQVdDLFFBQVEsU0FBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixnQkFBZ0I7cUJBQUM7b0JBQ25CLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQztvQkFDckQsT0FBTyxFQUFFLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDO2lCQUNqRDs7dUJBdkJEOzs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9