UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

286 lines 29.7 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, ViewChild } from '@angular/core'; import { PopupComponent } from './popup.component'; import { Keys, Utils } from '@true-directive/base'; /** * Dropdown base component. */ let DropdownBaseComponent = class DropdownBaseComponent { constructor(_elementRef, _renderer) { this._elementRef = _elementRef; this._renderer = _renderer; this.usePopup = true; this.currentPopupVisible = false; this.disableTextEditor = false; this.disabled = null; this.maxDropDownHeight = '300px'; this.blur = new EventEmitter(); this.keydown = new EventEmitter(); this.onChange = (_) => { }; this.onTouched = () => { }; this._validBlur = false; this._useAltDown = true; this.shownByKey = false; this._touched = false; this._skipFocusOnPopupClose = false; } get popupPosition() { return this.popup.position; } set popupPosition(pos) { this.currentPopupPosition = pos; if (this.popup) { this.popup.position = pos; } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } set useAltDown(v) { this._useAltDown = v; } get useAltDown() { return this._useAltDown; } fetchData(dataQuery, data) { // } inputBlur(e) { // This touch was accepted this.onTouched(); // We shouldn't close window if the focus is moved to a popup window let l = e.relatedTarget; if (l === null || Utils.isAncestor(this.popup.popup.nativeElement, l)) { // l = null if the focus is moved to a grid because tabIndex = -1 // If the focus is moved to another element, then l != null // If the focus is moved by mouse click, then documentclick event occurs // and popup will be closed. return; } if (l === null || Utils.isAncestor(this._elementRef.nativeElement, l)) { // Window isn't closed if the focus moved to one of child elements return; } // Close the popup window if (this.popup.visible && !this._validBlur) { this._skipFocusOnPopupClose = true; this.popup.closePopup(); } // Reset the flag this._validBlur = false; this.blur.emit(e); } inputClick(e) { // Prevent popup from disabled input if (this.disabled) { return; } if (this.disableTextEditor) { if (this.popupVisible) { this.closePopup(); } else { this.showByTarget(); } e.stopPropagation(); e.preventDefault(); } } inputTouchStart(e) { this._touched = true; if (this.disableTextEditor) { e.stopPropagation(); e.preventDefault(); } } inputTouchMove(e) { this._touched = false; } inputTouchEnd(e) { if (!this.disabled && this.disableTextEditor) { if (!this.popupVisible && this._touched) { // Show the popup window by touchend event this.showByTarget(); if (e.cancelable) { e.preventDefault(); } } e.stopPropagation(); } } get value() { return this._value; } ; set value(v) { if (v !== this._value) { this._value = v; this.onChange(v); } } // Send the value to input. Formatter: Ctrl --> View writeValue(value) { if (this.value !== value) { this.value = value; } } get popupVisible() { if (this.popup) { return this.popup.visible; } return false; } focusPopup() { // } processKey(e) { return false; } showByTarget() { if (!this.usePopup) { return; } this.popup.showByTarget(this.input.nativeElement); } closePopup() { this.popup.closePopup(); } /** * User's input * @param e Input event */ inputInput(e = null) { // } inputKeyDown(e) { if (e.keyCode === Keys.ESCAPE && this.popup.visible) { this.closePopup(); e.stopPropagation(); e.preventDefault(); return; } if (e.keyCode === Keys.DOWN && (e.altKey || !this.useAltDown) && !this.popup.visible) { this.shownByKey = true; this.showByTarget(); setTimeout(() => this.focusPopup()); e.preventDefault(); e.stopPropagation(); return; } if (!this.processKey(e)) { this.keydown.emit(e); } } focus() { this.input.nativeElement.focus(); } popupClose(e) { // Можем пропустить это мероприятие, если мы закрываем выпадающую панель, // находясь в контроле // Skip setting the focus if dropdown is closed. if (this._skipFocusOnPopupClose) { this._skipFocusOnPopupClose = false; return; } if (!Utils.detectMobile()) { // We allow the user to set the focus on input. this.input.nativeElement.focus(); setTimeout(() => { const txt = this.input.nativeElement.value; if (txt !== undefined && !this.disableTextEditor && this._renderer) { this._renderer.setProperty(this.input.nativeElement, 'selectionStart', 0); this._renderer.setProperty(this.input.nativeElement, 'selectionEnd', txt.length); } }); } } inputFocus(e) { if (this.disableTextEditor) { this._renderer.setProperty(this.input.nativeElement, 'selectionStart', 0); this._renderer.setProperty(this.input.nativeElement, 'selectionEnd', 0); } else { const txt = this.input.nativeElement.value; this._renderer.setProperty(this.input.nativeElement, 'selectionStart', 0); this._renderer.setProperty(this.input.nativeElement, 'selectionEnd', txt.length); } } togglePopup() { if (this.disabled) { return; } this.popup.toggle(this.input.nativeElement, ''); setTimeout(() => { if (this.popupVisible) { this.focusPopup(); } }); } btnClick(e) { this.togglePopup(); } setValueFromDisplayed() { // } ngAfterViewInit() { this.popup.position = this.currentPopupPosition; } ngOnDestroy() { if (this.popupVisible) { this.popup.closePopup(); } } }; tslib_1.__decorate([ ViewChild('popup', { static: false }), tslib_1.__metadata("design:type", PopupComponent) ], DropdownBaseComponent.prototype, "popup", void 0); tslib_1.__decorate([ ViewChild('input', { static: true }), tslib_1.__metadata("design:type", Object) ], DropdownBaseComponent.prototype, "input", void 0); tslib_1.__decorate([ Input('disableTextEditor'), tslib_1.__metadata("design:type", Object) ], DropdownBaseComponent.prototype, "disableTextEditor", void 0); tslib_1.__decorate([ Input('disabled'), tslib_1.__metadata("design:type", Boolean) ], DropdownBaseComponent.prototype, "disabled", void 0); tslib_1.__decorate([ Input('maxDropDownHeight'), tslib_1.__metadata("design:type", Object) ], DropdownBaseComponent.prototype, "maxDropDownHeight", void 0); tslib_1.__decorate([ Input('popupPosition'), tslib_1.__metadata("design:type", String), tslib_1.__metadata("design:paramtypes", [String]) ], DropdownBaseComponent.prototype, "popupPosition", null); tslib_1.__decorate([ Output('blur'), tslib_1.__metadata("design:type", EventEmitter) ], DropdownBaseComponent.prototype, "blur", void 0); tslib_1.__decorate([ Output('keydown'), tslib_1.__metadata("design:type", EventEmitter) ], DropdownBaseComponent.prototype, "keydown", void 0); tslib_1.__decorate([ Input('useAltDown'), tslib_1.__metadata("design:type", Boolean), tslib_1.__metadata("design:paramtypes", [Boolean]) ], DropdownBaseComponent.prototype, "useAltDown", null); DropdownBaseComponent = tslib_1.__decorate([ Component({ selector: 'true-drop-down-base', template: ``, styles: [``] }), tslib_1.__metadata("design:paramtypes", [ElementRef, Renderer2]) ], DropdownBaseComponent); export { DropdownBaseComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdHJ1ZS1kaXJlY3RpdmUvZ3JpZC8iLCJzb3VyY2VzIjpbInNyYy9jb250cm9scy9kcm9wZG93bi1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDN0QsU0FBUyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUduRDs7R0FFRztBQU1ILElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXFCO0lBbVNoQyxZQUNZLFdBQXVCLEVBQ3ZCLFNBQW9CO1FBRHBCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFuU2hDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBUzVCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUcxQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBR3pCLHNCQUFpQixHQUFHLE9BQU8sQ0FBQztRQWU1QixTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHbEQsWUFBTyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQzFCLGNBQVMsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFLckIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQWFuQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBeURyQixh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UkM7SUFEQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFDO3NDQUM3QixjQUFjO29EQUFDO0FBR3RCO0lBREMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQzs7b0RBQ3hCO0FBR1g7SUFEQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7O2dFQUNEO0FBRzFCO0lBREMsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7dURBQ087QUFHekI7SUFEQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7O2dFQUNDO0FBRzVCO0lBREMsS0FBSyxDQUFDLGVBQWUsQ0FBQzs7OzBEQUd0QjtBQVVEO0lBREMsTUFBTSxDQUFDLE1BQU0sQ0FBQztzQ0FDVCxZQUFZO21EQUFnQztBQUdsRDtJQURDLE1BQU0sQ0FBQyxTQUFTLENBQUM7c0NBQ1QsWUFBWTtzREFBZ0M7QUFjckQ7SUFEQyxLQUFLLENBQUMsWUFBWSxDQUFDOzs7dURBR25CO0FBckRVLHFCQUFxQjtJQUxqQyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUscUJBQXFCO1FBQy9CLFFBQVEsRUFBQyxFQUFFO2lCQUNGLEVBQUU7S0FDWixDQUFDOzZDQXFTeUIsVUFBVTtRQUNaLFNBQVM7R0FyU3JCLHFCQUFxQixDQXNTakM7U0F0U1kscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLFxyXG4gICAgICAgICBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUG9wdXBDb21wb25lbnQgfSBmcm9tICcuL3BvcHVwLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBLZXlzLCBVdGlscyB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgRGF0YVF1ZXJ5IH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuLyoqXHJcbiAqIERyb3Bkb3duIGJhc2UgY29tcG9uZW50LlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLWRyb3AtZG93bi1iYXNlJyxcclxuICB0ZW1wbGF0ZTpgYCxcclxuICBzdHlsZXM6IFtgYF0gXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcclxuXHJcbiAgdXNlUG9wdXA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGN1cnJlbnRQb3B1cFBvc2l0aW9uOiAnUkVMQVRJVkUnIHwgJ0FCU09MVVRFJyB8ICdNT0RBTCcgfCAnU05BQ0snO1xyXG4gIGN1cnJlbnRQb3B1cFZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgncG9wdXAnLCB7c3RhdGljOiBmYWxzZX0pXHJcbiAgcG9wdXA6IFBvcHVwQ29tcG9uZW50O1xyXG5cclxuICBAVmlld0NoaWxkKCdpbnB1dCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGlucHV0OiBhbnk7XHJcblxyXG4gIEBJbnB1dCgnZGlzYWJsZVRleHRFZGl0b3InKVxyXG4gIGRpc2FibGVUZXh0RWRpdG9yID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgnZGlzYWJsZWQnKVxyXG4gIGRpc2FibGVkOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCdtYXhEcm9wRG93bkhlaWdodCcpXHJcbiAgbWF4RHJvcERvd25IZWlnaHQgPSAnMzAwcHgnO1xyXG5cclxuICBASW5wdXQoJ3BvcHVwUG9zaXRpb24nKVxyXG4gIHB1YmxpYyBnZXQgcG9wdXBQb3NpdGlvbigpOiAnUkVMQVRJVkUnIHwgJ0FCU09MVVRFJyB8ICdNT0RBTCcgfCAnU05BQ0snIHtcclxuICAgIHJldHVybiB0aGlzLnBvcHVwLnBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBwb3B1cFBvc2l0aW9uKHBvczogJ1JFTEFUSVZFJyB8ICdBQlNPTFVURScgfCAnTU9EQUwnIHwgJ1NOQUNLJykge1xyXG4gICAgdGhpcy5jdXJyZW50UG9wdXBQb3NpdGlvbiA9IHBvcztcclxuICAgIGlmICh0aGlzLnBvcHVwKSB7XHJcbiAgICAgIHRoaXMucG9wdXAucG9zaXRpb24gPSBwb3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCdibHVyJylcclxuICBibHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCdrZXlkb3duJylcclxuICBrZXlkb3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcm90ZWN0ZWQgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcclxuICBwcm90ZWN0ZWQgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxyXG5cclxuICBwcm90ZWN0ZWQgX3ZhbGlkQmx1ciA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBfdXNlQWx0RG93biA9IHRydWU7XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5VmFsdWU6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCd1c2VBbHREb3duJylcclxuICBwdWJsaWMgc2V0IHVzZUFsdERvd24odjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdXNlQWx0RG93biA9IHY7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHVzZUFsdERvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdXNlQWx0RG93bjtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzaG93bkJ5S2V5ID0gZmFsc2U7XHJcblxyXG4gIGZldGNoRGF0YShkYXRhUXVlcnk6IERhdGFRdWVyeSwgZGF0YTogQXJyYXk8YW55Pikge1xyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIGlucHV0Qmx1cihlOiBGb2N1c0V2ZW50KSB7XHJcblxyXG4gICAgLy8gVGhpcyB0b3VjaCB3YXMgYWNjZXB0ZWRcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcblxyXG4gICAgLy8gV2Ugc2hvdWxkbid0IGNsb3NlIHdpbmRvdyBpZiB0aGUgZm9jdXMgaXMgbW92ZWQgdG8gYSBwb3B1cCB3aW5kb3dcclxuICAgIGxldCBsID0gZS5yZWxhdGVkVGFyZ2V0O1xyXG4gICAgaWYgKGwgPT09IG51bGwgfHwgVXRpbHMuaXNBbmNlc3Rvcih0aGlzLnBvcHVwLnBvcHVwLm5hdGl2ZUVsZW1lbnQsIGwpKSB7XHJcblxyXG4gICAgICAvLyBsID0gbnVsbCBpZiB0aGUgZm9jdXMgaXMgbW92ZWQgdG8gYSBncmlkIGJlY2F1c2UgdGFiSW5kZXggPSAtMVxyXG4gICAgICAvLyBJZiB0aGUgZm9jdXMgaXMgbW92ZWQgdG8gYW5vdGhlciBlbGVtZW50LCB0aGVuIGwgIT0gbnVsbFxyXG4gICAgICAvLyBJZiB0aGUgZm9jdXMgaXMgbW92ZWQgYnkgbW91c2UgY2xpY2ssIHRoZW4gZG9jdW1lbnRjbGljayBldmVudCBvY2N1cnNcclxuICAgICAgLy8gYW5kIHBvcHVwIHdpbGwgYmUgY2xvc2VkLlxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGwgPT09IG51bGwgfHwgVXRpbHMuaXNBbmNlc3Rvcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGwpKSB7XHJcbiAgICAgIC8vIFdpbmRvdyBpc24ndCBjbG9zZWQgaWYgdGhlIGZvY3VzIG1vdmVkIHRvIG9uZSBvZiBjaGlsZCBlbGVtZW50c1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xvc2UgdGhlIHBvcHVwIHdpbmRvd1xyXG4gICAgaWYgKHRoaXMucG9wdXAudmlzaWJsZSAmJiAhdGhpcy5fdmFsaWRCbHVyKSB7XHJcbiAgICAgIHRoaXMuX3NraXBGb2N1c09uUG9wdXBDbG9zZSA9IHRydWU7XHJcbiAgICAgIHRoaXMucG9wdXAuY2xvc2VQb3B1cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlc2V0IHRoZSBmbGFnXHJcbiAgICB0aGlzLl92YWxpZEJsdXIgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmJsdXIuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIGlucHV0Q2xpY2soZTogYW55KSB7XHJcblxyXG4gICAgLy8gUHJldmVudCBwb3B1cCBmcm9tIGRpc2FibGVkIGlucHV0XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGlzYWJsZVRleHRFZGl0b3IpIHtcclxuICAgICAgaWYgKHRoaXMucG9wdXBWaXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaG93QnlUYXJnZXQoKTtcclxuICAgICAgfVxyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90b3VjaGVkID0gZmFsc2U7XHJcbiAgaW5wdXRUb3VjaFN0YXJ0KGU6IGFueSkge1xyXG4gICAgdGhpcy5fdG91Y2hlZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuZGlzYWJsZVRleHRFZGl0b3IpIHtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5wdXRUb3VjaE1vdmUoZTogYW55KSB7XHJcbiAgICB0aGlzLl90b3VjaGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpbnB1dFRvdWNoRW5kKGU6IGFueSkge1xyXG5cclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmRpc2FibGVUZXh0RWRpdG9yKSB7XHJcbiAgICAgIGlmICghdGhpcy5wb3B1cFZpc2libGUgJiYgdGhpcy5fdG91Y2hlZCkge1xyXG4gICAgICAgIC8vIFNob3cgdGhlIHBvcHVwIHdpbmRvdyBieSB0b3VjaGVuZCBldmVudFxyXG4gICAgICAgIHRoaXMuc2hvd0J5VGFyZ2V0KCk7XHJcbiAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF92YWx1ZTogYW55O1xyXG5cclxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHNldCB2YWx1ZSh2OiBhbnkpIHtcclxuICAgIGlmICh2ICE9PSB0aGlzLl92YWx1ZSkge1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XHJcbiAgICAgIHRoaXMub25DaGFuZ2Uodik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTZW5kIHRoZSB2YWx1ZSB0byBpbnB1dC4gRm9ybWF0dGVyOiBDdHJsIC0tPiBWaWV3XHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gdmFsdWUpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvcHVwVmlzaWJsZSgpOiBib29sZWFuIHsgICAgXHJcbiAgICBpZiAodGhpcy5wb3B1cCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3B1cC52aXNpYmxlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzUG9wdXAoKSB7XHJcbiAgICAvL1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByb2Nlc3NLZXkoZTogYW55KSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0J5VGFyZ2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLnVzZVBvcHVwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucG9wdXAuc2hvd0J5VGFyZ2V0KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VQb3B1cCgpIHtcclxuICAgIHRoaXMucG9wdXAuY2xvc2VQb3B1cCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXNlcidzIGlucHV0XHJcbiAgICogQHBhcmFtICBlIElucHV0IGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGlucHV0SW5wdXQoZTogYW55ID0gbnVsbCkge1xyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIGlucHV0S2V5RG93bihlOiBhbnkpIHtcclxuICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuRVNDQVBFICYmIHRoaXMucG9wdXAudmlzaWJsZSkge1xyXG4gICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ET1dOICYmIChlLmFsdEtleSB8fCAhdGhpcy51c2VBbHREb3duKSAmJiAhdGhpcy5wb3B1cC52aXNpYmxlKSB7XHJcbiAgICAgIHRoaXMuc2hvd25CeUtleSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2hvd0J5VGFyZ2V0KCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c1BvcHVwKCkpO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucHJvY2Vzc0tleShlKSkge1xyXG4gICAgICB0aGlzLmtleWRvd24uZW1pdChlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvY3VzKCkge1xyXG4gICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBfc2tpcEZvY3VzT25Qb3B1cENsb3NlID0gZmFsc2U7XHJcbiAgcG9wdXBDbG9zZShlOiBhbnkpIHtcclxuXHJcbiAgICAvLyDQnNC+0LbQtdC8INC/0YDQvtC/0YPRgdGC0LjRgtGMINGN0YLQviDQvNC10YDQvtC/0YDQuNGP0YLQuNC1LCDQtdGB0LvQuCDQvNGLINC30LDQutGA0YvQstCw0LXQvCDQstGL0L/QsNC00LDRjtGJ0YPRjiDQv9Cw0L3QtdC70YwsXHJcbiAgICAvLyDQvdCw0YXQvtC00Y/RgdGMINCyINC60L7QvdGC0YDQvtC70LVcclxuICAgIC8vIFNraXAgc2V0dGluZyB0aGUgZm9jdXMgaWYgZHJvcGRvd24gaXMgY2xvc2VkLlxyXG4gICAgaWYgKHRoaXMuX3NraXBGb2N1c09uUG9wdXBDbG9zZSkge1xyXG4gICAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghVXRpbHMuZGV0ZWN0TW9iaWxlKCkpIHtcclxuICAgICAgLy8gV2UgYWxsb3cgdGhlIHVzZXIgdG8gc2V0IHRoZSBmb2N1cyBvbiBpbnB1dC5cclxuICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHR4dCA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuICAgICAgICBpZiAodHh0ICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuZGlzYWJsZVRleHRFZGl0b3IgJiYgdGhpcy5fcmVuZGVyZXIpIHtcclxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgMCk7XHJcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25FbmQnLCB0eHQubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5wdXRGb2N1cyhlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVUZXh0RWRpdG9yKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgMCk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvbkVuZCcsIDApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgdHh0ID0gdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25TdGFydCcsIDApO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25FbmQnLCB0eHQubGVuZ3RoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVBvcHVwKCkge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucG9wdXAudG9nZ2xlKHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJycpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgICB0aGlzLmZvY3VzUG9wdXAoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBidG5DbGljayhlOiBhbnkpIHtcclxuICAgIHRoaXMudG9nZ2xlUG9wdXAoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWYWx1ZUZyb21EaXNwbGF5ZWQoKSB7XHJcbiAgICAvL1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5wb3B1cC5wb3NpdGlvbiA9IHRoaXMuY3VycmVudFBvcHVwUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxufVxyXG4iXX0=