UNPKG

systelab-components

Version:

systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.

105 lines 17.5 kB
import { Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core'; import { APP_CONFIG } from '../../systelab-components.module.config'; import { DEFAULT_SYSTELAB_DIALOG_CONFIG } from '../systelab-dialog-config'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/cdk/drag-drop"; export class DialogHeaderComponent { constructor(config) { this.config = config; this.withClose = true; this.withInfo = false; this.withProgressBar = false; this.withTextProgressBar = false; this.withHome = false; this.withMinimize = false; this.withDrag = true; this.close = new EventEmitter(); this.info = new EventEmitter(); this.home = new EventEmitter(); this.minimize = new EventEmitter(); this.withDrag = config?.dialogConfig?.dialogsDraggableByDefault !== undefined ? config.dialogConfig.dialogsDraggableByDefault : DEFAULT_SYSTELAB_DIALOG_CONFIG.dialogsDraggableByDefault; } ngAfterViewInit() { } doClose() { this.close.emit(); } doInfo() { this.info.emit(); } doHome() { this.home.emit(); } doMinimize() { this.minimize.emit(); } go(n, textProgress) { if (this.withProgressBar || this.withTextProgressBar) { if (n > 100) { n = 100; } if (n >= 0) { this.here = n; if (!this.on) { this.on = 1; this.move(n); } } else if (this.on) { this.move(n); } this.textProgress = textProgress ?? `${n}%`; } } // animation loop move(width) { const dist = width - this.here; if (dist < 0.1 && dist > -0.1) { this.place(this.here); this.on = 0; } else { this.place(width - dist / 4); } } // set bar width place(num) { this.progress = num; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DialogHeaderComponent, deps: [{ token: APP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: DialogHeaderComponent, selector: "systelab-dialog-header", inputs: { withClose: "withClose", withInfo: "withInfo", withProgressBar: "withProgressBar", withTextProgressBar: "withTextProgressBar", withHome: "withHome", withMinimize: "withMinimize", withDrag: "withDrag" }, outputs: { close: "close", info: "info", home: "home", minimize: "minimize" }, ngImport: i0, template: "<ng-template #headerContent>\n <div class=\"d-inline-block text-truncate\">\n <ng-content></ng-content>\n </div>\n <div class=\"d-flex\">\n <div *ngIf=\"withHome\" class=\"slab-dialog-header-button slab-dialog-home mr-1\" (click)=\"doHome()\"></div>\n <div *ngIf=\"withMinimize\" class=\"slab-dialog-header-button slab-dialog-minimize mr-1\" (click)=\"doMinimize()\"></div>\n <div *ngIf=\"withInfo\" class=\"slab-dialog-header-button slab-dialog-info mr-1\" (click)=\"doInfo()\"></div>\n <div *ngIf=\"withClose\" class=\"slab-dialog-header-button slab-dialog-close\" (click)=\"doClose()\"></div>\n </div>\n</ng-template>\n\n<div *ngIf=\"withDrag\" class=\"slab-dialog-header slab-draggable d-flex justify-content-between\"\n cdkDrag cdkDragRootElement=\".cdk-overlay-pane\" cdkDragHandle>\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n<div *ngIf=\"!withDrag\" class=\"slab-dialog-header d-flex justify-content-between\">\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n\n<div *ngIf=\"(withProgressBar || withTextProgressBar) && progress\" class=\"slab-dialog-header-progress text-center\"\n [ngClass]=\"{'slab-dialog-header-progress-bar-with-text':withTextProgressBar}\">\n <div class=\"slab-dialog-header-progress-bar\" role=\"progressbar\" [style.width.%]=\"progress\" [attr.aria-valuenow]=\"progress\"\n aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n <span *ngIf=\"withTextProgressBar\" class=\"slab-dialog-header-progress-bar-text h-100 d-flex align-items-center justify-content-center\">{{textProgress}}</span>\n</div>\n", styles: [":host{width:100%}.slab-draggable{cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DialogHeaderComponent, decorators: [{ type: Component, args: [{ selector: 'systelab-dialog-header', template: "<ng-template #headerContent>\n <div class=\"d-inline-block text-truncate\">\n <ng-content></ng-content>\n </div>\n <div class=\"d-flex\">\n <div *ngIf=\"withHome\" class=\"slab-dialog-header-button slab-dialog-home mr-1\" (click)=\"doHome()\"></div>\n <div *ngIf=\"withMinimize\" class=\"slab-dialog-header-button slab-dialog-minimize mr-1\" (click)=\"doMinimize()\"></div>\n <div *ngIf=\"withInfo\" class=\"slab-dialog-header-button slab-dialog-info mr-1\" (click)=\"doInfo()\"></div>\n <div *ngIf=\"withClose\" class=\"slab-dialog-header-button slab-dialog-close\" (click)=\"doClose()\"></div>\n </div>\n</ng-template>\n\n<div *ngIf=\"withDrag\" class=\"slab-dialog-header slab-draggable d-flex justify-content-between\"\n cdkDrag cdkDragRootElement=\".cdk-overlay-pane\" cdkDragHandle>\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n<div *ngIf=\"!withDrag\" class=\"slab-dialog-header d-flex justify-content-between\">\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n\n<div *ngIf=\"(withProgressBar || withTextProgressBar) && progress\" class=\"slab-dialog-header-progress text-center\"\n [ngClass]=\"{'slab-dialog-header-progress-bar-with-text':withTextProgressBar}\">\n <div class=\"slab-dialog-header-progress-bar\" role=\"progressbar\" [style.width.%]=\"progress\" [attr.aria-valuenow]=\"progress\"\n aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n <span *ngIf=\"withTextProgressBar\" class=\"slab-dialog-header-progress-bar-text h-100 d-flex align-items-center justify-content-center\">{{textProgress}}</span>\n</div>\n", styles: [":host{width:100%}.slab-draggable{cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}\n"] }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_CONFIG] }] }], propDecorators: { withClose: [{ type: Input }], withInfo: [{ type: Input }], withProgressBar: [{ type: Input }], withTextProgressBar: [{ type: Input }], withHome: [{ type: Input }], withMinimize: [{ type: Input }], withDrag: [{ type: Input }], close: [{ type: Output }], info: [{ type: Output }], home: [{ type: Output }], minimize: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi1jb21wb25lbnRzL3NyYy9saWIvbW9kYWwvaGVhZGVyL2RpYWxvZy1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL21vZGFsL2hlYWRlci9kaWFsb2ctaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBaUIzRSxNQUFNLE9BQU8scUJBQXFCO0lBb0JqQyxZQUFvRCxNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBbEI1RCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVSLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBUTlDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLFlBQVksRUFBRSx5QkFBeUIsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUM5RSxNQUFNLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyx5QkFBeUIsQ0FBQztJQUMzRyxDQUFDO0lBRU0sZUFBZTtJQUN0QixDQUFDO0lBRU0sT0FBTztRQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVNLE1BQU07UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxNQUFNO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU0sVUFBVTtRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxFQUFFLENBQUMsQ0FBUyxFQUFFLFlBQXFCO1FBQ3pDLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDckQsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO2dCQUNaLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDUjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiO2FBQ0Q7aUJBQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2I7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQzVDO0lBQ0YsQ0FBQztJQUVELGlCQUFpQjtJQUNULElBQUksQ0FBQyxLQUFhO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9CLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDWjthQUFNO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdCO0lBQ0YsQ0FBQztJQUVELGdCQUFnQjtJQUNSLEtBQUssQ0FBQyxHQUFXO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLENBQUM7OEdBNUVXLHFCQUFxQixrQkFvQkQsVUFBVTtrR0FwQjlCLHFCQUFxQixpV0NuQmxDLGtvREEwQkE7OzJGRFBhLHFCQUFxQjtrQkFmakMsU0FBUzsrQkFDSSx3QkFBd0I7OzBCQWtDeEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxVQUFVO3lDQWxCakMsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVXLEtBQUs7c0JBQXJCLE1BQU07Z0JBQ1UsSUFBSTtzQkFBcEIsTUFBTTtnQkFDVSxJQUFJO3NCQUFwQixNQUFNO2dCQUNVLFFBQVE7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVBQX0NPTkZJRywgQXBwQ29uZmlnIH0gZnJvbSAnLi4vLi4vc3lzdGVsYWItY29tcG9uZW50cy5tb2R1bGUuY29uZmlnJztcbmltcG9ydCB7IERFRkFVTFRfU1lTVEVMQUJfRElBTE9HX0NPTkZJRyB9IGZyb20gJy4uL3N5c3RlbGFiLWRpYWxvZy1jb25maWcnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICAgICdzeXN0ZWxhYi1kaWFsb2ctaGVhZGVyJyxcblx0dGVtcGxhdGVVcmw6ICdkaWFsb2ctaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVzOiAgICAgIFtgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG4gICAgICAgIC5zbGFiLWRyYWdnYWJsZSB7XG4gICAgICAgICAgICBjdXJzb3I6IG1vdmU7XG4gICAgICAgICAgICBjdXJzb3I6IGdyYWI7XG4gICAgICAgICAgICBjdXJzb3I6IC1tb3otZ3JhYjtcbiAgICAgICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiO1xuICAgICAgICB9XG5cdGBdXG59KVxuZXhwb3J0IGNsYXNzIERpYWxvZ0hlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG5cdEBJbnB1dCgpIHdpdGhDbG9zZSA9IHRydWU7XG5cdEBJbnB1dCgpIHdpdGhJbmZvID0gZmFsc2U7XG5cdEBJbnB1dCgpIHdpdGhQcm9ncmVzc0JhciA9IGZhbHNlO1xuXHRASW5wdXQoKSB3aXRoVGV4dFByb2dyZXNzQmFyID0gZmFsc2U7XG5cdEBJbnB1dCgpIHdpdGhIb21lID0gZmFsc2U7XG5cdEBJbnB1dCgpIHdpdGhNaW5pbWl6ZSA9IGZhbHNlO1xuXHRASW5wdXQoKSB3aXRoRHJhZyA9IHRydWU7XG5cblx0QE91dHB1dCgpIHB1YmxpYyBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyBpbmZvID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgcHVibGljIGhvbWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBwdWJsaWMgbWluaW1pemUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0cHVibGljIHRleHRQcm9ncmVzczogc3RyaW5nO1xuXHRwdWJsaWMgcHJvZ3Jlc3M6IG51bWJlcjtcblx0cHJpdmF0ZSBvbjogbnVtYmVyO1xuXHRwcml2YXRlIGhlcmU6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBBcHBDb25maWcpIHtcblx0XHR0aGlzLndpdGhEcmFnID0gY29uZmlnPy5kaWFsb2dDb25maWc/LmRpYWxvZ3NEcmFnZ2FibGVCeURlZmF1bHQgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRjb25maWcuZGlhbG9nQ29uZmlnLmRpYWxvZ3NEcmFnZ2FibGVCeURlZmF1bHQgOiBERUZBVUxUX1NZU1RFTEFCX0RJQUxPR19DT05GSUcuZGlhbG9nc0RyYWdnYWJsZUJ5RGVmYXVsdDtcblx0fVxuXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG5cdH1cblxuXHRwdWJsaWMgZG9DbG9zZSgpIHtcblx0XHR0aGlzLmNsb3NlLmVtaXQoKTtcblx0fVxuXG5cdHB1YmxpYyBkb0luZm8oKSB7XG5cdFx0dGhpcy5pbmZvLmVtaXQoKTtcblx0fVxuXG5cdHB1YmxpYyBkb0hvbWUoKSB7XG5cdFx0dGhpcy5ob21lLmVtaXQoKTtcblx0fVxuXG5cdHB1YmxpYyBkb01pbmltaXplKCkge1xuXHRcdHRoaXMubWluaW1pemUuZW1pdCgpO1xuXHR9XG5cblx0cHVibGljIGdvKG46IG51bWJlciwgdGV4dFByb2dyZXNzPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMud2l0aFByb2dyZXNzQmFyIHx8IHRoaXMud2l0aFRleHRQcm9ncmVzc0Jhcikge1xuXHRcdFx0aWYgKG4gPiAxMDApIHtcblx0XHRcdFx0biA9IDEwMDtcblx0XHRcdH1cblx0XHRcdGlmIChuID49IDApIHtcblx0XHRcdFx0dGhpcy5oZXJlID0gbjtcblx0XHRcdFx0aWYgKCF0aGlzLm9uKSB7XG5cdFx0XHRcdFx0dGhpcy5vbiA9IDE7XG5cdFx0XHRcdFx0dGhpcy5tb3ZlKG4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub24pIHtcblx0XHRcdFx0dGhpcy5tb3ZlKG4pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy50ZXh0UHJvZ3Jlc3MgPSB0ZXh0UHJvZ3Jlc3MgPz8gYCR7bn0lYDtcblx0XHR9XG5cdH1cblxuXHQvLyBhbmltYXRpb24gbG9vcFxuXHRwcml2YXRlIG1vdmUod2lkdGg6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0IGRpc3QgPSB3aWR0aCAtIHRoaXMuaGVyZTtcblx0XHRpZiAoZGlzdCA8IDAuMSAmJiBkaXN0ID4gLTAuMSkge1xuXHRcdFx0dGhpcy5wbGFjZSh0aGlzLmhlcmUpO1xuXHRcdFx0dGhpcy5vbiA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucGxhY2Uod2lkdGggLSBkaXN0IC8gNCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gc2V0IGJhciB3aWR0aFxuXHRwcml2YXRlIHBsYWNlKG51bTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5wcm9ncmVzcyA9IG51bTtcblx0fVxuXG59XG4iLCI8bmctdGVtcGxhdGUgI2hlYWRlckNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndpdGhIb21lXCIgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItYnV0dG9uIHNsYWItZGlhbG9nLWhvbWUgbXItMVwiIChjbGljayk9XCJkb0hvbWUoKVwiPjwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwid2l0aE1pbmltaXplXCIgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItYnV0dG9uIHNsYWItZGlhbG9nLW1pbmltaXplIG1yLTFcIiAoY2xpY2spPVwiZG9NaW5pbWl6ZSgpXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ3aXRoSW5mb1wiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyLWJ1dHRvbiBzbGFiLWRpYWxvZy1pbmZvIG1yLTFcIiAoY2xpY2spPVwiZG9JbmZvKClcIj48L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndpdGhDbG9zZVwiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyLWJ1dHRvbiBzbGFiLWRpYWxvZy1jbG9zZVwiIChjbGljayk9XCJkb0Nsb3NlKClcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgKm5nSWY9XCJ3aXRoRHJhZ1wiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyIHNsYWItZHJhZ2dhYmxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgIGNka0RyYWcgY2RrRHJhZ1Jvb3RFbGVtZW50PVwiLmNkay1vdmVybGF5LXBhbmVcIiBjZGtEcmFnSGFuZGxlPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhd2l0aERyYWdcIiBjbGFzcz1cInNsYWItZGlhbG9nLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCIod2l0aFByb2dyZXNzQmFyIHx8IHdpdGhUZXh0UHJvZ3Jlc3NCYXIpICYmIHByb2dyZXNzXCIgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItcHJvZ3Jlc3MgdGV4dC1jZW50ZXJcIlxuICAgICBbbmdDbGFzc109XCJ7J3NsYWItZGlhbG9nLWhlYWRlci1wcm9ncmVzcy1iYXItd2l0aC10ZXh0Jzp3aXRoVGV4dFByb2dyZXNzQmFyfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItcHJvZ3Jlc3MtYmFyXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIiBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInByb2dyZXNzXCJcbiAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiPjwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwid2l0aFRleHRQcm9ncmVzc0JhclwiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyLXByb2dyZXNzLWJhci10ZXh0IGgtMTAwIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPnt7dGV4dFByb2dyZXNzfX08L3NwYW4+XG48L2Rpdj5cbiJdfQ==