UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

223 lines 28.7 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Output, Directive, ElementRef, Renderer2, EventEmitter } from '@angular/core'; import { Mask } from '@true-directive/base'; import { Keys } from '@true-directive/base'; import { MaskSectionAction, MaskResult } from '@true-directive/base'; import { InternationalizationService } from '../internationalization/internationalization.service'; var MaskBaseDirective = /** @class */ (function () { function MaskBaseDirective(_renderer, _elementRef, intl) { var _this = this; this._renderer = _renderer; this._elementRef = _elementRef; this.intl = intl; this._undo = []; this._redo = []; // Current text value this._txtValue = ''; this._mask = new Mask(); this.android_behavior = false; // On state change this.stateChange = new EventEmitter(); this.maskValueChanged = new EventEmitter(); // Fetching mask state this._state = null; this._localeSubscription = this.intl.onLocaleChanged.subscribe(function (locale) { return _this.setLocale(locale); }); } Object.defineProperty(MaskBaseDirective.prototype, "state", { get: function () { return this._state; }, set: function (v) { if (this._state !== v) { this._state = v; this.stateChange.emit(this._state); // Emitting event } }, enumerable: true, configurable: true }); MaskBaseDirective.prototype.updateState = function () { // }; MaskBaseDirective.prototype.processAndroid = function (txt) { var res = this.currentRes(); // Possibly we have carriage position var key = Keys.whichKeyHasBeenPressed(this.last_res.newValue, txt, this.last_res.selStart, res.selStart, this.last_res.selLength); var r = this.processKey({ keyCode: -1, key: key.code, char: key.char, shiftKey: false, ctrlKey: false, target: { selectionStart: this.last_res.selStart, selectionEnd: 0 }, preventDefault: function (_) { } }); if (!r) { this.setRes(this.last_res); // Reversing, value has not been accepted } this.android_behavior = false; return; }; MaskBaseDirective.prototype.doInput = function (txt) { if (this.android_behavior) { this.processAndroid(txt); return; } // Thus we're trying to apply a mask to value entered var masked = this._mask.applyMask(txt); if (masked !== this._txtValue) { this.setText(masked, true); } }; MaskBaseDirective.prototype.processKey = function (e) { if (e.keyCode === 229 || e.keyCode === 0 || e.keyCode === undefined) { // Android detected this.android_behavior = true; this.last_res = this.currentRes(); return; } var c = e.char; if (c === undefined) { c = e.key; } var selStart = e.target.selectionStart; var selEnd = e.target.selectionEnd; var s = this._txtValue; if (Keys.isFunctional(e.keyCode)) { return true; } if (e.keyCode === Keys.TAB || e.keyCode === Keys.ESCAPE) { return true; } if (e.keyCode === Keys.HOME || e.keyCode === Keys.END) { return true; } if (e.shiftKey && (e.keyCode === Keys.DELETE || e.keyCode === Keys.INSERT)) { return true; } if (e.altKey && (e.keyCode === Keys.DOWN || e.keyCode === Keys.UP)) { return true; } if (e.ctrlKey && e.keyCode === Keys.Z) { // UNDO var undoRes = this._undo.pop(); if (undoRes) { this._redo.push(this.getRes(s, selStart, selEnd)); this.setRes(undoRes); } e.preventDefault(); return false; } if (e.ctrlKey && e.keyCode === Keys.Y) { // REDO var redoRes = this._redo.pop(); if (redoRes) { this._undo.push(this.getRes(s, selStart, selEnd)); this.setRes(redoRes); } e.preventDefault(); return false; } // Остальные Ctrl+* нас не интересуют if (e.ctrlKey) { return true; } // If everything is selected if (selStart === 0 && selEnd === this._txtValue.length) { if (e.keyCode === Keys.DELETE || e.keyCode === Keys.BACKSPACE) { return true; } // If ArrowLeft key has been pressed, result should equal to pressing of Home if (e.keyCode === Keys.LEFT) { return true; } if (e.keyCode === Keys.RIGHT) { return true; } } if (selStart === 0 && selEnd === this._txtValue.length) { s = ''; selStart = 0; selEnd = 0; } // Applying everything that's left var res = this._mask.applyKeyAtPos(s, e.keyCode, c, selStart, selEnd); if (res !== null && res.action === MaskSectionAction.APPLY) { // If value has been changed we'll add it to UNDO stack if (res.newValue !== s) { this._undo.push(this.getRes(s, selStart, selEnd)); this._redo = []; } this.setRes(res); if (this.android_behavior) { return true; } e.preventDefault(); } return false; }; // Setting value and carriage position MaskBaseDirective.prototype.setRes = function (res) { if (this.android_behavior) { res.selLength = 0; } this.setText(res.newValue); this._renderer.setProperty(this._elementRef.nativeElement, 'selectionStart', res.selStart); this._renderer.setProperty(this._elementRef.nativeElement, 'selectionEnd', res.selStart + res.selLength); }; MaskBaseDirective.prototype.currentRes = function () { var res = new MaskResult(this._txtValue, MaskSectionAction.APPLY, 0); res.selStart = this._elementRef.nativeElement.selectionStart; res.selLength = this._elementRef.nativeElement.selectionEnd - res.selStart; return res; }; // Retrieving current mask value and carriage position MaskBaseDirective.prototype.getRes = function (s, selStart, selEnd) { var res = new MaskResult(s, MaskSectionAction.APPLY, 0); res.selStart = selStart; res.selLength = selEnd - selStart; return res; }; // Following method should be overridden MaskBaseDirective.prototype.toModel = function () { }; // Writing a text to control MaskBaseDirective.prototype.setText = function (displayedValue, toModel) { if (toModel === void 0) { toModel = true; } // Displaying this._txtValue = displayedValue; this._renderer.setProperty(this._elementRef.nativeElement, 'value', this._txtValue); // Sending to model if (toModel) { this.toModel(); } }; MaskBaseDirective.prototype.setLocale = function (locale) { this._mask.setLocale(locale); }; MaskBaseDirective.prototype.ngOnDestroy = function () { this._localeSubscription.unsubscribe(); }; tslib_1.__decorate([ Output('stateChange'), tslib_1.__metadata("design:type", Object) ], MaskBaseDirective.prototype, "stateChange", void 0); tslib_1.__decorate([ Output('maskValueChanged'), tslib_1.__metadata("design:type", Object) ], MaskBaseDirective.prototype, "maskValueChanged", void 0); MaskBaseDirective = tslib_1.__decorate([ Directive({ selector: 'true-mask-base' }), tslib_1.__metadata("design:paramtypes", [Renderer2, ElementRef, InternationalizationService]) ], MaskBaseDirective); return MaskBaseDirective; }()); export { MaskBaseDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL21hc2svbWFzay1iYXNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBTW5HO0lBZ1BJLDJCQUFzQixTQUFvQixFQUFZLFdBQXVCLEVBQVksSUFBaUM7UUFBMUgsaUJBRUM7UUFGcUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQVksU0FBSSxHQUFKLElBQUksQ0FBNkI7UUE5T2xILFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBQzlCLFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBRXRDLHFCQUFxQjtRQUNYLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDTixVQUFLLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUlsQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHbkMsa0JBQWtCO1FBRWxCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUc1QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLHNCQUFzQjtRQUNkLFdBQU0sR0FBYyxJQUFJLENBQUM7UUEyTi9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsSUFBSSxD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QUFqQixVQUFrQixjQUFzQixFQUFFLE9BQXVCO1FBQXZCLHdCQUFBLEVBQUEsY0FBdUI7UUFFL0QsYUFBYTtRQUNiLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEYsbUJBQW1CO1FBQ25CLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVTLHFDQUFTLEdBQW5CLFVBQW9CLE1BQWM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELHVDQUFXLEdBQVg7UUFDRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQTlORDtRQURDLE1BQU0sQ0FBQyxhQUFhLENBQUM7OzBEQUNzQjtJQUc1QztRQURDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQzs7K0RBQ2dCO0lBbkJsQyxpQkFBaUI7UUFIN0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLGdCQUFnQjtTQUMzQixDQUFDO2lEQWlQbUMsU0FBUyxFQUF5QixVQUFVLEVBQWtCLDJCQUEyQjtPQWhQakgsaUJBQWlCLENBbVA3QjtJQUFELHdCQUFDO0NBQUEsQUFuUEQsSUFtUEM7U0FuUFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBPdXRwdXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXNrIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBLZXlzLCBLZXlJbmZvIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU2VjdGlvbkFjdGlvbiwgTWFza1Jlc3VsdCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgTWFza1NldHRpbmdzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5pbXBvcnQgeyBNYXNrU3RhdGUgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcm5hdGlvbmFsaXphdGlvbi9pbnRlcm5hdGlvbmFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLW1hc2stYmFzZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hc2tCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgICBwcml2YXRlIF91bmRvOiBBcnJheTxNYXNrUmVzdWx0PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfcmVkbzogQXJyYXk8TWFza1Jlc3VsdD4gPSBbXTtcclxuXHJcbiAgICAvLyBDdXJyZW50IHRleHQgdmFsdWVcclxuICAgIHByb3RlY3RlZCBfdHh0VmFsdWUgPSAnJztcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBfbWFzazogTWFzayA9IG5ldyBNYXNrKCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9jYWxlU3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGFuZHJvaWRfYmVoYXZpb3IgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBsYXN0X3JlczogTWFza1Jlc3VsdDtcclxuXHJcbiAgICAvLyBPbiBzdGF0ZSBjaGFuZ2VcclxuICAgIEBPdXRwdXQoJ3N0YXRlQ2hhbmdlJylcclxuICAgIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXNrU3RhdGU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgnbWFza1ZhbHVlQ2hhbmdlZCcpXHJcbiAgICBtYXNrVmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLy8gRmV0Y2hpbmcgbWFzayBzdGF0ZVxyXG4gICAgcHJpdmF0ZSBfc3RhdGU6IE1hc2tTdGF0ZSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIGdldCBzdGF0ZSgpOiBNYXNrU3RhdGUge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzdGF0ZSh2OiBNYXNrU3RhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSB2KSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB2O1xyXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh0aGlzLl9zdGF0ZSk7IC8vIEVtaXR0aW5nIGV2ZW50XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlU3RhdGUoKSB7XHJcbiAgICAgIC8vXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NBbmRyb2lkKHR4dDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgICBjb25zdCByZXMgPSB0aGlzLmN1cnJlbnRSZXMoKTtcclxuXHJcbiAgICAgIC8vIFBvc3NpYmx5IHdlIGhhdmUgY2FycmlhZ2UgcG9zaXRpb25cclxuICAgICAgY29uc3Qga2V5OiBLZXlJbmZvID0gS2V5cy53aGljaEtleUhhc0JlZW5QcmVzc2VkKHRoaXMubGFzdF9yZXMubmV3VmFsdWUsIHR4dCxcclxuICAgICAgICAgIHRoaXMubGFzdF9yZXMuc2VsU3RhcnQsIHJlcy5zZWxTdGFydCwgdGhpcy5sYXN0X3Jlcy5zZWxMZW5ndGgpO1xyXG5cclxuICAgICAgY29uc3QgciA9IHRoaXMucHJvY2Vzc0tleShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBrZXlDb2RlOiAtMSxcclxuICAgICAgICAgIGtleToga2V5LmNvZGUsXHJcbiAgICAgICAgICBjaGFyOiBrZXkuY2hhcixcclxuICAgICAgICAgIHNoaWZ0S2V5OiBmYWxzZSxcclxuICAgICAgICAgIGN0cmxLZXk6IGZhbHNlLFxyXG4gICAgICAgICAgdGFyZ2V0OiB7IHNlbGVjdGlvblN0YXJ0OiB0aGlzLmxhc3RfcmVzLnNlbFN0YXJ0LCBzZWxlY3Rpb25FbmQ6IDAgfSxcclxuICAgICAgICAgIHByZXZlbnREZWZhdWx0OiAoXzogYW55KSA9PiB7fVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFyKSB7XHJcbiAgICAgICAgdGhpcy5zZXRSZXModGhpcy5sYXN0X3Jlcyk7IC8vIFJldmVyc2luZywgdmFsdWUgaGFzIG5vdCBiZWVuIGFjY2VwdGVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYW5kcm9pZF9iZWhhdmlvciA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRvSW5wdXQodHh0OiBhbnkpIHtcclxuICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0FuZHJvaWQodHh0KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRodXMgd2UncmUgdHJ5aW5nIHRvIGFwcGx5IGEgbWFzayB0byB2YWx1ZSBlbnRlcmVkXHJcbiAgICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMuX21hc2suYXBwbHlNYXNrKHR4dCk7XHJcbiAgICAgIGlmIChtYXNrZWQgIT09IHRoaXMuX3R4dFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUZXh0KG1hc2tlZCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzc0tleShlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDIyOSB8fCBlLmtleUNvZGUgPT09IDAgfHwgZS5rZXlDb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBBbmRyb2lkIGRldGVjdGVkXHJcbiAgICAgICAgdGhpcy5hbmRyb2lkX2JlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxhc3RfcmVzID0gdGhpcy5jdXJyZW50UmVzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYzogc3RyaW5nID0gZS5jaGFyO1xyXG4gICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYyA9IGUua2V5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VsU3RhcnQ6IG51bWJlciA9IGUudGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICBsZXQgc2VsRW5kOiBudW1iZXIgPSBlLnRhcmdldC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgIGxldCBzID0gdGhpcy5fdHh0VmFsdWU7XHJcblxyXG4gICAgICBpZiAoS2V5cy5pc0Z1bmN0aW9uYWwoZS5rZXlDb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlRBQiB8fCBlLmtleUNvZGUgPT09IEtleXMuRVNDQVBFKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuSE9NRSB8fCBlLmtleUNvZGUgPT09IEtleXMuRU5EKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIChlLmtleUNvZGUgPT09IEtleXMuREVMRVRFIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5JTlNFUlQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmFsdEtleSAmJiAoZS5rZXlDb2RlID09PSBLZXlzLkRPV04gfHwgZS5rZXlDb2RlID09PSBLZXlzLlVQKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PT0gS2V5cy5aKSB7XHJcbiAgICAgICAgLy8gVU5ET1xyXG4gICAgICAgIGNvbnN0IHVuZG9SZXMgPSB0aGlzLl91bmRvLnBvcCgpO1xyXG4gICAgICAgIGlmICh1bmRvUmVzKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZWRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5zZXRSZXModW5kb1Jlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5rZXlDb2RlID09PSBLZXlzLlkpIHtcclxuICAgICAgICAvLyBSRURPXHJcbiAgICAgICAgY29uc3QgcmVkb1JlcyA9IHRoaXMuX3JlZG8ucG9wKCk7XHJcbiAgICAgICAgaWYgKHJlZG9SZXMpIHtcclxuICAgICAgICAgIHRoaXMuX3VuZG8ucHVzaCh0aGlzLmdldFJlcyhzLCBzZWxTdGFydCwgc2VsRW5kKSk7XHJcbiAgICAgICAgICB0aGlzLnNldFJlcyhyZWRvUmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g0J7RgdGC0LDQu9GM0L3Ri9C1IEN0cmwrKiDQvdCw0YEg0L3QtSDQuNC90YLQtdGA0LXRgdGD0Y7RglxyXG4gICAgICBpZiAoZS5jdHJsS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgaXMgc2VsZWN0ZWRcclxuICAgICAgaWYgKHNlbFN0YXJ0ID09PSAwICYmIHNlbEVuZCA9PT0gdGhpcy5fdHh0VmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ERUxFVEUgfHwgZS5rZXlDb2RlID09PSBLZXlzLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBBcnJvd0xlZnQga2V5IGhhcyBiZWVuIHByZXNzZWQsIHJlc3VsdCBzaG91bGQgZXF1YWwgdG8gcHJlc3Npbmcgb2YgSG9tZVxyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuTEVGVCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlJJR0hUKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZWxTdGFydCA9PT0gMCAmJiBzZWxFbmQgPT09IHRoaXMuX3R4dFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgIHMgPSAnJztcclxuICAgICAgICBzZWxTdGFydCA9IDA7XHJcbiAgICAgICAgc2VsRW5kID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQXBwbHlpbmcgZXZlcnl0aGluZyB0aGF0J3MgbGVmdFxyXG4gICAgICBjb25zdCByZXM6IE1hc2tSZXN1bHQgPSB0aGlzLl9tYXNrLmFwcGx5S2V5QXRQb3MocywgZS5rZXlDb2RlLCBjLCBzZWxTdGFydCwgc2VsRW5kKTtcclxuICAgICAgaWYgKHJlcyAhPT0gbnVsbCAmJiByZXMuYWN0aW9uID09PSBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSkge1xyXG4gICAgICAgIC8vIElmIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgd2UnbGwgYWRkIGl0IHRvIFVORE8gc3RhY2tcclxuICAgICAgICBpZiAocmVzLm5ld1ZhbHVlICE9PSBzKSB7XHJcbiAgICAgICAgICB0aGlzLl91bmRvLnB1c2godGhpcy5nZXRSZXMocywgc2VsU3RhcnQsIHNlbEVuZCkpO1xyXG4gICAgICAgICAgdGhpcy5fcmVkbyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRSZXMocmVzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5kcm9pZF9iZWhhdmlvcikge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXR0aW5nIHZhbHVlIGFuZCBjYXJyaWFnZSBwb3NpdGlvblxyXG4gICAgcHJvdGVjdGVkIHNldFJlcyhyZXM6IE1hc2tSZXN1bHQpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLmFuZHJvaWRfYmVoYXZpb3IpIHtcclxuICAgICAgICByZXMuc2VsTGVuZ3RoID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRUZXh0KHJlcy5uZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgcmVzLnNlbFN0YXJ0KTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgcmVzLnNlbFN0YXJ0ICsgcmVzLnNlbExlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRSZXMoKSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXNrUmVzdWx0KHRoaXMuX3R4dFZhbHVlLCBNYXNrU2VjdGlvbkFjdGlvbi5BUFBMWSwgMCk7XHJcbiAgICAgIHJlcy5zZWxTdGFydCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgLSByZXMuc2VsU3RhcnQ7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0cmlldmluZyBjdXJyZW50IG1hc2sgdmFsdWUgYW5kIGNhcnJpYWdlIHBvc2l0aW9uXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UmVzKHM6IHN0cmluZywgc2VsU3RhcnQ6IG51bWJlciwgc2VsRW5kOiBudW1iZXIpOiBNYXNrUmVzdWx0IHtcclxuICAgICAgY29uc3QgcmVzID0gbmV3IE1hc2tSZXN1bHQocywgTWFza1NlY3Rpb25BY3Rpb24uQVBQTFksIDApO1xyXG4gICAgICByZXMuc2VsU3RhcnQgPSBzZWxTdGFydDtcclxuICAgICAgcmVzLnNlbExlbmd0aCA9IHNlbEVuZCAtIHNlbFN0YXJ0O1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW5cclxuICAgIHByb3RlY3RlZCB0b01vZGVsKCk6IHZvaWQge1xyXG4gICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvLyBXcml0aW5nIGEgdGV4dCB0byBjb250cm9sXHJcbiAgICBwcm90ZWN0ZWQgc2V0VGV4dChkaXNwbGF5ZWRWYWx1ZTogc3RyaW5nLCB0b01vZGVsOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgLy8gRGlzcGxheWluZ1xyXG4gICAgICB0aGlzLl90eHRWYWx1ZSA9IGRpc3BsYXllZFZhbHVlO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHRoaXMuX3R4dFZhbHVlKTtcclxuXHJcbiAgICAgIC8vIFNlbmRpbmcgdG8gbW9kZWxcclxuICAgICAgaWYgKHRvTW9kZWwpIHtcclxuICAgICAgICB0aGlzLnRvTW9kZWwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGUpIHtcclxuICAgICAgdGhpcy5fbWFzay5zZXRMb2NhbGUobG9jYWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBpbnRsOiBJbnRlcm5hdGlvbmFsaXphdGlvblNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uID0gdGhpcy5pbnRsLm9uTG9jYWxlQ2hhbmdlZC5zdWJzY3JpYmUobG9jYWxlID0+IHRoaXMuc2V0TG9jYWxlKGxvY2FsZSkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==