@neocomplexx/ngx-neo-directives-mat
Version:
221 lines • 31.2 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Directive, HostListener, Input, ElementRef, Renderer2, OnInit, AfterViewInit } from '@angular/core';
import { NgModel } from '@angular/forms';
let NeoDecimalNumbersDirective = class NeoDecimalNumbersDirective {
constructor(el, renderer, model) {
this.el = el;
this.renderer = renderer;
this.model = model;
this.allowNullValue = false;
this.decimals = 2;
this.haveDecimalPoint = false;
}
ngOnInit() {
var _a, _b;
if (this.options && !this.options.apply) {
return;
}
this.decimals = (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.decimals) !== null && _b !== void 0 ? _b : 2;
if (this.decimals == "")
this.decimals = 2;
if (this.allowNullValue === "")
this.allowNullValue = true;
this.el.nativeElement.type = "number";
this.regex = new RegExp('^[0-9]+(\\.[0-9]{0,' + this.decimals + '})?$');
}
blockPaste(e) {
if (this.options && !this.options.apply) {
return;
}
const clipboardData = e.clipboardData || window['clipboardData'];
let pastedData = clipboardData.getData('text/plain').split(",").join(".");
let posPoint = pastedData.lastIndexOf('.');
if (posPoint > -1) {
pastedData = pastedData.substring(0, posPoint).split(".").join("") + pastedData.substring(posPoint);
posPoint = pastedData.lastIndexOf('.');
if (posPoint + this.decimals < pastedData.length) {
pastedData = pastedData.substring(0, posPoint + this.decimals + 1);
}
}
const onlyNumbers = Array.from(pastedData).map(x => this.isNumber(x)).reduce((prev, el) => prev && el, true);
const a = this.regex.test(pastedData);
setTimeout(() => {
if (onlyNumbers && a) {
this.el.nativeElement.value = pastedData;
}
else {
this.el.nativeElement.value = '0';
}
}, 10);
}
onfocus() {
if (this.options && !this.options.apply) {
return;
}
if (this.el.nativeElement.value == "0") {
this.el.nativeElement.value = null;
}
}
onBlur() {
if (this.options && !this.options.apply) {
return;
}
let current = this.el.nativeElement.value;
if (current == "") {
if (this.allowNullValue) {
this.el.nativeElement.value = null;
this.model.control.setValue(null);
}
else {
this.el.nativeElement.value = "0";
this.model.control.setValue(0);
}
}
else {
this.el.nativeElement.type = "text";
this.el.nativeElement.type = "number";
if (this.el.nativeElement.max && this.el.nativeElement.valueAsNumber > +this.el.nativeElement.max) {
this.el.nativeElement.value = this.el.nativeElement.max;
this.model.control.setValue(this.el.nativeElement.valueAsNumber);
}
}
}
onKeyUp(event) {
if (this.options && !this.options.apply) {
return;
}
let current = this.el.nativeElement.value;
current = current.split("-").join("");
let posPoint = current.indexOf('.');
if (posPoint > -1) {
this.el.nativeElement.value = current.substring(0, posPoint + 1) + current.substring(posPoint).split(".").join("");
}
if (this.haveDecimalPoint && current == "" && this.prev > "") {
this.haveDecimalPoint = false;
this.el.nativeElement.value = this.prev + (this.prev.endsWith(".0") ? "" : ".0");
this.el.nativeElement.type = "text";
this.el.nativeElement.selectionStart = this.el.nativeElement.value.length - 1;
this.el.nativeElement.selectionEnd = this.el.nativeElement.value.length;
this.el.nativeElement.type = "number";
return;
}
if (this.isSpecial(event) || current == "") {
if (event.keyCode == 8 || current != "") {
this.prev = current;
const dotIndex = current.toString().indexOf('.');
if (dotIndex >= 0)
this.haveDecimalPoint = false;
}
return;
}
if (!this.isNumber(event)) {
event.preventDefault();
event.stopPropagation();
return false;
}
if (current) {
current = current.toString();
const dotIndex = current.indexOf('.');
if ((dotIndex >= 0) && ((current.length - 1) - dotIndex > this.decimals)) {
this.renderer.setProperty(this.el.nativeElement, 'value', current.slice(0, dotIndex + this.decimals + 1));
}
}
else {
this.renderer.setProperty(this.el.nativeElement, 'value', this.prev);
}
}
onKeyDown(event) {
if (this.options && !this.options.apply) {
return;
}
if (this.isSpecial(event)) {
return;
}
if (!this.isNumber(event)) {
event.preventDefault();
event.stopPropagation();
return false;
}
let current = this.el.nativeElement.value;
if (this.isDecimalPoint(event)) {
this.haveDecimalPoint = true;
if (!current.endsWith(".0")) {
this.el.nativeElement.value = current + ".0";
this.el.nativeElement.type = "text";
this.el.nativeElement.selectionStart = this.el.nativeElement.value.length - 1;
this.el.nativeElement.selectionEnd = this.el.nativeElement.value.length;
this.el.nativeElement.type = "number";
}
}
this.prev = current;
}
isSpecial(e) {
return e.key === 'Delete' || (e.key === 'Tab' || e.keyCode == 9) || (e.key === 'Backspace' || e.keyCode == 8) || e.key === 'ArrowLeft' ||
e.altKey || e.ctrlKey || e.key === 'Home' || e.key === 'End' || e.key === 'PageDown' || e.key === 'PageUp' ||
e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'ArrowRight' || e.key === 'Control' || e.key === 'Alt' || e.key === 'Shift' ||
(e.keyIdentifier == 'Down' || e.keyIdentifier == 'Up');
}
isNumber(e) {
if (e instanceof KeyboardEvent) {
return ((e.key >= '0' && e.key <= '9') || ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)) ||
(e.key === '.' || e.key === ',') || (e.keyCode === 188 || e.keyCode === 190 || e.keyCode === 229));
}
else {
return ((e >= '0' && e <= '9') || (e === '.' || e === ','));
}
}
isDecimalPoint(e) {
return (e.key === '.' || e.key === ',') || (e.keyCode === 188 || e.keyCode === 190 || e.keyCode === 229);
}
};
NeoDecimalNumbersDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 },
{ type: NgModel }
];
__decorate([
Input('isDecimal'),
__metadata("design:type", Object)
], NeoDecimalNumbersDirective.prototype, "options", void 0);
__decorate([
Input('allowNullValue'),
__metadata("design:type", Object)
], NeoDecimalNumbersDirective.prototype, "allowNullValue", void 0);
__decorate([
HostListener('paste', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [ClipboardEvent]),
__metadata("design:returntype", void 0)
], NeoDecimalNumbersDirective.prototype, "blockPaste", null);
__decorate([
HostListener('focus'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], NeoDecimalNumbersDirective.prototype, "onfocus", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], NeoDecimalNumbersDirective.prototype, "onBlur", null);
__decorate([
HostListener('keyup', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], NeoDecimalNumbersDirective.prototype, "onKeyUp", null);
__decorate([
HostListener('keydown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], NeoDecimalNumbersDirective.prototype, "onKeyDown", null);
NeoDecimalNumbersDirective = __decorate([
Directive({
selector: '[isDecimal]'
}),
__metadata("design:paramtypes", [ElementRef, Renderer2, NgModel])
], NeoDecimalNumbersDirective);
export { NeoDecimalNumbersDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvLWRlY2ltYWxOdW1iZXJzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWRpcmVjdGl2ZXMtbWF0LyIsInNvdXJjZXMiOlsibGliL25lby1kZWNpbWFsTnVtYmVycy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBVXpDLElBQWEsMEJBQTBCLEdBQXZDLE1BQWEsMEJBQTBCO0lBVW5DLFlBQW9CLEVBQWMsRUFBVSxRQUFtQixFQUFVLEtBQWM7UUFBbkUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFTO1FBUDlELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFJckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0lBR2pDLENBQUM7SUFFRCxRQUFROztRQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3BELElBQUksQ0FBQyxRQUFRLGVBQUcsSUFBSSxDQUFDLE9BQU8sMENBQUUsUUFBUSxtQ0FBSSxDQUFDLENBQUM7UUFFNUMsSUFBUyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFTLElBQUksQ0FBQyxjQUFjLEtBQUssRUFBRTtZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFB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RUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztxQ0FBZSxjQUFjOzs0REF5QjlEO0FBRXNCO0lBQXRCLFlBQVksQ0FBQyxPQUFPLENBQUM7Ozs7eURBTXJCO0FBRXFCO0lBQXJCLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7d0RBb0JwQjtBQUVrQztJQUFsQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7O3FDQUFnQixhQUFhOzt5REE2QzlEO0FBRW9DO0lBQXBDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7cUNBQWtCLGFBQWE7OzJEQXdCbEU7QUF2SlEsMEJBQTBCO0lBSHRDLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxhQUFhO0tBQzFCLENBQUM7cUNBVzBCLFVBQVUsRUFBb0IsU0FBUyxFQUFpQixPQUFPO0dBVjlFLDBCQUEwQixDQTRLdEM7U0E1S1ksMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIElucHV0LCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSAgSURlY2ltYWxDb25mIHtcclxuICAgIGFwcGx5OiBib29sZWFuO1xyXG4gICAgZGVjaW1hbHM6IG51bWJlcjtcclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tpc0RlY2ltYWxdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTmVvRGVjaW1hbE51bWJlcnNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIEBJbnB1dCgnaXNEZWNpbWFsJykgb3B0aW9uczogSURlY2ltYWxDb25mO1xyXG4gICAgQElucHV0KCdhbGxvd051bGxWYWx1ZScpIGFsbG93TnVsbFZhbHVlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGRlY2ltYWxzOiBudW1iZXIgPSAyO1xyXG4gICAgcHJpdmF0ZSBwcmV2OiBhbnk7XHJcbiAgICBwcml2YXRlIHJlZ2V4OiBSZWdFeHA7XHJcblxyXG4gICAgcHJpdmF0ZSBoYXZlRGVjaW1hbFBvaW50ID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIG1vZGVsOiBOZ01vZGVsKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiAhdGhpcy5vcHRpb25zLmFwcGx5KSB7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMuZGVjaW1hbHMgPSB0aGlzLm9wdGlvbnM/LmRlY2ltYWxzID8/IDI7XHJcblxyXG4gICAgICAgIGlmICg8YW55PnRoaXMuZGVjaW1hbHMgPT0gXCJcIikgdGhpcy5kZWNpbWFscyA9IDI7XHJcbiAgICAgICAgaWYgKDxhbnk+dGhpcy5hbGxvd051bGxWYWx1ZSA9PT0gXCJcIikgdGhpcy5hbGxvd051bGxWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcIm51bWJlclwiXHJcbiAgICAgICAgdGhpcy5yZWdleCA9IG5ldyBSZWdFeHAoJ15bMC05XSsoXFxcXC5bMC05XXswLCcgKyB0aGlzLmRlY2ltYWxzICsgJ30pPyQnKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pIGJsb2NrUGFzdGUoZTogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNsaXBib2FyZERhdGE6IERhdGFUcmFuc2ZlciA9IGUuY2xpcGJvYXJkRGF0YSB8fCB3aW5kb3dbJ2NsaXBib2FyZERhdGEnXTtcclxuICAgICAgICBsZXQgcGFzdGVkRGF0YTogc3RyaW5nID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykuc3BsaXQoXCIsXCIpLmpvaW4oXCIuXCIpO1xyXG5cclxuICAgICAgICBsZXQgcG9zUG9pbnQgPSBwYXN0ZWREYXRhLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICAgICAgaWYgKHBvc1BvaW50ID4gLTEpIHtcclxuICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEuc3Vic3RyaW5nKDAsIHBvc1BvaW50KS5zcGxpdChcIi5cIikuam9pbihcIlwiKSArIHBhc3RlZERhdGEuc3Vic3RyaW5nKHBvc1BvaW50KTtcclxuICAgICAgICAgICAgcG9zUG9pbnQgPSBwYXN0ZWREYXRhLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICAgICAgICAgIGlmIChwb3NQb2ludCArIHRoaXMuZGVjaW1hbHMgPCBwYXN0ZWREYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEuc3Vic3RyaW5nKDAsIHBvc1BvaW50ICsgdGhpcy5kZWNpbWFscyArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbmx5TnVtYmVycyA9IEFycmF5LmZyb20ocGFzdGVkRGF0YSkubWFwKHggPT4gdGhpcy5pc051bWJlcih4KSkucmVkdWNlKChwcmV2LCBlbCkgPT4gcHJldiAmJiBlbCwgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgYSA9IHRoaXMucmVnZXgudGVzdChwYXN0ZWREYXRhKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9ubHlOdW1iZXJzICYmIGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHBhc3RlZERhdGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnMCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJykgb25mb2N1cygpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1cigpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gXCJcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd051bGxWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jb250cm9sLnNldFZhbHVlKDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcInRleHRcIjtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lbC5uYXRpdmVFbGVtZW50Lm1heCAmJiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWVBc051bWJlciA+ICt0aGlzLmVsLm5hdGl2ZUVsZW1lbnQubWF4KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQubWF4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jb250cm9sLnNldFZhbHVlKHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZUFzTnVtYmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuc3BsaXQoXCItXCIpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgbGV0IHBvc1BvaW50ID0gY3VycmVudC5pbmRleE9mKCcuJyk7XHJcbiAgICAgICAgaWYgKHBvc1BvaW50ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gY3VycmVudC5zdWJzdHJpbmcoMCwgcG9zUG9pbnQgKyAxKSArIGN1cnJlbnQuc3Vic3RyaW5nKHBvc1BvaW50KS5zcGxpdChcIi5cIikuam9pbihcIlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhhdmVEZWNpbWFsUG9pbnQgJiYgY3VycmVudCA9PSBcIlwiICYmIHRoaXMucHJldiA+IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5oYXZlRGVjaW1hbFBvaW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMucHJldiArICh0aGlzLnByZXYuZW5kc1dpdGgoXCIuMFwiKSA/IFwiXCIgOiBcIi4wXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudHlwZSA9IFwidGV4dFwiO1xyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC50eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTcGVjaWFsKGV2ZW50KSB8fCBjdXJyZW50ID09IFwiXCIpIHsgXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDggfHwgY3VycmVudCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXYgPSBjdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG90SW5kZXggPSBjdXJyZW50LnRvU3RyaW5nKCkuaW5kZXhPZignLicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvdEluZGV4ID49IDApIHRoaXMuaGF2ZURlY2ltYWxQb2ludCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjsgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNOdW1iZXIoZXZlbnQpKSB7IFxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBkb3RJbmRleCA9IGN1cnJlbnQuaW5kZXhPZignLicpO1xyXG4gICAgICAgICAgICBpZiAoKGRvdEluZGV4ID49IDApICYmICgoY3VycmVudC5sZW5ndGggLSAxKSAtIGRvdEluZGV4ID4gdGhpcy5kZWNpbWFscykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBjdXJyZW50LnNsaWNlKDAsIGRvdEluZGV4ICsgdGhpcy5kZWNpbWFscyArIDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLnByZXYpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgIXRoaXMub3B0aW9ucy5hcHBseSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTcGVjaWFsKGV2ZW50KSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTnVtYmVyKGV2ZW50KSkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzRGVjaW1hbFBvaW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhdmVEZWNpbWFsUG9pbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnQuZW5kc1dpdGgoXCIuMFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gY3VycmVudCArIFwiLjBcIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJldiA9IGN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1NwZWNpYWwoZTogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBlLmtleSA9PT0gJ0RlbGV0ZScgfHwgKGUua2V5ID09PSAnVGFiJyB8fCBlLmtleUNvZGUgPT0gOSkgfHwgKGUua2V5ID09PSAnQmFja3NwYWNlJyB8fCBlLmtleUNvZGUgPT0gOCkgfHwgZS5rZXkgPT09ICdBcnJvd0xlZnQnIHx8XHJcbiAgICAgICAgICAgIGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLmtleSA9PT0gJ0hvbWUnIHx8IGUua2V5ID09PSAnRW5kJyB8fCBlLmtleSA9PT0gJ1BhZ2VEb3duJyB8fCBlLmtleSA9PT0gJ1BhZ2VVcCcgfHxcclxuICAgICAgICAgICAgZS5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGUua2V5ID09PSAnQXJyb3dVcCcgfHwgZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBlLmtleSA9PT0gJ0NvbnRyb2wnIHx8IGUua2V5ID09PSAnQWx0JyB8fCBlLmtleSA9PT0gJ1NoaWZ0JyB8fFxyXG4gICAgICAgICAgICAoKDxhbnk+ZSkua2V5SWRlbnRpZmllciA9PSAnRG93bicgfHwgKDxhbnk+ZSkua2V5SWRlbnRpZmllciA9PSAnVXAnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTnVtYmVyKGU6IEtleWJvYXJkRXZlbnQgfCBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICgoZS5rZXkgPj0gJzAnICYmIGUua2V5IDw9ICc5JykgfHwgKChlLmtleUNvZGUgPj0gNDggJiYgZS5rZXlDb2RlIDw9IDU3KSB8fCAoZS5rZXlDb2RlID49IDk2ICYmIGUua2V5Q29kZSA8PSAxMDUpKSB8fCBcclxuICAgICAgICAgICAgICAgICAgICAoZS5rZXkgPT09ICcuJyB8fCBlLmtleSA9PT0gJywnKSB8fCAoZS5rZXlDb2RlID09PSAxODggfHwgZS5rZXlDb2RlID09PSAxOTAgfHwgZS5rZXlDb2RlID09PSAyMjkpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gKChlID49ICcwJyAmJiBlIDw9ICc5JykgfHwgKGUgPT09ICcuJyB8fCBlID09PSAnLCcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0RlY2ltYWxQb2ludChlOiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChlLmtleSA9PT0gJy4nIHx8IGUua2V5ID09PSAnLCcpIHx8IChlLmtleUNvZGUgPT09IDE4OCB8fCBlLmtleUNvZGUgPT09IDE5MCB8fCBlLmtleUNvZGUgPT09IDIyOSk7XHJcbiAgICB9XHJcbn1cclxuIl19