UNPKG

ddata-ui-input

Version:

DData UI Input module, components, models & services

135 lines 20.8 kB
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewContainerRef } from '@angular/core'; import { ComponentRendererService } from '../../../../services/select/component-renderer.service'; import { Subscription } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; export class DdataMultipleSelectDialogComponent { constructor(changeDetector) { this.changeDetector = changeDetector; this.subscription = new Subscription(); this.method = 'list'; this.mode = 'multiple'; // for example: tag_id this.field = 'id'; // for example: tag's name this.text = 'name'; // for example: tag.id this.valueField = 'id'; // for example: Array of Tag this.items = []; this.modalTitle = 'Dialog'; this.selectionFinished = new EventEmitter(); this.selected = new EventEmitter(); this.selectModel = new EventEmitter(); this.componentRendererService = new ComponentRendererService(changeDetector); } // close dialog on esc onKeydownHandler(event) { this.selectionFinished.emit(); } ngOnInit() { // get selected items from model's field this.getSelectedItems(); } ngAfterViewInit() { // render component in dialog const instance = this.componentRendererService .setMethod(this.method) .setSettings(this.settings) .setDialogHost(this.dialogHost) .setComponentRef(this.componentRef) .render(); if (!instance) { console.error('Component for dialog is not defined'); return; } if (this.mode === 'single') { const selectedModel = this.model[this.getObjectFieldName()]; if (!!selectedModel) { this.componentRendererService.setSelectedModels([ selectedModel ]); } } if (this.mode === 'multiple') { this.componentRendererService.setSelectedModels(this.model[this.field]); } // for edit component this.subscription.add(instance.saveModel.subscribe((model) => this.setModel(model))); this.subscription.add(instance.select.pipe(tap(() => { if (this.mode === 'multiple') { this.model[this.field] = []; this.settings.listOptions.selectedElements = []; } }), map((models) => { if (models === null) { return models; } this.emitEvents(models); return models; })).subscribe()); } getSelectedItems() { if (this.mode === 'single') { this.selectedModel = this.model[this.field]; } } hideModal() { // get dialog component instance const selectedElements = this.componentRendererService.getSelectedModels(); // emit selected elements this.emitEvents(selectedElements); // reset selected elements this.componentRendererService.resetSelectedModels(); } emitEvents(models) { models.forEach((model) => { // this must be happen on multiple select and on signle select case too this.selectModel.emit(model); }); this.selectionFinished.emit(models); } getObjectFieldName() { return this.field.split('_id')[0]; } setModel(model) { // TODO test this on edit case } } DdataMultipleSelectDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataMultipleSelectDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); DdataMultipleSelectDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataMultipleSelectDialogComponent, selector: "multiple-select-dialog", inputs: { settings: "settings", method: "method", mode: "mode", model: "model", field: "field", text: "text", valueField: "valueField", items: "items", modalTitle: "modalTitle" }, outputs: { selectionFinished: "selectionFinished", selected: "selected", selectModel: "selectModel" }, host: { listeners: { "document:keydown.escape": "onKeydownHandler($event)" } }, viewQueries: [{ propertyName: "dialogHost", first: true, predicate: ["dialogHost"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!-- overlay -->\n<div class=\"modal-overlay active\"></div>\n\n<!-- modal -->\n<div class=\"modal\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog modal-dialog-centered modal-lg modal-dialog-scrollable\" role=\"document\">\n <div class=\"modal-content\">\n <!-- header -->\n <div class=\"modal-header\">\n <div class=\"col-10\">\n <h5 class=\"modal-title\">\n {{ modalTitle }}\n </h5>\n </div>\n\n <div class=\"col-2 text-end\">\n <button type=\"button\" class=\"btn btn-light close\" (click)=\"hideModal()\" aria-label=\"Bez\u00E1r\u00E1s\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n </div>\n\n <!-- body -->\n <div class=\"modal-body\">\n <ng-template dynamicComponent #dialogHost></ng-template>\n </div>\n\n </div>\n </div>\n</div>\n", styles: ["@media screen and (min-width: 576px){.modal .modal-dialog{max-width:1000px}}.modal{display:block;z-index:9901}.modal-overlay{display:none;position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,.85);z-index:9900;opacity:0;transition:all .5s ease-in-out;color:#fff}.modal-overlay.active{display:flex;justify-content:center;align-items:center;opacity:1}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataMultipleSelectDialogComponent, decorators: [{ type: Component, args: [{ selector: 'multiple-select-dialog', template: "<!-- overlay -->\n<div class=\"modal-overlay active\"></div>\n\n<!-- modal -->\n<div class=\"modal\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog modal-dialog-centered modal-lg modal-dialog-scrollable\" role=\"document\">\n <div class=\"modal-content\">\n <!-- header -->\n <div class=\"modal-header\">\n <div class=\"col-10\">\n <h5 class=\"modal-title\">\n {{ modalTitle }}\n </h5>\n </div>\n\n <div class=\"col-2 text-end\">\n <button type=\"button\" class=\"btn btn-light close\" (click)=\"hideModal()\" aria-label=\"Bez\u00E1r\u00E1s\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n </div>\n\n <!-- body -->\n <div class=\"modal-body\">\n <ng-template dynamicComponent #dialogHost></ng-template>\n </div>\n\n </div>\n </div>\n</div>\n", styles: ["@media screen and (min-width: 576px){.modal .modal-dialog{max-width:1000px}}.modal{display:block;z-index:9901}.modal-overlay{display:none;position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,.85);z-index:9900;opacity:0;transition:all .5s ease-in-out;color:#fff}.modal-overlay.active{display:flex;justify-content:center;align-items:center;opacity:1}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { settings: [{ type: Input }], method: [{ type: Input }], mode: [{ type: Input }], model: [{ type: Input }], field: [{ type: Input }], text: [{ type: Input }], valueField: [{ type: Input }], items: [{ type: Input }], modalTitle: [{ type: Input }], selectionFinished: [{ type: Output }], selected: [{ type: Output }], selectModel: [{ type: Output }], dialogHost: [{ type: ViewChild, args: ['dialogHost', { read: ViewContainerRef }] }], onKeydownHandler: [{ type: HostListener, args: ['document:keydown.escape', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlwbGUtc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L211bHRpcGxlLXNlbGVjdC9kaWFsb2cvbXVsdGlwbGUtc2VsZWN0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L211bHRpcGxlLXNlbGVjdC9kaWFsb2cvbXVsdGlwbGUtc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ2MsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQzdHLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFTMUMsTUFBTSxPQUFPLGtDQUFrQztJQXFDN0MsWUFBcUIsY0FBaUM7UUFBakMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBbEM5QyxpQkFBWSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBSS9DLFdBQU0sR0FBMkIsTUFBTSxDQUFDO1FBQ3hDLFNBQUksR0FBZSxVQUFVLENBQUM7UUFLdkMsc0JBQXNCO1FBQ2IsVUFBSyxHQUFHLElBQUksQ0FBQztRQUV0QiwwQkFBMEI7UUFDakIsU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUV2QixzQkFBc0I7UUFDYixlQUFVLEdBQUcsSUFBSSxDQUFD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QUs7Z0JBRUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFFOEMsVUFBVTtzQkFBOUQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBR0UsZ0JBQWdCO3NCQUFwRSxZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZU1vZGVsSW50ZXJmYWNlLCBGaWVsZHNJbnRlcmZhY2UgfSBmcm9tICdkZGF0YS1jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlcmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3NlbGVjdC9jb21wb25lbnQtcmVuZGVyZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGlhbG9nQ29udGVudFdpdGhPcHRpb25zSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2RpYWxvZy9jb250ZW50L2RpYWxvZy1jb250ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWxlY3RUeXBlIH0gZnJvbSAnLi4vLi4vc2VsZWN0LnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdWx0aXBsZS1zZWxlY3QtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpcGxlLXNlbGVjdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aXBsZS1zZWxlY3QtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGRhdGFNdWx0aXBsZVNlbGVjdERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlOiBDb21wb25lbnRSZW5kZXJlclNlcnZpY2U7XG4gIHByaXZhdGUgY29tcG9uZW50UmVmOiBhbnk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgc2VsZWN0ZWRNb2RlbDogYW55O1xuXG4gIEBJbnB1dCgpIHNldHRpbmdzOiBEaWFsb2dDb250ZW50V2l0aE9wdGlvbnNJbnRlcmZhY2U7XG4gIEBJbnB1dCgpIG1ldGhvZDogJ2NyZWF0ZS1lZGl0JyB8ICdsaXN0JyA9ICdsaXN0JztcbiAgQElucHV0KCkgbW9kZTogU2VsZWN0VHlwZSA9ICdtdWx0aXBsZSc7XG5cbiAgLy8gZm9yIGV4YW1wbGU6IGFuIEFkZHJlc3MgbW9kZWxcbiAgQElucHV0KCkgbW9kZWw6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT47XG5cbiAgLy8gZm9yIGV4YW1wbGU6IHRhZ19pZFxuICBASW5wdXQoKSBmaWVsZCA9ICdpZCc7XG5cbiAgLy8gZm9yIGV4YW1wbGU6IHRhZydzIG5hbWVcbiAgQElucHV0KCkgdGV4dCA9ICduYW1lJztcblxuICAvLyBmb3IgZXhhbXBsZTogdGFnLmlkXG4gIEBJbnB1dCgpIHZhbHVlRmllbGQgPSAnaWQnO1xuXG4gIC8vIGZvciBleGFtcGxlOiBBcnJheSBvZiBUYWdcbiAgQElucHV0KCkgaXRlbXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIG1vZGFsVGl0bGUgPSAnRGlhbG9nJztcblxuICBAT3V0cHV0KCkgc2VsZWN0aW9uRmluaXNoZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TW9kZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2RpYWxvZ0hvc3QnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgZGlhbG9nSG9zdDogVmlld0NvbnRhaW5lclJlZjtcblxuICAvLyBjbG9zZSBkaWFsb2cgb24gZXNjXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uRmluaXNoZWQuZW1pdCgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5jb21wb25lbnRSZW5kZXJlclNlcnZpY2UgPSBuZXcgQ29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlKGNoYW5nZURldGVjdG9yKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGdldCBzZWxlY3RlZCBpdGVtcyBmcm9tIG1vZGVsJ3MgZmllbGRcbiAgICB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyByZW5kZXIgY29tcG9uZW50IGluIGRpYWxvZ1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5jb21wb25lbnRSZW5kZXJlclNlcnZpY2VcbiAgICAgIC5zZXRNZXRob2QodGhpcy5tZXRob2QpXG4gICAgICAuc2V0U2V0dGluZ3ModGhpcy5zZXR0aW5ncylcbiAgICAgIC5zZXREaWFsb2dIb3N0KHRoaXMuZGlhbG9nSG9zdClcbiAgICAgIC5zZXRDb21wb25lbnRSZWYodGhpcy5jb21wb25lbnRSZWYpXG4gICAgICAucmVuZGVyKCk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDb21wb25lbnQgZm9yIGRpYWxvZyBpcyBub3QgZGVmaW5lZCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkTW9kZWwgPSB0aGlzLm1vZGVsW3RoaXMuZ2V0T2JqZWN0RmllbGROYW1lKCldO1xuXG4gICAgICBpZiAoISFzZWxlY3RlZE1vZGVsKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlLnNldFNlbGVjdGVkTW9kZWxzKFtcbiAgICAgICAgICBzZWxlY3RlZE1vZGVsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlLnNldFNlbGVjdGVkTW9kZWxzKFxuICAgICAgICB0aGlzLm1vZGVsW3RoaXMuZmllbGRdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGZvciBlZGl0IGNvbXBvbmVudFxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChpbnN0YW5jZS5zYXZlTW9kZWwuc3Vic2NyaWJlKChtb2RlbDogYW55KSA9PiB0aGlzLnNldE1vZGVsKG1vZGVsKSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgaW5zdGFuY2Uuc2VsZWN0LnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5saXN0T3B0aW9ucy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICBtYXAoKG1vZGVsczogYW55W10pID0+IHtcbiAgICAgICAgICBpZiAobW9kZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kZWxzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZW1pdEV2ZW50cyhtb2RlbHMpO1xuXG4gICAgICAgICAgcmV0dXJuIG1vZGVscztcbiAgICAgICAgfSksXG4gICAgICApLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gdGhpcy5tb2RlbFt0aGlzLmZpZWxkXTtcbiAgICB9XG4gIH1cblxuICBoaWRlTW9kYWwoKTogdm9pZCB7XG4gICAgLy8gZ2V0IGRpYWxvZyBjb21wb25lbnQgaW5zdGFuY2VcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5jb21wb25lbnRSZW5kZXJlclNlcnZpY2UuZ2V0U2VsZWN0ZWRNb2RlbHMoKTtcblxuICAgIC8vIGVtaXQgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICB0aGlzLmVtaXRFdmVudHMoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAvLyByZXNldCBzZWxlY3RlZCBlbGVtZW50c1xuICAgIHRoaXMuY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlLnJlc2V0U2VsZWN0ZWRNb2RlbHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEV2ZW50cyhtb2RlbHM6IGFueVtdKTogdm9pZCB7XG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgIC8vIHRoaXMgbXVzdCBiZSBoYXBwZW4gb24gbXVsdGlwbGUgc2VsZWN0IGFuZCBvbiBzaWdubGUgc2VsZWN0IGNhc2UgdG9vXG4gICAgICB0aGlzLnNlbGVjdE1vZGVsLmVtaXQobW9kZWwpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25GaW5pc2hlZC5lbWl0KG1vZGVscyk7XG4gIH1cblxuICBwcml2YXRlIGdldE9iamVjdEZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnNwbGl0KCdfaWQnKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TW9kZWwobW9kZWw6IGFueSk6IGFueSB7XG4gICAgLy8gVE9ETyB0ZXN0IHRoaXMgb24gZWRpdCBjYXNlXG4gIH1cbn1cbiIsIjwhLS0gb3ZlcmxheSAtLT5cbjxkaXYgY2xhc3M9XCJtb2RhbC1vdmVybGF5IGFjdGl2ZVwiPjwvZGl2PlxuXG48IS0tIG1vZGFsIC0tPlxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQgbW9kYWwtbGcgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGVcIiByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cbiAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxuICAgICAgICAgICAge3sgbW9kYWxUaXRsZSB9fVxuICAgICAgICAgIDwvaDU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiB0ZXh0LWVuZFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBjbG9zZVwiIChjbGljayk9XCJoaWRlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJCZXrDoXLDoXNcIj5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gYm9keSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBkeW5hbWljQ29tcG9uZW50ICNkaWFsb2dIb3N0PjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19