ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
161 lines • 27.7 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ContentChild, EventEmitter, forwardRef, ViewChild, ViewEncapsulation } from '@angular/core';
import { OAppHeaderBase } from '../../components/app-header/o-app-header-base.class';
import { OAppSidenavBase } from '../../components/app-sidenav/o-app-sidenav-base.class';
import { OUserInfoConfigurationDirective } from '../../components/user-info/user-info-configuration/o-user-info-configuration.directive';
import { BooleanInputConverter } from '../../decorators/input-converter';
import { Codes } from '../../util/codes';
import { Util } from '../../util/util';
import { OAppLayoutBase } from './o-app-layout-base.class';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/material/icon";
import * as i3 from "../../components/app-sidenav/o-app-sidenav.component";
import * as i4 from "../../components/app-header/o-app-header.component";
export const DEFAULT_INPUTS_O_APP_LAYOUT = [
'mode',
'sidenavMode: sidenav-mode',
'sidenavOpened: sidenav-opened',
'_showHeader: show-header',
'showUserInfo: show-user-info',
'showLanguageSelector: show-language-selector',
'useFlagIcons: use-flag-icons',
'openedSidenavImg: opened-sidenav-image',
'closedSidenavImg: closed-sidenav-image',
'headerColor: header-color',
'headerHeight: header-height',
'showTitle: show-title',
'staticTitle: static-title',
'showStaticTitle: show-static-title',
'tooltipDisplayMode: tooltip-display-mode',
'showEllipsisMenu: show-ellipsis-menu'
];
export const DEFAULT_OUTPUTS_O_APP_LAYOUT = [
'beforeOpenSidenav',
'afterOpenSidenav',
'beforeCloseSidenav',
'afterCloseSidenav'
];
export class OAppLayoutComponent {
constructor() {
this.sidenavOpened = true;
this.showUserInfo = true;
this.showLanguageSelector = true;
this.useFlagIcons = false;
this._showHeader = true;
this.showTitle = false;
this.showStaticTitle = false;
this.showEllipsisMenu = false;
this.headerHeight = Codes.DEFAULT_ROW_HEIGHT;
this.beforeOpenSidenav = new EventEmitter();
this.afterOpenSidenav = new EventEmitter();
this.beforeCloseSidenav = new EventEmitter();
this.afterCloseSidenav = new EventEmitter();
this._tooltipDisplayMode = Codes.TOOLTIP_DISPLAY_COLLAPSED;
}
get showHeader() {
return this._showHeader;
}
set showHeader(val) {
this._showHeader = val;
}
get mode() {
return this._mode;
}
set mode(val) {
const m = Codes.OAppLayoutModes.find(e => e === val);
if (Util.isDefined(m)) {
this._mode = m;
if (this._mode === 'mobile' && !Util.isDefined(this.showHeader)) {
this.showHeader = true;
}
}
else {
console.error('Invalid `o-app-layout` mode (' + val + ')');
}
}
get sidenavMode() {
return this._sidenavMode;
}
set sidenavMode(val) {
const m = Codes.OSidenavModes.find(e => e === val);
if (Util.isDefined(m)) {
this._sidenavMode = m;
}
else {
console.error('Invalid `o-app-layout` sidenav-mode (' + val + ')');
}
}
get tooltipDisplayMode() {
return this._tooltipDisplayMode;
}
set tooltipDisplayMode(val) {
const m = Codes.TOOLTIP_DISPLAY_MODE.find(e => e.toLocaleLowerCase() === val);
if (Util.isDefined(m)) {
this._tooltipDisplayMode = m;
}
}
sidenavToggle(opened) {
opened ? this.beforeOpenSidenav.emit() : this.beforeCloseSidenav.emit();
}
afterToggle(opened) {
opened ? this.afterOpenSidenav.emit() : this.afterCloseSidenav.emit();
}
ngAfterViewInit() {
if (this.appHeader && this.appHeader.userInfo) {
this.appHeader.userInfo.registerUserInfoConfiguration(this.userInfoConfiguration);
}
}
}
OAppLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OAppLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
OAppLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OAppLayoutComponent, selector: "o-app-layout", inputs: { mode: "mode", sidenavMode: ["sidenav-mode", "sidenavMode"], sidenavOpened: ["sidenav-opened", "sidenavOpened"], _showHeader: ["show-header", "_showHeader"], showUserInfo: ["show-user-info", "showUserInfo"], showLanguageSelector: ["show-language-selector", "showLanguageSelector"], useFlagIcons: ["use-flag-icons", "useFlagIcons"], openedSidenavImg: ["opened-sidenav-image", "openedSidenavImg"], closedSidenavImg: ["closed-sidenav-image", "closedSidenavImg"], headerColor: ["header-color", "headerColor"], headerHeight: ["header-height", "headerHeight"], showTitle: ["show-title", "showTitle"], staticTitle: ["static-title", "staticTitle"], showStaticTitle: ["show-static-title", "showStaticTitle"], tooltipDisplayMode: ["tooltip-display-mode", "tooltipDisplayMode"], showEllipsisMenu: ["show-ellipsis-menu", "showEllipsisMenu"] }, outputs: { beforeOpenSidenav: "beforeOpenSidenav", afterOpenSidenav: "afterOpenSidenav", beforeCloseSidenav: "beforeCloseSidenav", afterCloseSidenav: "afterCloseSidenav" }, providers: [
{ provide: OAppLayoutBase, useExisting: forwardRef(() => OAppLayoutComponent) }
], queries: [{ propertyName: "userInfoConfiguration", first: true, predicate: OUserInfoConfigurationDirective, descendants: true }], viewQueries: [{ propertyName: "appSidenav", first: true, predicate: ["appSidenav"], descendants: true }, { propertyName: "appHeader", first: true, predicate: ["appHeader"], descendants: true }], ngImport: i0, template: "<o-app-sidenav #appSidenav [sidenav-mode]=\"sidenavMode\" [opened]=\"sidenavOpened\" [show-user-info]=\"showUserInfo\" [show-toggle-button]=\"!showHeader\"\n [opened-sidenav-image]=\"openedSidenavImg\" [closed-sidenav-image]=\"closedSidenavImg\" [layout-mode]=\"mode\" [class.header-layout]=\"showHeader\"\n [show-ellipsis-menu] = \"showEllipsisMenu\" (onSidenavToggle)=\"sidenavToggle($event)\" (afterSidenavToggle)=\"afterToggle($event)\">\n\n <ng-content select=\"o-app-layout-sidenav[position=start]\" ngProjectAs=\"o-app-layout-sidenav-projection-start\">\n </ng-content>\n <ng-content select=\"o-app-layout-sidenav[position=end]\" ngProjectAs=\"o-app-layout-sidenav-projection-end\">\n </ng-content>\n <ng-content select=\"o-app-layout-sidenav\" ngProjectAs=\"o-app-layout-sidenav-projection-end\"></ng-content>\n\n <o-app-header #appHeader *ngIf=\"showHeader\" [show-title]=\"showTitle\" [show-static-title]=\"showStaticTitle\" [static-title]=\"staticTitle\"\n [show-user-info]=\"showUserInfo\" [show-language-selector]=\"showLanguageSelector\" [use-flag-icons]=\"useFlagIcons\"\n (onSidenavToggle)=\"appSidenav.toggleSidenav()\" [color]=\"headerColor\" [header-height]=\"headerHeight\">\n <mat-icon class=\"sidenav-toggle\" svgIcon=\"ontimize:menu\" (click)=\"appSidenav.toggleSidenav()\" *ngIf=\"appSidenav.isMobileMode()\"></mat-icon>\n <ng-content select=\"o-app-layout-header[position=start]\" ngProjectAs=\"o-app-layout-header-projection-start\">\n </ng-content>\n <ng-content select=\"o-app-layout-header[position=end]\" ngProjectAs=\"o-app-layout-header-projection-end\">\n </ng-content>\n <ng-content select=\"o-app-layout-header\" ngProjectAs=\"o-app-layout-header-projection-start\"></ng-content>\n </o-app-header>\n\n <div class=\"application-layout-content-wrapper\" [class.header-layout]=\"showHeader\">\n <ng-content></ng-content>\n </div>\n</o-app-sidenav>\n", styles: [".application-layout-content-wrapper{z-index:1;position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;padding:16px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.OAppSidenavComponent, selector: "o-app-sidenav", inputs: ["opened", "show-user-info", "show-toggle-button", "opened-sidenav-image", "closed-sidenav-image", "layout-mode", "sidenav-mode", "store-state", "show-ellipsis-menu"], outputs: ["onSidenavOpenedChange", "onSidenavOpenedStart", "onSidenavClosedStart", "onSidenavToggle", "afterSidenavToggle"] }, { kind: "component", type: i4.OAppHeaderComponent, selector: "o-app-header", inputs: ["show-user-info", "show-language-selector", "use-flag-icons", "color", "header-height", "show-title", "static-title", "show-static-title"], outputs: ["onSidenavToggle"] }], encapsulation: i0.ViewEncapsulation.None });
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "sidenavOpened", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "showUserInfo", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "showLanguageSelector", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "useFlagIcons", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "_showHeader", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "showTitle", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "showStaticTitle", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OAppLayoutComponent.prototype, "showEllipsisMenu", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OAppLayoutComponent, decorators: [{
type: Component,
args: [{ selector: 'o-app-layout', inputs: DEFAULT_INPUTS_O_APP_LAYOUT, outputs: DEFAULT_OUTPUTS_O_APP_LAYOUT, encapsulation: ViewEncapsulation.None, providers: [
{ provide: OAppLayoutBase, useExisting: forwardRef(() => OAppLayoutComponent) }
], template: "<o-app-sidenav #appSidenav [sidenav-mode]=\"sidenavMode\" [opened]=\"sidenavOpened\" [show-user-info]=\"showUserInfo\" [show-toggle-button]=\"!showHeader\"\n [opened-sidenav-image]=\"openedSidenavImg\" [closed-sidenav-image]=\"closedSidenavImg\" [layout-mode]=\"mode\" [class.header-layout]=\"showHeader\"\n [show-ellipsis-menu] = \"showEllipsisMenu\" (onSidenavToggle)=\"sidenavToggle($event)\" (afterSidenavToggle)=\"afterToggle($event)\">\n\n <ng-content select=\"o-app-layout-sidenav[position=start]\" ngProjectAs=\"o-app-layout-sidenav-projection-start\">\n </ng-content>\n <ng-content select=\"o-app-layout-sidenav[position=end]\" ngProjectAs=\"o-app-layout-sidenav-projection-end\">\n </ng-content>\n <ng-content select=\"o-app-layout-sidenav\" ngProjectAs=\"o-app-layout-sidenav-projection-end\"></ng-content>\n\n <o-app-header #appHeader *ngIf=\"showHeader\" [show-title]=\"showTitle\" [show-static-title]=\"showStaticTitle\" [static-title]=\"staticTitle\"\n [show-user-info]=\"showUserInfo\" [show-language-selector]=\"showLanguageSelector\" [use-flag-icons]=\"useFlagIcons\"\n (onSidenavToggle)=\"appSidenav.toggleSidenav()\" [color]=\"headerColor\" [header-height]=\"headerHeight\">\n <mat-icon class=\"sidenav-toggle\" svgIcon=\"ontimize:menu\" (click)=\"appSidenav.toggleSidenav()\" *ngIf=\"appSidenav.isMobileMode()\"></mat-icon>\n <ng-content select=\"o-app-layout-header[position=start]\" ngProjectAs=\"o-app-layout-header-projection-start\">\n </ng-content>\n <ng-content select=\"o-app-layout-header[position=end]\" ngProjectAs=\"o-app-layout-header-projection-end\">\n </ng-content>\n <ng-content select=\"o-app-layout-header\" ngProjectAs=\"o-app-layout-header-projection-start\"></ng-content>\n </o-app-header>\n\n <div class=\"application-layout-content-wrapper\" [class.header-layout]=\"showHeader\">\n <ng-content></ng-content>\n </div>\n</o-app-sidenav>\n", styles: [".application-layout-content-wrapper{z-index:1;position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;padding:16px}\n"] }]
}], propDecorators: { sidenavOpened: [], showUserInfo: [], showLanguageSelector: [], useFlagIcons: [], _showHeader: [], showTitle: [], showStaticTitle: [], showEllipsisMenu: [], appSidenav: [{
type: ViewChild,
args: ['appSidenav']
}], appHeader: [{
type: ViewChild,
args: ['appHeader']
}], userInfoConfiguration: [{
type: ContentChild,
args: [OUserInfoConfigurationDirective]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1hcHAtbGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9sYXlvdXRzL2FwcC1sYXlvdXQvby1hcHAtbGF5b3V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9sYXlvdXRzL2FwcC1sYXlvdXQvby1hcHAtbGF5b3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx3RkFBd0YsQ0FBQztBQUN6SSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFnQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQUUzRCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QyxNQUFNO0lBQ04sMkJBQTJCO0lBQzNCLCtCQUErQjtJQUMvQiwwQkFBMEI7SUFDMUIsOEJBQThCO0lBQzlCLDhDQUE4QztJQUM5Qyw4QkFBOEI7SUFDOUIsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQUN4QywyQkFBMkI7SUFDM0IsNkJBQTZCO0lBQzdCLHVCQUF1QjtJQUN2QiwyQkFBMkI7SUFD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QUFDeEM7SUFBQyxxQkFBcUIsRUFBRTs7NkRBQ2lCOzRGQWxCOUIsbUJBQW1CO2tCQVovQixTQUFTOytCQUNFLGNBQWMsVUFDaEIsMkJBQTJCLFdBQzFCLDRCQUE0QixpQkFHdEIsaUJBQWlCLENBQUMsSUFBSSxhQUMxQjt3QkFDVCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsRUFBRTtxQkFDaEY7OEJBTUQsYUFBYSxNQUViLFlBQVksTUFFWixvQkFBb0IsTUFFcEIsWUFBWSxNQUVGLFdBQVcsTUFFZCxTQUFTLE1BR1QsZUFBZSxNQUVmLGdCQUFnQixNQU1oQixVQUFVO3NCQURoQixTQUFTO3VCQUFDLFlBQVk7Z0JBSWhCLFNBQVM7c0JBRGYsU0FBUzt1QkFBQyxXQUFXO2dCQUlmLHFCQUFxQjtzQkFEM0IsWUFBWTt1QkFBQywrQkFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaGVtZVBhbGV0dGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcblxuaW1wb3J0IHsgT0FwcEhlYWRlckJhc2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FwcC1oZWFkZXIvby1hcHAtaGVhZGVyLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT0FwcFNpZGVuYXZCYXNlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hcHAtc2lkZW5hdi9vLWFwcC1zaWRlbmF2LWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT1VzZXJJbmZvQ29uZmlndXJhdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdXNlci1pbmZvL3VzZXItaW5mby1jb25maWd1cmF0aW9uL28tdXNlci1pbmZvLWNvbmZpZ3VyYXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IENvZGVzLCBPQXBwTGF5b3V0TW9kZSwgT1NpZGVuYXZNb2RlIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9BcHBMYXlvdXRCYXNlIH0gZnJvbSAnLi9vLWFwcC1sYXlvdXQtYmFzZS5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX0FQUF9MQVlPVVQgPSBbXG4gICdtb2RlJyxcbiAgJ3NpZGVuYXZNb2RlOiBzaWRlbmF2LW1vZGUnLFxuICAnc2lkZW5hdk9wZW5lZDogc2lkZW5hdi1vcGVuZWQnLFxuICAnX3Nob3dIZWFkZXI6IHNob3ctaGVhZGVyJyxcbiAgJ3Nob3dVc2VySW5mbzogc2hvdy11c2VyLWluZm8nLFxuICAnc2hvd0xhbmd1YWdlU2VsZWN0b3I6IHNob3ctbGFuZ3VhZ2Utc2VsZWN0b3InLFxuICAndXNlRmxhZ0ljb25zOiB1c2UtZmxhZy1pY29ucycsXG4gICdvcGVuZWRTaWRlbmF2SW1nOiBvcGVuZWQtc2lkZW5hdi1pbWFnZScsXG4gICdjbG9zZWRTaWRlbmF2SW1nOiBjbG9zZWQtc2lkZW5hdi1pbWFnZScsXG4gICdoZWFkZXJDb2xvcjogaGVhZGVyLWNvbG9yJyxcbiAgJ2hlYWRlckhlaWdodDogaGVhZGVyLWhlaWdodCcsXG4gICdzaG93VGl0bGU6IHNob3ctdGl0bGUnLFxuICAnc3RhdGljVGl0bGU6IHN0YXRpYy10aXRsZScsXG4gICdzaG93U3RhdGljVGl0bGU6IHNob3ctc3RhdGljLXRpdGxlJyxcbiAgJ3Rvb2x0aXBEaXNwbGF5TW9kZTogdG9vbHRpcC1kaXNwbGF5LW1vZGUnLFxuICAnc2hvd0VsbGlwc2lzTWVudTogc2hvdy1lbGxpcHNpcy1tZW51J1xuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX0FQUF9MQVlPVVQ6IGFueVtdID0gW1xuICAnYmVmb3JlT3BlblNpZGVuYXYnLFxuICAnYWZ0ZXJPcGVuU2lkZW5hdicsXG4gICdiZWZvcmVDbG9zZVNpZGVuYXYnLFxuICAnYWZ0ZXJDbG9zZVNpZGVuYXYnXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLWFwcC1sYXlvdXQnLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fQVBQX0xBWU9VVCxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fQVBQX0xBWU9VVCxcbiAgdGVtcGxhdGVVcmw6ICcuL28tYXBwLWxheW91dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tYXBwLWxheW91dC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IE9BcHBMYXlvdXRCYXNlLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPQXBwTGF5b3V0Q29tcG9uZW50KSB9XG4gIF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBPQXBwTGF5b3V0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNpZGVuYXZPcGVuZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1VzZXJJbmZvOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dMYW5ndWFnZVNlbGVjdG9yOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHVzZUZsYWdJY29uczogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIF9zaG93SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBzaG93VGl0bGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpY1RpdGxlOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwdWJsaWMgc2hvd1N0YXRpY1RpdGxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwdWJsaWMgc2hvd0VsbGlwc2lzTWVudTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBoZWFkZXJDb2xvcjogVGhlbWVQYWxldHRlO1xuICBwdWJsaWMgaGVhZGVySGVpZ2h0ID0gQ29kZXMuREVGQVVMVF9ST1dfSEVJR0hUO1xuXG4gIEBWaWV3Q2hpbGQoJ2FwcFNpZGVuYXYnKVxuICBwdWJsaWMgYXBwU2lkZW5hdjogT0FwcFNpZGVuYXZCYXNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2FwcEhlYWRlcicpXG4gIHB1YmxpYyBhcHBIZWFkZXI6IE9BcHBIZWFkZXJCYXNlO1xuXG4gIEBDb250ZW50Q2hpbGQoT1VzZXJJbmZvQ29uZmlndXJhdGlvbkRpcmVjdGl2ZSlcbiAgcHVibGljIHVzZXJJbmZvQ29uZmlndXJhdGlvbjogT1VzZXJJbmZvQ29uZmlndXJhdGlvbkRpcmVjdGl2ZTtcblxuICBwcm90ZWN0ZWQgX21vZGU6IE9BcHBMYXlvdXRNb2RlO1xuICBwcm90ZWN0ZWQgX3NpZGVuYXZNb2RlOiBPU2lkZW5hdk1vZGU7XG5cbiAgb3BlbmVkU2lkZW5hdkltZzogc3RyaW5nO1xuICBjbG9zZWRTaWRlbmF2SW1nOiBzdHJpbmc7XG5cbiAgYmVmb3JlT3BlblNpZGVuYXY6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgYWZ0ZXJPcGVuU2lkZW5hdjogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBiZWZvcmVDbG9zZVNpZGVuYXY6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgYWZ0ZXJDbG9zZVNpZGVuYXY6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERpc3BsYXlNb2RlOiBzdHJpbmcgPSBDb2Rlcy5UT09MVElQX0RJU1BMQVlfQ09MTEFQU0VEXG5cbiAgZ2V0IHNob3dIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dIZWFkZXI7XG4gIH1cblxuICBzZXQgc2hvd0hlYWRlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93SGVhZGVyID0gdmFsO1xuICB9XG5cbiAgZ2V0IG1vZGUoKTogT0FwcExheW91dE1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgc2V0IG1vZGUodmFsOiBPQXBwTGF5b3V0TW9kZSkge1xuICAgIGNvbnN0IG0gPSBDb2Rlcy5PQXBwTGF5b3V0TW9kZXMuZmluZChlID0+IGUgPT09IHZhbCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKG0pKSB7XG4gICAgICB0aGlzLl9tb2RlID0gbTtcbiAgICAgIGlmICh0aGlzLl9tb2RlID09PSAnbW9iaWxlJyAmJiAhVXRpbC5pc0RlZmluZWQodGhpcy5zaG93SGVhZGVyKSkge1xuICAgICAgICB0aGlzLnNob3dIZWFkZXIgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGBvLWFwcC1sYXlvdXRgIG1vZGUgKCcgKyB2YWwgKyAnKScpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaWRlbmF2TW9kZSgpOiBPU2lkZW5hdk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9zaWRlbmF2TW9kZTtcbiAgfVxuXG4gIHNldCBzaWRlbmF2TW9kZSh2YWw6IE9TaWRlbmF2TW9kZSkge1xuICAgIGNvbnN0IG0gPSBDb2Rlcy5PU2lkZW5hdk1vZGVzLmZpbmQoZSA9PiBlID09PSB2YWwpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChtKSkge1xuICAgICAgdGhpcy5fc2lkZW5hdk1vZGUgPSBtO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGBvLWFwcC1sYXlvdXRgIHNpZGVuYXYtbW9kZSAoJyArIHZhbCArICcpJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRvb2x0aXBEaXNwbGF5TW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90b29sdGlwRGlzcGxheU1vZGU7XG4gIH1cblxuICBzZXQgdG9vbHRpcERpc3BsYXlNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgY29uc3QgbSA9IENvZGVzLlRPT0xUSVBfRElTUExBWV9NT0RFLmZpbmQoZSA9PiBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IHZhbCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKG0pKSB7XG4gICAgICB0aGlzLl90b29sdGlwRGlzcGxheU1vZGUgPSBtO1xuICAgIH1cbiAgfVxuXG4gIHNpZGVuYXZUb2dnbGUob3BlbmVkOiBib29sZWFuKSB7XG4gICAgb3BlbmVkID8gdGhpcy5iZWZvcmVPcGVuU2lkZW5hdi5lbWl0KCkgOiB0aGlzLmJlZm9yZUNsb3NlU2lkZW5hdi5lbWl0KCk7XG4gIH1cblxuICBhZnRlclRvZ2dsZShvcGVuZWQ6IGJvb2xlYW4pIHtcbiAgICBvcGVuZWQgPyB0aGlzLmFmdGVyT3BlblNpZGVuYXYuZW1pdCgpIDogdGhpcy5hZnRlckNsb3NlU2lkZW5hdi5lbWl0KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXBwSGVhZGVyICYmIHRoaXMuYXBwSGVhZGVyLnVzZXJJbmZvKSB7XG4gICAgICB0aGlzLmFwcEhlYWRlci51c2VySW5mby5yZWdpc3RlclVzZXJJbmZvQ29uZmlndXJhdGlvbih0aGlzLnVzZXJJbmZvQ29uZmlndXJhdGlvbik7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxvLWFwcC1zaWRlbmF2ICNhcHBTaWRlbmF2IFtzaWRlbmF2LW1vZGVdPVwic2lkZW5hdk1vZGVcIiBbb3BlbmVkXT1cInNpZGVuYXZPcGVuZWRcIiBbc2hvdy11c2VyLWluZm9dPVwic2hvd1VzZXJJbmZvXCIgW3Nob3ctdG9nZ2xlLWJ1dHRvbl09XCIhc2hvd0hlYWRlclwiXG4gIFtvcGVuZWQtc2lkZW5hdi1pbWFnZV09XCJvcGVuZWRTaWRlbmF2SW1nXCIgW2Nsb3NlZC1zaWRlbmF2LWltYWdlXT1cImNsb3NlZFNpZGVuYXZJbWdcIiBbbGF5b3V0LW1vZGVdPVwibW9kZVwiIFtjbGFzcy5oZWFkZXItbGF5b3V0XT1cInNob3dIZWFkZXJcIlxuICBbc2hvdy1lbGxpcHNpcy1tZW51XSA9IFwic2hvd0VsbGlwc2lzTWVudVwiIChvblNpZGVuYXZUb2dnbGUpPVwic2lkZW5hdlRvZ2dsZSgkZXZlbnQpXCIgKGFmdGVyU2lkZW5hdlRvZ2dsZSk9XCJhZnRlclRvZ2dsZSgkZXZlbnQpXCI+XG5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby1hcHAtbGF5b3V0LXNpZGVuYXZbcG9zaXRpb249c3RhcnRdXCIgbmdQcm9qZWN0QXM9XCJvLWFwcC1sYXlvdXQtc2lkZW5hdi1wcm9qZWN0aW9uLXN0YXJ0XCI+XG4gIDwvbmctY29udGVudD5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby1hcHAtbGF5b3V0LXNpZGVuYXZbcG9zaXRpb249ZW5kXVwiIG5nUHJvamVjdEFzPVwiby1hcHAtbGF5b3V0LXNpZGVuYXYtcHJvamVjdGlvbi1lbmRcIj5cbiAgPC9uZy1jb250ZW50PlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJvLWFwcC1sYXlvdXQtc2lkZW5hdlwiIG5nUHJvamVjdEFzPVwiby1hcHAtbGF5b3V0LXNpZGVuYXYtcHJvamVjdGlvbi1lbmRcIj48L25nLWNvbnRlbnQ+XG5cbiAgPG8tYXBwLWhlYWRlciAjYXBwSGVhZGVyICpuZ0lmPVwic2hvd0hlYWRlclwiIFtzaG93LXRpdGxlXT1cInNob3dUaXRsZVwiIFtzaG93LXN0YXRpYy10aXRsZV09XCJzaG93U3RhdGljVGl0bGVcIiBbc3RhdGljLXRpdGxlXT1cInN0YXRpY1RpdGxlXCJcbiAgICBbc2hvdy11c2VyLWluZm9dPVwic2hvd1VzZXJJbmZvXCIgW3Nob3ctbGFuZ3VhZ2Utc2VsZWN0b3JdPVwic2hvd0xhbmd1YWdlU2VsZWN0b3JcIiBbdXNlLWZsYWctaWNvbnNdPVwidXNlRmxhZ0ljb25zXCJcbiAgICAob25TaWRlbmF2VG9nZ2xlKT1cImFwcFNpZGVuYXYudG9nZ2xlU2lkZW5hdigpXCIgW2NvbG9yXT1cImhlYWRlckNvbG9yXCIgW2hlYWRlci1oZWlnaHRdPVwiaGVhZGVySGVpZ2h0XCI+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwic2lkZW5hdi10b2dnbGVcIiBzdmdJY29uPVwib250aW1pemU6bWVudVwiIChjbGljayk9XCJhcHBTaWRlbmF2LnRvZ2dsZVNpZGVuYXYoKVwiICpuZ0lmPVwiYXBwU2lkZW5hdi5pc01vYmlsZU1vZGUoKVwiPjwvbWF0LWljb24+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby1hcHAtbGF5b3V0LWhlYWRlcltwb3NpdGlvbj1zdGFydF1cIiBuZ1Byb2plY3RBcz1cIm8tYXBwLWxheW91dC1oZWFkZXItcHJvamVjdGlvbi1zdGFydFwiPlxuICAgIDwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJvLWFwcC1sYXlvdXQtaGVhZGVyW3Bvc2l0aW9uPWVuZF1cIiBuZ1Byb2plY3RBcz1cIm8tYXBwLWxheW91dC1oZWFkZXItcHJvamVjdGlvbi1lbmRcIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby1hcHAtbGF5b3V0LWhlYWRlclwiIG5nUHJvamVjdEFzPVwiby1hcHAtbGF5b3V0LWhlYWRlci1wcm9qZWN0aW9uLXN0YXJ0XCI+PC9uZy1jb250ZW50PlxuICA8L28tYXBwLWhlYWRlcj5cblxuICA8ZGl2IGNsYXNzPVwiYXBwbGljYXRpb24tbGF5b3V0LWNvbnRlbnQtd3JhcHBlclwiIFtjbGFzcy5oZWFkZXItbGF5b3V0XT1cInNob3dIZWFkZXJcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9vLWFwcC1zaWRlbmF2PlxuIl19