UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

263 lines 31.1 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Output, EventEmitter, ViewChild, Renderer2 } from '@angular/core'; import { Subject, Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { Column, ColumnType, GridSettings } from '@true-directive/base'; import { Keys } from '@true-directive/base'; import { DropdownBaseComponent } from '../controls/dropdown-base.component'; var EditorSelectTrueComponent = /** @class */ (function () { function EditorSelectTrueComponent(_renderer) { this._renderer = _renderer; this.destroy$ = new Subject(); this.ie = false; this.valueChanged = false; this.height = 0; this.wasShown = false; this.initialized = false; this._value = null; this.displayValue = ''; this.disableTextEditor = false; this.commit = new EventEmitter(); this.change = new EventEmitter(); this.cancel = new EventEmitter(); /** * Список колонок выпадающего списка */ this._columns = null; /** * Настройки грида в выпадающем списке */ this._settings = null; /** * Данные выпадающего списка */ this._items = null; this._valueField = null; this._displayField = null; } Object.defineProperty(EditorSelectTrueComponent.prototype, "value", { get: function () { return this._value; }, set: function (v) { this._value = v; this.change.emit(v); }, enumerable: true, configurable: true }); Object.defineProperty(EditorSelectTrueComponent.prototype, "maxDropDownHeight", { get: function () { return this.state.settings.maxDropDownHeight; }, enumerable: true, configurable: true }); Object.defineProperty(EditorSelectTrueComponent.prototype, "columns", { get: function () { if (this._columns === null) { if (this.column.optionsColumns !== null) { this._columns = this.column.optionsColumns; } else { this._columns = [new Column('name', 'name', 300, ColumnType.STRING)]; } } return this._columns; }, enumerable: true, configurable: true }); Object.defineProperty(EditorSelectTrueComponent.prototype, "settings", { get: function () { if (this._settings === null) { this._settings = GridSettings.minimal(); this._settings.appearance.class = this.state.settings.appearance.class; this._settings.appearance.enableFocusedAppearance = false; this._settings.showHeader = false; this._settings.searchDelay = 100; } return this._settings; }, enumerable: true, configurable: true }); Object.defineProperty(EditorSelectTrueComponent.prototype, "items", { get: function () { var _this = this; if (this._items === null) { if (this.column.optionsData instanceof Observable) { // Подпись var observable = this.column.optionsData; observable.pipe(takeUntil(this.destroy$)).subscribe(function (data) { _this._items = data; }); } else { this._items = this.column.optionsData; } } return this._items; }, enumerable: true, configurable: true }); Object.defineProperty(EditorSelectTrueComponent.prototype, "valueField", { get: function () { if (this._valueField === null) { this._valueField = this.columns[0].fieldName; } return this._valueField; }, enumerable: true, configurable: true }); Object.defineProperty(EditorSelectTrueComponent.prototype, "displayField", { get: function () { if (this._displayField === null) { this._displayField = this.columns[0].fieldName; } return this._displayField; }, enumerable: true, configurable: true }); EditorSelectTrueComponent.prototype.init = function (value, valueChanged, height, ie, wasShown) { if (ie === void 0) { ie = false; } if (wasShown === void 0) { wasShown = false; } if (this.state.touchMode) { this.input.popupPosition = 'MODAL'; this.disableTextEditor = true; } if (valueChanged) { if (!this.disableTextEditor) { this.displayValue = value; this.valueChanged = true; } else { this.valueChanged = false; } this.change.emit(null); } else { // Без события об изменении this._value = value; } this.wasShown = wasShown; this.height = height; this.ie = ie; }; EditorSelectTrueComponent.prototype.inputItemSelect = function (e) { if (this.state.touchMode) { this.commit.emit(this.value); } }; // Останавливаем propagation, чтобы не влиять на grid EditorSelectTrueComponent.prototype.inputMouseDown = function (e) { e.stopPropagation(); }; EditorSelectTrueComponent.prototype.inputKeyDown = function (e) { if (e.defaultPrevented) { return; } if (e.keyCode === Keys.TAB) { this.input.setValueFromDisplayed(); return; } if (e.keyCode === Keys.UP || e.keyCode === Keys.DOWN || e.keyCode === Keys.PAGE_UP || e.keyCode === Keys.PAGE_DOWN) { // По идее просто их должен отработать грид e.stopPropagation(); return; } e.stopPropagation(); if (e.keyCode === Keys.ESCAPE) { this.cancel.emit(); return; } if (e.keyCode === Keys.ENTER) { this.commit.emit(this.value); return; } }; EditorSelectTrueComponent.prototype.ngAfterContentInit = function () { var _this = this; if (!this.valueChanged) { if (this.state.touchMode) { // На тач устройствах не будем фокусироваться на инпуте, // нам достаточно показать форму для выбора в модальном режиме if (!this.wasShown) { setTimeout(function () { return _this.input.showByTarget(); }); } } else { setTimeout(function () { return _this.input.focus(); }); } return; } this.input.focus(); setTimeout(function () { _this._renderer.setProperty(_this.input.input.nativeElement, 'value', _this.displayValue); _this._renderer.setProperty(_this.input.input.nativeElement, 'selectionStart', _this.displayValue.length); _this._renderer.setProperty(_this.input.input.nativeElement, 'selectionEnd', _this.displayValue.length); _this.input.displayValue = _this.displayValue === null ? '' : _this.displayValue; _this.input.inputInput(); }); }; // Если у нас есть информация о высоте строки - берем её и не // назначаем никакого класса EditorSelectTrueComponent.prototype.getClass = function () { if ((this.height !== null && this.height > 0)) { return 'true-grid__input-container'; } if (this.ie) { return 'true-grid-editor-ie'; } return 'true-grid-editor-100p'; }; EditorSelectTrueComponent.prototype.getH = function () { if (this.height !== null && this.height > 0) { return this.height + 'px'; } return '100%'; }; EditorSelectTrueComponent.prototype.ngOnDestroy = function () { // Если нас удаляют... this.destroy$.next(true); this.destroy$.unsubscribe(); }; tslib_1.__decorate([ ViewChild('input', { static: true }), tslib_1.__metadata("design:type", DropdownBaseComponent) ], EditorSelectTrueComponent.prototype, "input", void 0); tslib_1.__decorate([ Output("commit"), tslib_1.__metadata("design:type", EventEmitter) ], EditorSelectTrueComponent.prototype, "commit", void 0); tslib_1.__decorate([ Output("change"), tslib_1.__metadata("design:type", EventEmitter) ], EditorSelectTrueComponent.prototype, "change", void 0); tslib_1.__decorate([ Output("cancel"), tslib_1.__metadata("design:type", EventEmitter) ], EditorSelectTrueComponent.prototype, "cancel", void 0); EditorSelectTrueComponent = tslib_1.__decorate([ Component({ selector: 'true-editor-select-true', template: "<div [ngClass]=\"getClass()\" [style.height]=\"getH()\">\n <true-select #input\n class=\"true-editor-select__selector\"\n [(ngModel)]=\"value\"\n [style.height]=\"getH()\"\n [valueField]=\"valueField\"\n [displayField]=\"displayField\"\n [columns]=\"columns\"\n [settings]=\"settings\"\n [items]=\"items\"\n [useAltDown]=\"true\"\n [maxDropDownHeight]=\"maxDropDownHeight\"\n [disableTextEditor]=\"disableTextEditor\"\n (mousedown)=\"inputMouseDown($event)\"\n (itemSelect)=\"inputItemSelect($event)\"\n (keydown)=\"inputKeyDown($event)\"></true-select>\n </div>", styles: [":host{box-sizing:border-box;padding:0}.true-editor-select__selector{width:100%}.true-editor-select__selector ::ng-deep .true-select__input{height:100%}.true-editor-select__selector ::ng-deep input{border:0}.true-editor-select__container{padding:0;margin:0;background-color:#00f;box-sizing:border-box;height:100%}"] }), tslib_1.__metadata("design:paramtypes", [Renderer2]) ], EditorSelectTrueComponent); return EditorSelectTrueComponent; }()); export { EditorSelectTrueComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXNlbGVjdC10cnVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL2VkaXRvcnMvZWRpdG9yLXNlbGVjdC10cnVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQVMsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQ2pELFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBd0I1RTtJQW9PRSxtQ0FBc0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWxPaEMsYUFBUSxHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRXRELE9BQUUsR0FBWSxLQUFLLENBQUM7UUFDcEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLFdBQU0sR0FBUSxJQUFJLENBQUM7UUFjcEIsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFFMUIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBVWpDLFdBQU0sR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUdsRCxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHL0Ms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LFlBQVk7NkRBQTRCO0lBM0NyQyx5QkFBeUI7UUFyQnJDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSx5QkFBeUI7WUFDbkMsUUFBUSxFQUFFLDh4QkFnQk87O1NBRWhCLENBQUM7aURBcU8rQixTQUFTO09BcE8vQix5QkFBeUIsQ0FxT3JDO0lBQUQsZ0NBQUM7Q0FBQSxBQXJPRCxJQXFPQztTQXJPWSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgQWxla3NleSBNZWxuaWtvdiwgVHJ1ZSBEaXJlY3RpdmUgQ29tcGFueS5cclxuICogQGxpbmsgaHR0cHM6Ly90cnVlZGlyZWN0aXZlLmNvbS9cclxuICogQGxpY2Vuc2UgTUlUXHJcbiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsXHJcbiAgICAgICAgIFJlbmRlcmVyMiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IENvbHVtbiwgQ29sdW1uVHlwZSwgR3JpZFNldHRpbmdzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBLZXlzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuaW1wb3J0IHsgR3JpZFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2dyaWQtc3RhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbnRyb2xzL2Ryb3Bkb3duLWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSUVkaXRvciB9IGZyb20gXCIuL2VkaXRvci5pbnRlcmZhY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1lZGl0b3Itc2VsZWN0LXRydWUnLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBbbmdDbGFzc109XCJnZXRDbGFzcygpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIKClcIj5cclxuICAgICAgICAgICAgICA8dHJ1ZS1zZWxlY3QgI2lucHV0XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRydWUtZWRpdG9yLXNlbGVjdF9fc2VsZWN0b3JcIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImdldEgoKVwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJ2YWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RmllbGRdPVwiZGlzcGxheUZpZWxkXCJcclxuICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgW3NldHRpbmdzXT1cInNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtc1wiXHJcbiAgICAgICAgICAgICAgICBbdXNlQWx0RG93bl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFttYXhEcm9wRG93bkhlaWdodF09XCJtYXhEcm9wRG93bkhlaWdodFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZVRleHRFZGl0b3JdPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJpbnB1dE1vdXNlRG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChpdGVtU2VsZWN0KT1cImlucHV0SXRlbVNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImlucHV0S2V5RG93bigkZXZlbnQpXCI+PC90cnVlLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+YCxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0b3Itc2VsZWN0LXRydWUuY29tcG9uZW50LnNjc3MnXVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBFZGl0b3JTZWxlY3RUcnVlQ29tcG9uZW50IGltcGxlbWVudHMgSUVkaXRvciwgT25EZXN0cm95IHtcclxuXHJcbiAgcHJvdGVjdGVkIGRlc3Ryb3kkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBpZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBoZWlnaHQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSB3YXNTaG93biA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHY7XHJcbiAgICB0aGlzLmNoYW5nZS5lbWl0KHYpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtYXhEcm9wRG93bkhlaWdodCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc2V0dGluZ3MubWF4RHJvcERvd25IZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHVibGljIGRpc2FibGVUZXh0RWRpdG9yID0gZmFsc2U7XHJcblxyXG4gIHN0YXRlOiBHcmlkU3RhdGVTZXJ2aWNlO1xyXG4gIGNvbHVtbjogQ29sdW1uO1xyXG4gIHJvdzogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdpbnB1dCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGlucHV0OiBEcm9wZG93bkJhc2VDb21wb25lbnQ7XHJcblxyXG4gIEBPdXRwdXQoXCJjb21taXRcIilcclxuICBjb21taXQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KFwiY2hhbmdlXCIpXHJcbiAgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dChcImNhbmNlbFwiKVxyXG4gIGNhbmNlbDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKipcclxuICAgKiDQodC/0LjRgdC+0Log0LrQvtC70L7QvdC+0Log0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LBcclxuICAgKi9cclxuICBwcml2YXRlIF9jb2x1bW5zOiBDb2x1bW5bXSA9IG51bGw7XHJcbiAgZ2V0IGNvbHVtbnMoKTogQ29sdW1uW10ge1xyXG4gICAgaWYgKHRoaXMuX2NvbHVtbnMgPT09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMuY29sdW1uLm9wdGlvbnNDb2x1bW5zICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IHRoaXMuY29sdW1uLm9wdGlvbnNDb2x1bW5zO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSBbbmV3IENvbHVtbignbmFtZScsICduYW1lJywgMzAwLCBDb2x1bW5UeXBlLlNUUklORyldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCd0LDRgdGC0YDQvtC50LrQuCDQs9GA0LjQtNCwINCyINCy0YvQv9Cw0LTQsNGO0YnQtdC8INGB0L/QuNGB0LrQtVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3NldHRpbmdzOiBHcmlkU2V0dGluZ3MgPSBudWxsO1xyXG4gIGdldCBzZXR0aW5ncygpIHtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5ncyA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IEdyaWRTZXR0aW5ncy5taW5pbWFsKCk7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmFwcGVhcmFuY2UuY2xhc3MgPSB0aGlzLnN0YXRlLnNldHRpbmdzLmFwcGVhcmFuY2UuY2xhc3M7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmFwcGVhcmFuY2UuZW5hYmxlRm9jdXNlZEFwcGVhcmFuY2UgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fc2V0dGluZ3Muc2hvd0hlYWRlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5zZWFyY2hEZWxheSA9IDEwMDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCU0LDQvdC90YvQtSDQstGL0L/QsNC00LDRjtGJ0LXQs9C+INGB0L/QuNGB0LrQsFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2l0ZW1zOiBhbnlbXSA9IG51bGw7XHJcbiAgZ2V0IGl0ZW1zKCk6IGFueVtdIHtcclxuICAgIGlmICh0aGlzLl9pdGVtcyA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW4ub3B0aW9uc0RhdGEgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XHJcbiAgICAgICAgLy8g0J/QvtC00L/QuNGB0YxcclxuICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gPE9ic2VydmFibGU8YW55Pj50aGlzLmNvbHVtbi5vcHRpb25zRGF0YTtcclxuICAgICAgICBvYnNlcnZhYmxlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9pdGVtcyA9IGRhdGE7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faXRlbXMgPSB0aGlzLmNvbHVtbi5vcHRpb25zRGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmFsdWVGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgcHVibGljIGdldCB2YWx1ZUZpZWxkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fdmFsdWVGaWVsZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl92YWx1ZUZpZWxkID0gdGhpcy5jb2x1bW5zWzBdLmZpZWxkTmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl92YWx1ZUZpZWxkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGlzcGxheUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIHB1YmxpYyBnZXQgZGlzcGxheUZpZWxkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fZGlzcGxheUZpZWxkID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2Rpc3BsYXlGaWVsZCA9IHRoaXMuY29sdW1uc1swXS5maWVsZE5hbWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheUZpZWxkO1xyXG4gIH1cclxuXHJcbiAgaW5pdCh2YWx1ZTogYW55LCB2YWx1ZUNoYW5nZWQ6IGJvb2xlYW4sIGhlaWdodDogbnVtYmVyLCBpZTogYm9vbGVhbiA9IGZhbHNlLCB3YXNTaG93bjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGhpcy5zdGF0ZS50b3VjaE1vZGUpIHtcclxuICAgICAgdGhpcy5pbnB1dC5wb3B1cFBvc2l0aW9uID0gJ01PREFMJztcclxuICAgICAgdGhpcy5kaXNhYmxlVGV4dEVkaXRvciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZVRleHRFZGl0b3IpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDQkdC10Lcg0YHQvtCx0YvRgtC40Y8g0L7QsSDQuNC30LzQtdC90LXQvdC40LhcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLndhc1Nob3duID0gd2FzU2hvd247XHJcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgIHRoaXMuaWUgPSBpZTtcclxuICB9XHJcblxyXG4gIGlucHV0SXRlbVNlbGVjdChlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnN0YXRlLnRvdWNoTW9kZSkge1xyXG4gICAgICB0aGlzLmNvbW1pdC5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g0J7RgdGC0LDQvdCw0LLQu9C40LLQsNC10LwgcHJvcGFnYXRpb24sINGH0YLQvtCx0Ysg0L3QtSDQstC70LjRj9GC0Ywg0L3QsCBncmlkXHJcbiAgaW5wdXRNb3VzZURvd24oZTogYW55KSB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRLZXlEb3duKGU6IGFueSkge1xyXG5cclxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuVEFCKSB7XHJcbiAgICAgIHRoaXMuaW5wdXQuc2V0VmFsdWVGcm9tRGlzcGxheWVkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlVQIHx8XHJcbiAgICAgICAgZS5rZXlDb2RlID09PSBLZXlzLkRPV04gfHxcclxuICAgICAgICBlLmtleUNvZGUgPT09IEtleXMuUEFHRV9VUCB8fFxyXG4gICAgICAgIGUua2V5Q29kZSA9PT0gS2V5cy5QQUdFX0RPV04pIHtcclxuICAgICAgLy8g0J/QviDQuNC00LXQtSDQv9GA0L7RgdGC0L4g0LjRhSDQtNC+0LvQttC10L0g0L7RgtGA0LDQsdC+0YLQsNGC0Ywg0LPRgNC40LRcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpIHtcclxuICAgICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FTlRFUikge1xyXG4gICAgICB0aGlzLmNvbW1pdC5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMudmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlLnRvdWNoTW9kZSkge1xyXG4gICAgICAgIC8vINCd0LAg0YLQsNGHINGD0YHRgtGA0L7QudGB0YLQstCw0YUg0L3QtSDQsdGD0LTQtdC8INGE0L7QutGD0YHQuNGA0L7QstCw0YLRjNGB0Y8g0L3QsCDQuNC90L/Rg9GC0LUsXHJcbiAgICAgICAgLy8g0L3QsNC8INC00L7RgdGC0LDRgtC+0YfQvdC+INC/0L7QutCw0LfQsNGC0Ywg0YTQvtGA0LzRgyDQtNC70Y8g0LLRi9Cx0L7RgNCwINCyINC80L7QtNCw0LvRjNC90L7QvCDRgNC10LbQuNC80LVcclxuICAgICAgICBpZiAoIXRoaXMud2FzU2hvd24pIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnB1dC5zaG93QnlUYXJnZXQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnB1dC5mb2N1cygpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbnB1dC5mb2N1cygpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdGhpcy5kaXNwbGF5VmFsdWUpO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0LmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25TdGFydCcsIHRoaXMuZGlzcGxheVZhbHVlLmxlbmd0aCk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvbkVuZCcsIHRoaXMuZGlzcGxheVZhbHVlLmxlbmd0aCk7XHJcbiAgICAgIHRoaXMuaW5wdXQuZGlzcGxheVZhbHVlID0gdGhpcy5kaXNwbGF5VmFsdWUgPT09IG51bGwgPyAnJyA6IHRoaXMuZGlzcGxheVZhbHVlO1xyXG4gICAgICB0aGlzLmlucHV0LmlucHV0SW5wdXQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g0JXRgdC70Lgg0YMg0L3QsNGBINC10YHRgtGMINC40L3RhNC+0YDQvNCw0YbQuNGPINC+INCy0YvRgdC+0YLQtSDRgdGC0YDQvtC60LggLSDQsdC10YDQtdC8INC10ZEg0Lgg0L3QtVxyXG4gIC8vINC90LDQt9C90LDRh9Cw0LXQvCDQvdC40LrQsNC60L7Qs9C+INC60LvQsNGB0YHQsFxyXG4gIGdldENsYXNzKCkge1xyXG4gICAgaWYgKCh0aGlzLmhlaWdodCAhPT0gbnVsbCAmJiB0aGlzLmhlaWdodCA+IDApKSB7XHJcbiAgICAgIHJldHVybiAndHJ1ZS1ncmlkX19pbnB1dC1jb250YWluZXInO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaWUpIHtcclxuICAgICAgcmV0dXJuICd0cnVlLWdyaWQtZWRpdG9yLWllJztcclxuICAgIH1cclxuICAgIHJldHVybiAndHJ1ZS1ncmlkLWVkaXRvci0xMDBwJztcclxuICB9XHJcblxyXG4gIGdldEgoKSB7XHJcbiAgICBpZiAodGhpcy5oZWlnaHQgIT09IG51bGwgJiYgdGhpcy5oZWlnaHQgPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJzEwMCUnO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyDQldGB0LvQuCDQvdCw0YEg0YPQtNCw0LvRj9GO0YIuLi5cclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XHJcbn1cclxuIl19