UNPKG

tp-window

Version:
195 lines (185 loc) 16.4 kB
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 */ class WindowStateComponent { } WindowStateComponent.decorators = [ { type: Component, args: [{ selector: 'tp-window-state', template: ` <ng-template #templateRef> <ng-content></ng-content> </ng-template> `, inputs: ['name', 'icon', 'type'] },] }, ]; WindowStateComponent.propDecorators = { templateRef: [{ type: ViewChild, args: ['templateRef',] }], type: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ const /** @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 */ class WindowComponent { constructor() { this.maxStateNumber = 5; this.stateChange = new EventEmitter(); this.isShowLoading = false; } /** * @param {?} loading * @return {?} */ set loading(loading) { if (loading) { this.isShowLoading = true; loading.subscribe(() => { this.isShowLoading = false; }); } } /** * @param {?} portal * @return {?} */ setPortal(portal) { this.optionPortal = portal; } /** * @return {?} */ ngAfterContentInit() { this.currentState = this.states.first; } /** * @param {?} state * @return {?} */ navigate(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"> <mat-toolbar> <p class="mat-body-2 toolbar-title">{{name}}</p> <div class="toolbar-flex"></div> <ng-template [cdkPortalOutlet]="optionPortal"></ng-template> <ng-template [ngIf]="states.length <= maxStateNumber"> <ng-container *ngFor="let state of states"> <button *ngIf="state.type !== 'Content'" mat-icon-button (click)="navigate(state)" matTooltip="{{state.name}}"> <mat-icon>{{state.icon}}</mat-icon> </button> </ng-container> </ng-template> <ng-template [ngIf]="states.length > maxStateNumber"> <ng-container *ngFor="let state of states"> <button *ngIf="state.type === 'Button'" mat-icon-button (click)="navigate(state)" matTooltip="{{state.name}}"> <mat-icon>{{state.icon}}</mat-icon> </button> </ng-container> <button mat-icon-button [matMenuTriggerFor]="menu"> <mat-icon>more_horiz</mat-icon> </button> <mat-menu #menu="matMenu"> <ng-container *ngFor="let state of states"> <button *ngIf="state.type === 'State'" mat-menu-item (click)="navigate(state)"> <mat-icon>{{state.icon}}</mat-icon> <span>{{state.name}}</span> </button> </ng-container> </mat-menu> </ng-template> </mat-toolbar> <div class="loading"> <mat-progress-bar *ngIf="isShowLoading" [@fadeOut]="'in'" mode="indeterminate" color="primary"></mat-progress-bar> </div> <div class="content padding"> <div *ngTemplateOutlet="currentState.templateRef"></div> </div> <ng-content></ng-content> </div> `, 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 }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class WindowModule { } WindowModule.decorators = [ { type: NgModule, args: [{ imports: [ PortalModule, MatMenuModule, MatProgressBarModule, MatButtonModule, MatIconModule, MatTooltipModule, CommonModule, MatToolbarModule ], declarations: [WindowComponent, WindowStateComponent], exports: [WindowComponent, WindowStateComponent] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** @enum {number} */ const 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+KSB7XG4gICAgdGhpcy5vcHRpb25Qb3J0YWwgPSBwb3J0YWw7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlcy5maXJzdDtcbiAgfVxuXG4gIG5hdmlnYXRlKHN0YXRlOiBXaW5kb3dTdGF0ZUNvbXBvbmVudCkge1xuICAgIGlmKHN0YXRlLnR5cGUgIT09ICdCdXR0b24nKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFdpbmRvd0NvbXBvbmVudCB9IGZyb20gJy4vdHAtd2luZG93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaW5kb3dTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdHAtd2luZG93LnN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRUb29sYmFyTW9kdWxlLCBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgUG9ydGFsTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0VG9vbGJhck1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1dpbmRvd0NvbXBvbmVudCwgV2luZG93U3RhdGVDb21wb25lbnRdLFxuICBleHBvcnRzOiBbV2luZG93Q29tcG9uZW50LCBXaW5kb3dTdGF0ZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgV2luZG93TW9kdWxlIHsgfVxuIiwiZXhwb3J0ICogZnJvbSAnLi9saWIvdHAtd2luZG93LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90cC13aW5kb3cubW9kdWxlJztcbmV4cG9ydCBlbnVtIHN0YXRlVHlwZSB7XG4gIEJ1dHRvbiwgQ29udGVudCwgU3RhdGVcbn1cbiJdLCJuYW1lcyI6WyJzdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7OztZQUdDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixRQUFRLEVBQUU7Ozs7R0FJVDtnQkFDRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQzthQUNqQzs7OzBCQUlFLFNBQVMsU0FBQyxhQUFhO21CQUN2QixLQUFLOzs7Ozs7O0FDaEJSLHVCQVNhLGdCQUFnQixHQUE0QixPQUFPLENBQUMsU0FBUyxFQUFFO0lBQzFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDaEMsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUN0QixPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7Q0FDSCxDQUFDOzs7Ozs7QUNkRjs7OEJBNkVvQyxDQUFDOzJCQUV5QixJQUFJLFlBQVksRUFBd0I7NkJBRzNFLEtBQUs7Ozs7OztJQWQ5QixJQUNJLE9BQU8sQ0FBQyxPQUF1QjtRQUNqQyxJQUFHLE9BQU8sRUFBRTtZQUNWLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzVCLENBQUMsQ0FBQztTQUNKO0tBQ0Y7Ozs7O0lBUUQsU0FBUyxDQUFDLE1BQW1CO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0tBQzVCOzs7O0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7S0FDdkM7Ozs7O0lBRUQsUUFBUSxDQUFDQSxRQUEyQjtRQUNsQyxJQUFHQSxRQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHQSxRQUFLLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQ0EsUUFBSyxDQUFDLENBQUM7S0FDOUI7OztZQWpGRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F5Q1g7Z0JBQ0MsTUFBTSxFQUFFLENBQUMsd1lBQXdZLENBQUM7Z0JBQ2xaLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztnQkFDaEIsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2FBQy9COzs7eUJBRUUsU0FBUyxTQUFDLGVBQWU7cUJBQ3pCLGVBQWUsU0FBQyxvQkFBb0I7c0JBQ3BDLEtBQUs7NkJBU0wsS0FBSzsyQkFDTCxLQUFLOzBCQUNMLE1BQU07Ozs7Ozs7QUMvRVQ7OztZQVdDLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUU7b0JBQ1AsWUFBWTtvQkFDWixhQUFhO29CQUNiLG9CQUFvQjtvQkFDcEIsZUFBZTtvQkFDZixhQUFhO29CQUNiLGdCQUFnQjtvQkFDaEIsWUFBWTtvQkFDWixnQkFBZ0I7aUJBQUM7Z0JBQ25CLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQztnQkFDckQsT0FBTyxFQUFFLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDO2FBQ2pEOzs7Ozs7O0FDdkJEOzs7Ozs7Ozs7Ozs7Ozs7OzsifQ==