UNPKG

ddata-ui-input

Version:

DData UI Input module, components, models & services

163 lines 25.4 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { BaseModel, DdataCoreModule } from 'ddata-core'; import { InputHelperService } from '../../services/input/helper/input-helper.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; export class DdataTextareaComponent { constructor() { this.helperService = DdataCoreModule.InjectorInstance.get(InputHelperService); // tslint:disable: variable-name this._field = ''; this._title = ''; this._label = ''; this._placeholder = ''; this._prepend = ''; this._append = ''; this._max = ''; this._isRequired = false; this._model = new BaseModel(); this.inputClass = 'form-control'; this.disabled = false; this.isViewOnly = false; this.labelClass = 'col-12 col-md-3 px-0 col-form-label'; this.inputBlockClass = 'col-12 d-flex px-0'; this.inputBlockExtraClass = 'col-md-9'; this.viewOnlyClass = 'form-control border-0 bg-light'; this.showLabel = true; this.autoFocus = false; this.wrapperClass = 'd-flex flex-wrap'; this.rows = '5'; this.enableCharacterCounter = false; this.enableWordCounter = false; this.maxLength = 255; this.maxWords = 7; this.wordCounterWarningMessage = ''; this.changed = new EventEmitter(); this.random = this.helperService.randChars(); this.displayWordCounterWarning = false; } set model(value) { // prevent undefined if (!value) { console.error('The input-box component get undefined model'); return; } this._model = value; if (!this._model.fields) { console.error(`Your ${this._model.model_name}'s 'fields' field is`, this._model.fields); return; } if (!this._model.fields[this._field]) { console.error(`The ${this._model.model_name}'s ${this._field} field is `, this._model.fields[this._field]); return; } if (!!this._model && !!this._model.fields[this._field]) { this._title = this.helperService.getTitle(this._model, this._field); this._placeholder = this.helperService.getPlaceholder(this._model, this._field); this._prepend = this.helperService.getPrepend(this._model, this._field); this._append = this.helperService.getAppend(this._model, this._field); this._label = this.helperService.getLabel(this._model, this._field); } if (!!this._model && !!this._model.validationRules[this._field]) { this._isRequired = this.helperService.isRequired(this._model, this._field); } } get model() { return this._model; } set field(value) { if (value === 'undefined') { value = 'isValid'; } this._field = value; } set append(value) { if (value === 'undefined') { value = ''; } this._append = value; } set prepend(value) { if (value === 'undefined') { value = ''; } this._prepend = value; } set labelText(value) { if (value === 'undefined') { value = ''; } this._label = value; } ngOnInit() { } ngAfterViewInit() { if (this.autoFocus) { this.inputBox.nativeElement.focus(); } } validateField() { const isValid = this.helperService.validateField(this._model, this._field); if (isValid) { this.changed.emit(this._model); } } setWordCounterWarning(value) { this.displayWordCounterWarning = value; } } DdataTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); DdataTextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataTextareaComponent, selector: "dd-textarea", inputs: { model: "model", field: "field", append: "append", prepend: "prepend", labelText: "labelText", inputClass: "inputClass", disabled: "disabled", isViewOnly: "isViewOnly", labelClass: "labelClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", viewOnlyClass: "viewOnlyClass", showLabel: "showLabel", autoFocus: "autoFocus", wrapperClass: "wrapperClass", rows: "rows", enableCharacterCounter: "enableCharacterCounter", enableWordCounter: "enableWordCounter", maxLength: "maxLength", maxWords: "maxWords", wordCounterWarningMessage: "wordCounterWarningMessage" }, outputs: { changed: "changed" }, viewQueries: [{ propertyName: "inputBox", first: true, predicate: ["inputBox"], descendants: true }], ngImport: i0, template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_isRequired\"> *</span>\n </label>\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <textarea *ngIf=\"!isViewOnly\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [class.invalid]=\"_model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [rows]=\"rows\"\n [(ngModel)]=\"_model[_field]\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n (keyup)=\"validateField()\"\n #inputBox>\n <ng-container *ngIf=\"enableCharacterCounter\">\n <character-counter [currentLength]=\"model[_field]?.length || 0\" [maxLength]=\"maxLength\"></character-counter>\n </ng-container>\n <ng-container *ngIf=\"enableWordCounter\">\n <app-word-counter\n [currentLength]=\"model[_field]\"\n [maxLength]=\"maxWords\"\n (maxLentghReached)=\"showWordCounterWarning = $event\"\n ></app-word-counter>\n </ng-container>\n </textarea>\n\n <div *ngIf=\"isViewOnly\"\n [id]=\"field\"\n [name]=\"field\"\n [title]=\"_title\"\n [class]=\"viewOnlyClass\">\n\n {{ _model[_field] }}\n </div>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n <div *ngIf=\"displayWordCounterWarning && wordCounterWarningMessage !== ''\" class=\"d-flex pb-2\">\n <div class=\"col-12 col-md-7 offset-md-3 bg-warning p-2 rounded\">\n {{ wordCounterWarningMessage }}\n </div>\n </div>\n</div>\n", styles: [""], 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: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataTextareaComponent, decorators: [{ type: Component, args: [{ selector: 'dd-textarea', template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_isRequired\"> *</span>\n </label>\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <textarea *ngIf=\"!isViewOnly\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [class.invalid]=\"_model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [rows]=\"rows\"\n [(ngModel)]=\"_model[_field]\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n (keyup)=\"validateField()\"\n #inputBox>\n <ng-container *ngIf=\"enableCharacterCounter\">\n <character-counter [currentLength]=\"model[_field]?.length || 0\" [maxLength]=\"maxLength\"></character-counter>\n </ng-container>\n <ng-container *ngIf=\"enableWordCounter\">\n <app-word-counter\n [currentLength]=\"model[_field]\"\n [maxLength]=\"maxWords\"\n (maxLentghReached)=\"showWordCounterWarning = $event\"\n ></app-word-counter>\n </ng-container>\n </textarea>\n\n <div *ngIf=\"isViewOnly\"\n [id]=\"field\"\n [name]=\"field\"\n [title]=\"_title\"\n [class]=\"viewOnlyClass\">\n\n {{ _model[_field] }}\n </div>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n <div *ngIf=\"displayWordCounterWarning && wordCounterWarningMessage !== ''\" class=\"d-flex pb-2\">\n <div class=\"col-12 col-md-7 offset-md-3 bg-warning p-2 rounded\">\n {{ wordCounterWarningMessage }}\n </div>\n </div>\n</div>\n" }] }], ctorParameters: function () { return []; }, propDecorators: { model: [{ type: Input }], field: [{ type: Input }], append: [{ type: Input }], prepend: [{ type: Input }], labelText: [{ type: Input }], inputClass: [{ type: Input }], disabled: [{ type: Input }], isViewOnly: [{ type: Input }], labelClass: [{ type: Input }], inputBlockClass: [{ type: Input }], inputBlockExtraClass: [{ type: Input }], viewOnlyClass: [{ type: Input }], showLabel: [{ type: Input }], autoFocus: [{ type: Input }], wrapperClass: [{ type: Input }], rows: [{ type: Input }], enableCharacterCounter: [{ type: Input }], enableWordCounter: [{ type: Input }], maxLength: [{ type: Input }], maxWords: [{ type: Input }], wordCounterWarningMessage: [{ type: Input }], changed: [{ type: Output }], inputBox: [{ type: ViewChild, args: ['inputBox'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGRhdGEtdWktaW5wdXQvc3JjL2xpYi9jb21wb25lbnRzL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RkYXRhLXVpLWlucHV0L3NyYy9saWIvY29tcG9uZW50cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLFNBQVMsRUFBc0IsZUFBZSxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUU3RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7OztBQU90RixNQUFNLE9BQU8sc0JBQXNCO0lBdUdqQztRQXRHQSxrQkFBYSxHQUFnQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUE4QixrQkFBa0IsQ0FBQyxDQUFDO1FBRW5JLGdDQUFnQztRQUNoQyxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFNBQUksR0FBRyxFQUFFLENBQUM7UUFDVixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixXQUFNLEdBQW1ELElBQUksU0FBUyxFQUFFLENBQUM7UUFrRWhFLGVBQVUsR0FBRyxjQUFjLENBQUM7UUFDNUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FB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M0UsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBYztRQUNsQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7O21IQTVIVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixzeEJDVm5DLHMzREFxREE7MkZEM0NhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxhQUFhOzBFQWtCVixLQUFLO3NCQUFqQixLQUFLO2dCQW9DTyxLQUFLO3NCQUFqQixLQUFLO2dCQU9PLE1BQU07c0JBQWxCLEtBQUs7Z0JBT08sT0FBTztzQkFBbkIsS0FBSztnQkFPTyxTQUFTO3NCQUFyQixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVJLE9BQU87c0JBQWhCLE1BQU07Z0JBRWdCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZU1vZGVsLCBCYXNlTW9kZWxJbnRlcmZhY2UsIERkYXRhQ29yZU1vZHVsZSwgRmllbGRzSW50ZXJmYWNlIH0gZnJvbSAnZGRhdGEtY29yZSc7XG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbnB1dC9oZWxwZXIvaW5wdXQtaGVscGVyLXNlcnZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IElucHV0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0L2hlbHBlci9pbnB1dC1oZWxwZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RkLXRleHRhcmVhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHRhcmVhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dGFyZWEuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZGF0YVRleHRhcmVhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgaGVscGVyU2VydmljZTogSW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlID0gRGRhdGFDb3JlTW9kdWxlLkluamVjdG9ySW5zdGFuY2UuZ2V0PElucHV0SGVscGVyU2VydmljZUludGVyZmFjZT4oSW5wdXRIZWxwZXJTZXJ2aWNlKTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTogdmFyaWFibGUtbmFtZVxuICBfZmllbGQgPSAnJztcbiAgX3RpdGxlID0gJyc7XG4gIF9sYWJlbCA9ICcnO1xuICBfcGxhY2Vob2xkZXIgPSAnJztcbiAgX3ByZXBlbmQgPSAnJztcbiAgX2FwcGVuZCA9ICcnO1xuICBfbWF4ID0gJyc7XG4gIF9pc1JlcXVpcmVkID0gZmFsc2U7XG4gIF9tb2RlbDogQmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55PiA9IG5ldyBCYXNlTW9kZWwoKTtcblxuICBASW5wdXQoKSBzZXQgbW9kZWwodmFsdWU6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT4gfCBudWxsKSB7XG4gICAgLy8gcHJldmVudCB1bmRlZmluZWRcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgaW5wdXQtYm94IGNvbXBvbmVudCBnZXQgdW5kZWZpbmVkIG1vZGVsJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwgPSB2YWx1ZTtcblxuICAgIGlmICghdGhpcy5fbW9kZWwuZmllbGRzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBZb3VyICR7dGhpcy5fbW9kZWwubW9kZWxfbmFtZX0ncyAnZmllbGRzJyBmaWVsZCBpc2AsIHRoaXMuX21vZGVsLmZpZWxkcyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX21vZGVsLmZpZWxkc1t0aGlzLl9maWVsZF0pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSAke3RoaXMuX21vZGVsLm1vZGVsX25hbWV9J3MgJHt0aGlzLl9maWVsZH0gZmllbGQgaXMgYCwgdGhpcy5fbW9kZWwuZmllbGRzW3RoaXMuX2ZpZWxkXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISF0aGlzLl9tb2RlbCAmJiAhIXRoaXMuX21vZGVsLmZpZWxkc1t0aGlzLl9maWVsZF0pIHtcbiAgICAgIHRoaXMuX3RpdGxlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldFRpdGxlKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQbGFjZWhvbGRlcih0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgICAgdGhpcy5fcHJlcGVuZCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQcmVwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9hcHBlbmQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0QXBwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9sYWJlbCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRMYWJlbCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgIH1cblxuICAgIGlmICghIXRoaXMuX21vZGVsICYmICEhdGhpcy5fbW9kZWwudmFsaWRhdGlvblJ1bGVzW3RoaXMuX2ZpZWxkXSkge1xuICAgICAgdGhpcy5faXNSZXF1aXJlZCA9IHRoaXMuaGVscGVyU2VydmljZS5pc1JlcXVpcmVkKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgfVxuICB9XG4gIGdldCBtb2RlbCgpOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gIH1cbiAgQElucHV0KCkgc2V0IGZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9ICdpc1ZhbGlkJztcbiAgICB9XG5cbiAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBhcHBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwZW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IHByZXBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGVuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBsYWJlbFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFiZWwgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBpbnB1dENsYXNzID0gJ2Zvcm0tY29udHJvbCc7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzVmlld09ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgbGFiZWxDbGFzcyA9ICdjb2wtMTIgY29sLW1kLTMgcHgtMCBjb2wtZm9ybS1sYWJlbCc7XG4gIEBJbnB1dCgpIGlucHV0QmxvY2tDbGFzcyA9ICdjb2wtMTIgZC1mbGV4IHB4LTAnO1xuICBASW5wdXQoKSBpbnB1dEJsb2NrRXh0cmFDbGFzcyA9ICdjb2wtbWQtOSc7XG4gIEBJbnB1dCgpIHZpZXdPbmx5Q2xhc3MgPSAnZm9ybS1jb250cm9sIGJvcmRlci0wIGJnLWxpZ2h0JztcbiAgQElucHV0KCkgc2hvd0xhYmVsID0gdHJ1ZTtcbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHdyYXBwZXJDbGFzcyA9ICdkLWZsZXggZmxleC13cmFwJztcbiAgQElucHV0KCkgcm93cyA9ICc1JztcbiAgQElucHV0KCkgZW5hYmxlQ2hhcmFjdGVyQ291bnRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBlbmFibGVXb3JkQ291bnRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhMZW5ndGggPSAyNTU7XG4gIEBJbnB1dCgpIG1heFdvcmRzID0gNztcbiAgQElucHV0KCkgd29yZENvdW50ZXJXYXJuaW5nTWVzc2FnZSA9ICcnO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dEJveCcpIGlucHV0Qm94OiBFbGVtZW50UmVmO1xuXG4gIHJhbmRvbTogc3RyaW5nID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnJhbmRDaGFycygpO1xuXG4gIGRpc3BsYXlXb3JkQ291bnRlcldhcm5pbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEJveC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVGaWVsZCgpOiB2b2lkIHtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnZhbGlkYXRlRmllbGQodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcblxuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICB0aGlzLmNoYW5nZWQuZW1pdCh0aGlzLl9tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgc2V0V29yZENvdW50ZXJXYXJuaW5nKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5V29yZENvdW50ZXJXYXJuaW5nID0gdmFsdWU7XG4gIH1cblxufVxuIiwiPGRpdiBbY2xhc3NdPVwid3JhcHBlckNsYXNzXCI+XG4gIDxsYWJlbCBbY2xhc3NdPVwibGFiZWxDbGFzc1wiIFtmb3JdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCIgKm5nSWY9XCJzaG93TGFiZWxcIj5cbiAgICB7eyBfbGFiZWwgfX06XG4gICAgPHNwYW4gKm5nSWY9XCJfaXNSZXF1aXJlZFwiPiAqPC9zcGFuPlxuICA8L2xhYmVsPlxuICA8ZGl2IFtjbGFzc109XCJpbnB1dEJsb2NrQ2xhc3NcIiBbbmdDbGFzc109XCJzaG93TGFiZWwgPyBpbnB1dEJsb2NrRXh0cmFDbGFzcyA6ICcnXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIiAqbmdJZj1cIiBfcHJlcGVuZCAhPSAnJyBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+e3sgX3ByZXBlbmQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDx0ZXh0YXJlYSAqbmdJZj1cIiFpc1ZpZXdPbmx5XCJcbiAgICAgIFtpZF09XCJfZmllbGQgKyAnXycgKyByYW5kb21cIlxuICAgICAgW2F0dHIubmFtZV09XCJfZmllbGQgKyAnXycgKyByYW5kb21cIlxuICAgICAgW2NsYXNzLmludmFsaWRdPVwiX21vZGVsLnZhbGlkYXRpb25FcnJvcnMuaW5jbHVkZXMoX2ZpZWxkKVwiXG4gICAgICBbY2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4gICAgICBbcm93c109XCJyb3dzXCJcbiAgICAgIFsobmdNb2RlbCldPVwiX21vZGVsW19maWVsZF1cIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIl9wbGFjZWhvbGRlclwiXG4gICAgICBbdGl0bGVdPVwiX3RpdGxlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAoa2V5dXApPVwidmFsaWRhdGVGaWVsZCgpXCJcbiAgICAgICNpbnB1dEJveD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbmFibGVDaGFyYWN0ZXJDb3VudGVyXCI+XG4gICAgICAgIDxjaGFyYWN0ZXItY291bnRlciBbY3VycmVudExlbmd0aF09XCJtb2RlbFtfZmllbGRdPy5sZW5ndGggfHwgMFwiIFttYXhMZW5ndGhdPVwibWF4TGVuZ3RoXCI+PC9jaGFyYWN0ZXItY291bnRlcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZVdvcmRDb3VudGVyXCI+XG4gICAgICAgIDxhcHAtd29yZC1jb3VudGVyXG4gICAgICAgIFtjdXJyZW50TGVuZ3RoXT1cIm1vZGVsW19maWVsZF1cIlxuICAgICAgICBbbWF4TGVuZ3RoXT1cIm1heFdvcmRzXCJcbiAgICAgICAgKG1heExlbnRnaFJlYWNoZWQpPVwic2hvd1dvcmRDb3VudGVyV2FybmluZyA9ICRldmVudFwiXG4gICAgICA+PC9hcHAtd29yZC1jb3VudGVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90ZXh0YXJlYT5cblxuICAgIDxkaXYgKm5nSWY9XCJpc1ZpZXdPbmx5XCJcbiAgICAgIFtpZF09XCJmaWVsZFwiXG4gICAgICBbbmFtZV09XCJmaWVsZFwiXG4gICAgICBbdGl0bGVdPVwiX3RpdGxlXCJcbiAgICAgIFtjbGFzc109XCJ2aWV3T25seUNsYXNzXCI+XG5cbiAgICAgIHt7IF9tb2RlbFtfZmllbGRdIH19XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCIgKm5nSWY9XCJfYXBwZW5kICE9ICcnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPnt7IF9hcHBlbmQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJkaXNwbGF5V29yZENvdW50ZXJXYXJuaW5nICYmIHdvcmRDb3VudGVyV2FybmluZ01lc3NhZ2UgIT09ICcnXCIgY2xhc3M9XCJkLWZsZXggcGItMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTcgb2Zmc2V0LW1kLTMgYmctd2FybmluZyBwLTIgcm91bmRlZFwiPlxuICAgICAge3sgd29yZENvdW50ZXJXYXJuaW5nTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19