ddata-ui-input
Version:
DData UI Input module, components, models & services
152 lines • 23.8 kB
JavaScript
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
import { DdataCoreModule, BaseModel } 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";
import * as i3 from "ngx-material-timepicker";
export class DdataInputTimeComponent {
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.disabled = false;
this.isViewOnly = false;
this.type = 'text';
this.inputClass = 'form-control';
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.format = 24;
this.changed = new EventEmitter();
this.random = this.helperService.randChars();
}
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);
}
}
setTime(time) {
this._model[this._field] = time;
this.validateField();
}
}
DdataInputTimeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputTimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
DdataInputTimeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataInputTimeComponent, selector: "dd-input-time", inputs: { model: "model", field: "field", append: "append", prepend: "prepend", labelText: "labelText", disabled: "disabled", isViewOnly: "isViewOnly", type: "type", inputClass: "inputClass", labelClass: "labelClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", viewOnlyClass: "viewOnlyClass", showLabel: "showLabel", autoFocus: "autoFocus", wrapperClass: "wrapperClass", format: "format" }, 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\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 <ng-container *ngIf=\"!isViewOnly\">\n <input\n [ngxTimepicker]=\"timepicker\"\n [format]=\"format\"\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [(ngModel)]=\"_model[_field]\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n [type]=\"type\"\n [autocomplete]=\"random\"\n (keyup)=\"validateField()\"\n #inputBox>\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div\n [id]=\"_field + '_' + random\"\n [class]=\"viewOnlyClass\"\n [attr.name]=\"_field + '_' + random\"\n [title]=\"_title\">\n {{ model[_field] }}\n </div>\n </ng-container>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n\n</div>\n\n<ngx-material-timepicker #timepicker (timeSet)=\"setTime($event)\" ></ngx-material-timepicker>\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"] }, { kind: "component", type: i3.NgxMaterialTimepickerComponent, selector: "ngx-material-timepicker", inputs: ["ESC", "hoursOnly", "ngxMaterialTimepickerTheme", "format", "minutesGap", "cancelBtnTmpl", "editableHintTmpl", "confirmBtnTmpl", "enableKeyboardInput", "preventOverlayClick", "disableAnimation", "appendToInput", "defaultTime", "timepickerClass", "theme", "min", "max"], outputs: ["timeSet", "opened", "closed", "hourSelected", "timeChanged"] }, { kind: "directive", type: i3.TimepickerDirective, selector: "[ngxTimepicker]", inputs: ["format", "value", "min", "max", "ngxTimepicker", "disabled", "disableClick"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputTimeComponent, decorators: [{
type: Component,
args: [{ selector: 'dd-input-time', template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_isRequired\"> *</span>\n </label>\n\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 <ng-container *ngIf=\"!isViewOnly\">\n <input\n [ngxTimepicker]=\"timepicker\"\n [format]=\"format\"\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [(ngModel)]=\"_model[_field]\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n [type]=\"type\"\n [autocomplete]=\"random\"\n (keyup)=\"validateField()\"\n #inputBox>\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div\n [id]=\"_field + '_' + random\"\n [class]=\"viewOnlyClass\"\n [attr.name]=\"_field + '_' + random\"\n [title]=\"_title\">\n {{ model[_field] }}\n </div>\n </ng-container>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n\n</div>\n\n<ngx-material-timepicker #timepicker (timeSet)=\"setTime($event)\" ></ngx-material-timepicker>\n" }]
}], ctorParameters: function () { return []; }, propDecorators: { model: [{
type: Input
}], field: [{
type: Input
}], append: [{
type: Input
}], prepend: [{
type: Input
}], labelText: [{
type: Input
}], disabled: [{
type: Input
}], isViewOnly: [{
type: Input
}], type: [{
type: Input
}], inputClass: [{
type: Input
}], labelClass: [{
type: Input
}], inputBlockClass: [{
type: Input
}], inputBlockExtraClass: [{
type: Input
}], viewOnlyClass: [{
type: Input
}], showLabel: [{
type: Input
}], autoFocus: [{
type: Input
}], wrapperClass: [{
type: Input
}], format: [{
type: Input
}], changed: [{
type: Output
}], inputBox: [{
type: ViewChild,
args: ['inputBox']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvdGltZS90aW1lLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RkYXRhLXVpLWlucHV0L3NyYy9saWIvY29tcG9uZW50cy90aW1lL3RpbWUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQTZCLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBbUIsZUFBZSxFQUFzQixTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7Ozs7O0FBT3RGLE1BQU0sT0FBTyx1QkFBdUI7SUFrR2xDO1FBakdBLGtCQUFhLEdBQWdDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQThCLGtCQUFrQixDQUFDLENBQUM7UUFFbkksZ0NBQWdDO1FBQ2hDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLFdBQU0sR0FBbUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQWtFaEUsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLFNBQUksR0FBRyxNQUFNLENBQUM7UUFD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QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRWhDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDOztvSEF6SFUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsMG1CQ1ZwQyw4Z0RBK0NBOzJGRHJDYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UsZUFBZTswRUFrQlosS0FBSztzQkFBakIsS0FBSztnQkFvQ08sS0FBSztzQkFBakIsS0FBSztnQkFPTyxNQUFNO3NCQUFsQixLQUFLO2dCQU9PLE9BQU87c0JBQW5CLEtBQUs7Z0JBT08sU0FBUztzQkFBckIsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFSSxPQUFPO3NCQUFoQixNQUFNO2dCQUVnQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkc0ludGVyZmFjZSwgRGRhdGFDb3JlTW9kdWxlLCBCYXNlTW9kZWxJbnRlcmZhY2UsIEJhc2VNb2RlbCB9IGZyb20gJ2RkYXRhLWNvcmUnO1xuaW1wb3J0IHsgSW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW5wdXQvaGVscGVyL2lucHV0LWhlbHBlci1zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbnB1dC9oZWxwZXIvaW5wdXQtaGVscGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZC1pbnB1dC10aW1lJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90aW1lLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGRhdGFJbnB1dFRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBoZWxwZXJTZXJ2aWNlOiBJbnB1dEhlbHBlclNlcnZpY2VJbnRlcmZhY2UgPSBEZGF0YUNvcmVNb2R1bGUuSW5qZWN0b3JJbnN0YW5jZS5nZXQ8SW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlPihJbnB1dEhlbHBlclNlcnZpY2UpO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlOiB2YXJpYWJsZS1uYW1lXG4gIF9maWVsZCA9ICcnO1xuICBfdGl0bGUgPSAnJztcbiAgX2xhYmVsID0gJyc7XG4gIF9wbGFjZWhvbGRlciA9ICcnO1xuICBfcHJlcGVuZCA9ICcnO1xuICBfYXBwZW5kID0gJyc7XG4gIF9tYXggPSAnJztcbiAgX2lzUmVxdWlyZWQgPSBmYWxzZTtcbiAgX21vZGVsOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+ID0gbmV3IEJhc2VNb2RlbCgpO1xuXG4gIEBJbnB1dCgpIHNldCBtb2RlbCh2YWx1ZTogQmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55PiB8IG51bGwpIHtcbiAgICAvLyBwcmV2ZW50IHVuZGVmaW5lZFxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBpbnB1dC1ib3ggY29tcG9uZW50IGdldCB1bmRlZmluZWQgbW9kZWwnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9tb2RlbCA9IHZhbHVlO1xuXG4gICAgaWYgKCF0aGlzLl9tb2RlbC5maWVsZHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdXIgJHt0aGlzLl9tb2RlbC5tb2RlbF9uYW1lfSdzICdmaWVsZHMnIGZpZWxkIGlzYCwgdGhpcy5fbW9kZWwuZmllbGRzKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fbW9kZWwuZmllbGRzW3RoaXMuX2ZpZWxkXSkge1xuICAgICAgY29uc29sZS5lcnJvcihgVGhlICR7dGhpcy5fbW9kZWwubW9kZWxfbmFtZX0ncyAke3RoaXMuX2ZpZWxkfSBmaWVsZCBpcyBgLCB0aGlzLl9tb2RlbC5maWVsZHNbdGhpcy5fZmllbGRdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghIXRoaXMuX21vZGVsICYmICEhdGhpcy5fbW9kZWwuZmllbGRzW3RoaXMuX2ZpZWxkXSkge1xuICAgICAgdGhpcy5fdGl0bGUgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0VGl0bGUodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcbiAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldFBsYWNlaG9sZGVyKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9wcmVwZW5kID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldFByZXBlbmQodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcbiAgICAgIHRoaXMuX2FwcGVuZCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRBcHBlbmQodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcbiAgICAgIHRoaXMuX2xhYmVsID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldExhYmVsKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKCEhdGhpcy5fbW9kZWwgJiYgISF0aGlzLl9tb2RlbC52YWxpZGF0aW9uUnVsZXNbdGhpcy5fZmllbGRdKSB7XG4gICAgICB0aGlzLl9pc1JlcXVpcmVkID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmlzUmVxdWlyZWQodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IG1vZGVsKCk6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgfVxuICBASW5wdXQoKSBzZXQgZmllbGQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJ2lzVmFsaWQnO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpZWxkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IGFwcGVuZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBzZXQgcHJlcGVuZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwZW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IGxhYmVsVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLl9sYWJlbCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzVmlld09ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgdHlwZSA9ICd0ZXh0JztcbiAgQElucHV0KCkgaW5wdXRDbGFzcyA9ICdmb3JtLWNvbnRyb2wnO1xuICBASW5wdXQoKSBsYWJlbENsYXNzID0gJ2NvbC0xMiBjb2wtbWQtMyBweC0wIGNvbC1mb3JtLWxhYmVsJztcbiAgQElucHV0KCkgaW5wdXRCbG9ja0NsYXNzID0gJ2NvbC0xMiBkLWZsZXggcHgtMCc7XG4gIEBJbnB1dCgpIGlucHV0QmxvY2tFeHRyYUNsYXNzID0gJ2NvbC1tZC05JztcbiAgQElucHV0KCkgdmlld09ubHlDbGFzcyA9ICdmb3JtLWNvbnRyb2wgYm9yZGVyLTAgYmctbGlnaHQnO1xuICBASW5wdXQoKSBzaG93TGFiZWwgPSB0cnVlO1xuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KCkgd3JhcHBlckNsYXNzID0gJ2QtZmxleCBmbGV4LXdyYXAnO1xuICBASW5wdXQoKSBmb3JtYXQ6IDEyIHwgMjQgPSAyNDtcblxuICBAT3V0cHV0KCkgY2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXRCb3gnKSBpbnB1dEJveDogRWxlbWVudFJlZjtcblxuICByYW5kb206IHN0cmluZyA9IHRoaXMuaGVscGVyU2VydmljZS5yYW5kQ2hhcnMoKTtcblxuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Qm94Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUZpZWxkKCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmhlbHBlclNlcnZpY2UudmFsaWRhdGVGaWVsZCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMuX21vZGVsKTtcbiAgICB9XG4gIH1cblxuICBzZXRUaW1lKHRpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsW3RoaXMuX2ZpZWxkXSA9IHRpbWU7XG5cbiAgICB0aGlzLnZhbGlkYXRlRmllbGQoKTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3NdPVwid3JhcHBlckNsYXNzXCI+XG4gIDxsYWJlbCBbY2xhc3NdPVwibGFiZWxDbGFzc1wiIFtmb3JdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCIgKm5nSWY9XCJzaG93TGFiZWxcIj5cbiAgICB7eyBfbGFiZWwgfX06XG4gICAgPHNwYW4gKm5nSWY9XCJfaXNSZXF1aXJlZFwiPiAqPC9zcGFuPlxuICA8L2xhYmVsPlxuXG4gIDxkaXYgW2NsYXNzXT1cImlucHV0QmxvY2tDbGFzc1wiIFtuZ0NsYXNzXT1cInNob3dMYWJlbCA/IGlucHV0QmxvY2tFeHRyYUNsYXNzIDogJydcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiICpuZ0lmPVwiIF9wcmVwZW5kICE9ICcnIFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj57eyBfcHJlcGVuZCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1ZpZXdPbmx5XCI+XG4gICAgICA8aW5wdXRcbiAgICAgICAgW25neFRpbWVwaWNrZXJdPVwidGltZXBpY2tlclwiXG4gICAgICAgIFtmb3JtYXRdPVwiZm9ybWF0XCJcbiAgICAgICAgW2NsYXNzLmludmFsaWRdPVwibW9kZWwudmFsaWRhdGlvbkVycm9ycy5pbmNsdWRlcyhfZmllbGQpXCJcbiAgICAgICAgW2NsYXNzXT1cImlucHV0Q2xhc3NcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cIl9tb2RlbFtfZmllbGRdXCJcbiAgICAgICAgW2lkXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiXG4gICAgICAgIFthdHRyLm5hbWVdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIl9wbGFjZWhvbGRlclwiXG4gICAgICAgIFt0aXRsZV09XCJfdGl0bGVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJyYW5kb21cIlxuICAgICAgICAoa2V5dXApPVwidmFsaWRhdGVGaWVsZCgpXCJcbiAgICAgICAgI2lucHV0Qm94PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZpZXdPbmx5XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIFtpZF09XCJfZmllbGQgKyAnXycgKyByYW5kb21cIlxuICAgICAgICBbY2xhc3NdPVwidmlld09ubHlDbGFzc1wiXG4gICAgICAgIFthdHRyLm5hbWVdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCJcbiAgICAgICAgW3RpdGxlXT1cIl90aXRsZVwiPlxuICAgICAgICAgIHt7IG1vZGVsW19maWVsZF0gfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiICpuZ0lmPVwiX2FwcGVuZCAhPSAnJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj57eyBfYXBwZW5kIH19PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L2Rpdj5cblxuPG5neC1tYXRlcmlhbC10aW1lcGlja2VyICN0aW1lcGlja2VyICh0aW1lU2V0KT1cInNldFRpbWUoJGV2ZW50KVwiID48L25neC1tYXRlcmlhbC10aW1lcGlja2VyPlxuIl19