UNPKG

ng-cw-v12

Version:

Angular UI Component Library

292 lines 38.7 kB
import { Component, forwardRef, HostListener, Input } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "./local.service"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; export class OtpComponent { constructor(eleRef, cd, ls) { this.eleRef = eleRef; this.cd = cd; this.ls = ls; /** 自定义输入框个数 */ this.ncLength = 6; /** 输入框大小 */ this.ncSize = 'default'; /** 是否禁用 */ this._disabled = false; /** 是否只读 */ this._readonly = false; /** 隐藏输入值 */ this._mask = false; /** 是否为简单模式 */ this._simple = false; /** 是否只允许输入数字 */ this._integerOnly = false; /** 是否自动聚焦 */ this._autofocus = false; this.inputArr = []; this.innerValue = []; this.curIndex = -1; this.inputDoms = []; this.canCopy = false; this.onChangeCallback = () => { }; this.onTouchedCallback = () => { }; } set ncDisabled(value) { this._disabled = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncDisabled() { return this._disabled; } set ncReadonly(value) { this._readonly = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncReadonly() { return this._readonly; } set ncMask(value) { this._mask = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncMask() { return this._mask; } set ncSimple(value) { this._simple = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncSimple() { return this._simple; } set ncIntegerOnly(value) { this._integerOnly = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncIntegerOnly() { return this._integerOnly; } set ncAutofocus(value) { this._autofocus = value !== null && value !== undefined && value !== false && value !== 'false'; } get ncAutofocus() { return this._autofocus; } handleKeyDown(event) { if (this.curIndex == -1) { return; } if (event.ctrlKey && (event.key == "v" || event.key === "V")) { //防止ctrl+v时v执行nextInput return; } if (event.code == 'Space') { event.preventDefault(); return; } if (event.key == 'Backspace' || event.key == 'Delete') { setTimeout(() => { //先执行删除操作,再执行lastInput this.lastInput(this.curIndex); }); return; } if (event.key == 'ArrowLeft') { setTimeout(() => { this.lastInput(this.curIndex); }); return; } if (event.key == 'ArrowRight') { setTimeout(() => { this.nextInput(this.curIndex); }); return; } if (this.ncIntegerOnly) { if (!(/^[0-9]{1}$/.test(event.key))) { event.preventDefault(); } else { setTimeout(() => { //先执行输入操作,再执行nextInput this.nextInput(this.curIndex); }); } } else { if (/^[a-zA-Z0-9]{1}$/.test(event.key)) { setTimeout(() => { //先执行输入操作,再执行nextInput this.nextInput(this.curIndex); }); } } } ngOnInit() { this.inputArr = Array.from({ length: this.ncLength }); } ngAfterViewInit() { var _a; this.inputDoms = this.eleRef.nativeElement.querySelectorAll('.otp-input'); if (this.ncAutofocus) { setTimeout(() => { this.inputDoms[0].focus(); }); } const otpContainer = this.eleRef.nativeElement.querySelector(`.otp-container`); const parent = (_a = otpContainer.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement; //nc-otp的父级 if (this.ls.isBrowser) { document.addEventListener('click', (event) => { //选中parent或parent内部元素 if (event.target == parent || parent.contains((event.target))) { this.canCopy = true; } else { this.canCopy = false; } }); document.addEventListener('paste', (event) => { if (this.canCopy) { // 阻止默认粘贴行为 event.preventDefault(); // 获取剪贴板数据 const clipboardData = event.clipboardData; let pastedData = clipboardData.getData('Text'); // 处理获取的文本数据 if (pastedData && pastedData.length > 0 && !this.ncDisabled && !this.ncReadonly) { //删除空格 pastedData = pastedData.replace(/\s+/g, ''); let pastedDataArr = pastedData.split(''); //integerOnlyMode下存在非数字中断粘贴 if (this.ncIntegerOnly) { for (let d of pastedDataArr) { if (isNaN(Number(d))) { return; } } } while (pastedDataArr.length < this.ncLength) { pastedDataArr.push(null); } if (pastedDataArr.length > this.ncLength) { pastedDataArr = pastedDataArr.slice(0, this.ncLength); } for (let i = 0; i < pastedDataArr.length; i++) { pastedDataArr[i] = !pastedDataArr[i] ? null : (isNaN(Number(pastedDataArr[i])) ? pastedDataArr[i] : Number(pastedDataArr[i])); } this.value = [...pastedDataArr]; } } }); } } ngOnDestroy() { if (this.ls.isBrowser) { document.removeEventListener('click', () => { }); document.removeEventListener('paste', () => { }); } } inputFocus(index) { this.curIndex = index; const inputElement = this.inputDoms[index]; if (inputElement.value) { inputElement.select(); } } inputBlur(index) { this.curIndex = -1; } lastInput(index) { const lastIndex = index == 0 ? index : index - 1; const lastInput = this.inputDoms[lastIndex]; lastInput.focus(); } nextInput(index) { const nextIndex = index == this.ncLength - 1 ? index : index + 1; const nextInput = this.inputDoms[nextIndex]; nextInput.focus(); } get value() { return this.innerValue; } set value(v) { if (JSON.stringify(v) !== JSON.stringify(this.innerValue)) { this.innerValue = v; this.onChangeCallback(v); } } // 从模型写入值到视图 writeValue(value) { if (JSON.stringify(value) !== JSON.stringify(this.innerValue)) { this.innerValue = value; this.cd.markForCheck(); } } // 注册 onChange 事件 registerOnChange(fn) { this.onChangeCallback = fn; } // 注册 onTouched 事件 registerOnTouched(fn) { this.onTouchedCallback = fn; } onInputChange(index, event) { //integerOnlyMode下非数字置空 if (this.ncIntegerOnly && isNaN(Number(event))) { const inputElement = this.inputDoms[index]; inputElement.value = ''; event = ''; } let temp = [...this.value]; //补齐数组 while (temp.length < this.ncLength) { temp.push(null); } if (temp.length > this.ncLength) { temp = temp.slice(0, this.ncLength); } temp.splice(index, 1, event == '' ? null : (isNaN(Number(event)) ? event : Number(event))); this.value = [...temp]; //执行set value } } OtpComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: OtpComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.LocalService }], target: i0.ɵɵFactoryTarget.Component }); OtpComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: OtpComponent, selector: "nc-otp", inputs: { ncLength: "ncLength", ncSize: "ncSize", ncDisabled: "ncDisabled", ncReadonly: "ncReadonly", ncMask: "ncMask", ncSimple: "ncSimple", ncIntegerOnly: "ncIntegerOnly", ncAutofocus: "ncAutofocus" }, host: { listeners: { "window:keydown": "handleKeyDown($event)" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => OtpComponent), multi: true } ], ngImport: i0, template: "<div class=\"otp-container\" style=\"--gap: {{ncSize == 'small' ? '8px' : (ncSize == 'large' ? '12px' : '10px')}}\">\r\n <input *ngFor=\"let input of inputArr;let index = index;\" class=\"otp-input\" [class.otp-input-simple]=\"ncSimple\"\r\n [class.otp-input-large]=\"ncSize == 'large'\" [class.otp-input-small]=\"ncSize == 'small'\"\r\n [class.otp-input-mask]=\"ncMask\" type=\"text\" autocomplete=\"off\" [disabled]=\"ncDisabled\" [readonly]=\"ncReadonly\"\r\n maxlength=\"1\" (focus)=\"inputFocus(index)\" (blur)=\"inputBlur(index)\" [ngModel]=\"value ? value[index]: null\"\r\n (ngModelChange)=\"onInputChange(index, $event)\">\r\n</div>", styles: [".otp-container{display:flex;grid-gap:var(--gap);gap:var(--gap);width:-moz-fit-content;width:fit-content}.otp-container .otp-input{width:35px;height:33px;font-size:14px;color:#334155;background:#ffffff;padding:.5em .75em;border:1px solid #cbd5e1;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s,outline-color .2s;-webkit-appearance:none;appearance:none;border-radius:6px;box-shadow:0 0 #0000,0 0 #0000,0 1px 2px #1212170d;text-align:center}.otp-container .otp-input:hover{border-color:#94a3b8}.otp-container .otp-input:focus{outline:1px solid #3b82f6;outline-offset:-1px;box-shadow:none;border-color:#94a3b8}.otp-container .otp-input::selection{background-color:#eff5fe;color:#393ada}.otp-container .otp-input:disabled{border:1px solid #DDD;background-color:#f5f5f5;color:#aca899;opacity:1}.otp-container .otp-input-simple{border-width:0 0 2px 0;border-color:#64748b;box-shadow:none;border-radius:0;background:none;color:#42769e}.otp-container .otp-input-simple:focus{outline:none;box-shadow:none;border-color:#3b82f6}.otp-container .otp-input-simple:disabled{border-color:#ddd;border-width:0 0 2px 0;background-color:#fff0;color:#aca899;opacity:1}.otp-container .otp-input-mask{-webkit-text-security:disc}.otp-container .otp-input-large{width:45px;height:43px;font-size:18px}.otp-container .otp-input-small{width:27px;height:25px;padding:.3em .55em;font-size:12px}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: OtpComponent, decorators: [{ type: Component, args: [{ selector: 'nc-otp', templateUrl: './otp.component.html', styleUrls: ['./otp.component.less'], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => OtpComponent), multi: true } ] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.LocalService }]; }, propDecorators: { ncLength: [{ type: Input }], ncSize: [{ type: Input }], ncDisabled: [{ type: Input }], ncReadonly: [{ type: Input }], ncMask: [{ type: Input }], ncSimple: [{ type: Input }], ncIntegerOnly: [{ type: Input }], ncAutofocus: [{ type: Input }], handleKeyDown: [{ type: HostListener, args: ['window:keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvb3RwL290cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL290cC9vdHAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQyxTQUFTLEVBQWMsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQWlCbkQsTUFBTSxPQUFPLFlBQVk7SUE4RHZCLFlBQW9CLE1BQWtCLEVBQVUsRUFBcUIsRUFBVSxFQUFnQjtRQUEzRSxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFjO1FBN0QvRixlQUFlO1FBQ04sYUFBUSxHQUFXLENBQUMsQ0FBQztRQUM5QixZQUFZO1FBQ0gsV0FBTSxHQUFlLFNBQVMsQ0FBQztRQUN4QyxXQUFXO1FBQ0gsY0FBUyxHQUFZLEtBQUssQ0FBQztRQU9uQyxXQUFXO1FBQ0gsY0FBUyxHQUFZLEtBQUssQ0FBQztRQU9uQyxZQUFZO1FBQ0osVUFBSyxHQUFZLEtBQUssQ0FBQztRQU8vQixjQUFjO1FBQ04sWUFBTyxHQUFZLEtBQUssQ0FBQztRQU9qQyxnQkFBZ0I7UUFDUixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQU90QyxhQUFhO1FBQ0wsZUFBVSxHQUFZLEtBQUssQ0FBQztRQVFwQyxhQUFRLEdBQWUsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBZSxFQUFFLENBQUM7UUFDNUIsYUFBUSxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLGNBQVMsR0FBNEIsRUFBRSxDQUFDO1FBQ3hDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDakIscUJB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UzttQkFBQztvQkFDVCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsV0FBVyxFQUFFLHNCQUFzQjtvQkFDbkMsU0FBUyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ25DLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUM7NEJBQzNDLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGOzRKQUdVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUdPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBUU8sVUFBVTtzQkFBdEIsS0FBSztnQkFRTyxNQUFNO3NCQUFsQixLQUFLO2dCQVFPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBUU8sYUFBYTtzQkFBekIsS0FBSztnQkFRTyxXQUFXO3NCQUF2QixLQUFLO2dCQWtCTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTG9jYWxTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCB0eXBlIE5jU2l6ZVR5cGUgPSAnc21hbGwnIHwgJ2RlZmF1bHQnIHwgJ2xhcmdlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmMtb3RwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vb3RwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9vdHAuY29tcG9uZW50Lmxlc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE90cENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgT3RwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiDoh6rlrprkuYnovpPlhaXmoYbkuKrmlbAgKi9cclxuICBASW5wdXQoKSBuY0xlbmd0aDogbnVtYmVyID0gNjtcclxuICAvKiog6L6T5YWl5qGG5aSn5bCPICovXHJcbiAgQElucHV0KCkgbmNTaXplOiBOY1NpemVUeXBlID0gJ2RlZmF1bHQnO1xyXG4gIC8qKiDmmK/lkKbnpoHnlKggKi9cclxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBuY0Rpc2FibGVkKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcbiAgLyoqIOaYr+WQpuWPquivuyAqL1xyXG4gIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IG5jUmVhZG9ubHkodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY1JlYWRvbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xyXG4gIH1cclxuICAvKiog6ZqQ6JeP6L6T5YWl5YC8ICovXHJcbiAgcHJpdmF0ZSBfbWFzazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBuY01hc2sodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX21hc2sgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jTWFzaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXNrO1xyXG4gIH1cclxuICAvKiog5piv5ZCm5Li6566A5Y2V5qih5byPICovXHJcbiAgcHJpdmF0ZSBfc2ltcGxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IG5jU2ltcGxlKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9zaW1wbGUgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jU2ltcGxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NpbXBsZTtcclxuICB9XHJcbiAgLyoqIOaYr+WQpuWPquWFgeiuuOi+k+WFpeaVsOWtlyAqL1xyXG4gIHByaXZhdGUgX2ludGVnZXJPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IG5jSW50ZWdlck9ubHkodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2ludGVnZXJPbmx5ID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY0ludGVnZXJPbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludGVnZXJPbmx5O1xyXG4gIH1cclxuICAvKiog5piv5ZCm6Ieq5Yqo6IGa54SmICovXHJcbiAgcHJpdmF0ZSBfYXV0b2ZvY3VzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IG5jQXV0b2ZvY3VzKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9hdXRvZm9jdXMgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jQXV0b2ZvY3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9mb2N1cztcclxuICB9XHJcblxyXG4gIGlucHV0QXJyOiBBcnJheTxhbnk+ID0gW107XHJcbiAgaW5uZXJWYWx1ZTogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGN1ckluZGV4OiBudW1iZXIgPSAtMTtcclxuICBpbnB1dERvbXM6IEFycmF5PEhUTUxJbnB1dEVsZW1lbnQ+ID0gW107XHJcbiAgY2FuQ29weTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gKCkgPT4geyB9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZVJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgbHM6IExvY2FsU2VydmljZSkgeyB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5jdXJJbmRleCA9PSAtMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleSA9PSBcInZcIiB8fCBldmVudC5rZXkgPT09IFwiVlwiKSkge1xyXG4gICAgICAvL+mYsuatomN0cmwrduaXtnbmiafooYxuZXh0SW5wdXRcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC5jb2RlID09ICdTcGFjZScpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC5rZXkgPT0gJ0JhY2tzcGFjZScgfHwgZXZlbnQua2V5ID09ICdEZWxldGUnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8v5YWI5omn6KGM5Yig6Zmk5pON5L2c77yM5YaN5omn6KGMbGFzdElucHV0XHJcbiAgICAgICAgdGhpcy5sYXN0SW5wdXQodGhpcy5jdXJJbmRleCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnQua2V5ID09ICdBcnJvd0xlZnQnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubGFzdElucHV0KHRoaXMuY3VySW5kZXgpO1xyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LmtleSA9PSAnQXJyb3dSaWdodCcpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uZXh0SW5wdXQodGhpcy5jdXJJbmRleCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5uY0ludGVnZXJPbmx5KSB7XHJcbiAgICAgIGlmICghKC9eWzAtOV17MX0kLy50ZXN0KGV2ZW50LmtleSkpKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIC8v5YWI5omn6KGM6L6T5YWl5pON5L2c77yM5YaN5omn6KGMbmV4dElucHV0XHJcbiAgICAgICAgICB0aGlzLm5leHRJbnB1dCh0aGlzLmN1ckluZGV4KTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoL15bYS16QS1aMC05XXsxfSQvLnRlc3QoZXZlbnQua2V5KSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy/lhYjmiafooYzovpPlhaXmk43kvZzvvIzlho3miafooYxuZXh0SW5wdXRcclxuICAgICAgICAgIHRoaXMubmV4dElucHV0KHRoaXMuY3VySW5kZXgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbnB1dEFyciA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMubmNMZW5ndGggfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlucHV0RG9tcyA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm90cC1pbnB1dCcpO1xyXG4gICAgaWYgKHRoaXMubmNBdXRvZm9jdXMpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbnB1dERvbXNbMF0uZm9jdXMoKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvdHBDb250YWluZXI6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAub3RwLWNvbnRhaW5lcmApO1xyXG4gICAgY29uc3QgcGFyZW50ID0gb3RwQ29udGFpbmVyLnBhcmVudEVsZW1lbnQ/LnBhcmVudEVsZW1lbnQ7Ly9uYy1vdHDnmoTniLbnuqdcclxuXHJcbiAgICBpZiAodGhpcy5scy5pc0Jyb3dzZXIpIHtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvL+mAieS4rXBhcmVudOaIlnBhcmVudOWGhemDqOWFg+e0oFxyXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT0gcGFyZW50IHx8IHBhcmVudCEuY29udGFpbnMoKGV2ZW50LnRhcmdldCkgYXMgTm9kZSkpIHtcclxuICAgICAgICAgIHRoaXMuY2FuQ29weSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY2FuQ29weSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29weSkge1xyXG4gICAgICAgICAgLy8g6Zi75q2i6buY6K6k57KY6LS06KGM5Li6XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgIC8vIOiOt+WPluWJqui0tOadv+aVsOaNrlxyXG4gICAgICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbiAgICAgICAgICBsZXQgcGFzdGVkRGF0YSA9IGNsaXBib2FyZERhdGEhLmdldERhdGEoJ1RleHQnKTtcclxuXHJcbiAgICAgICAgICAvLyDlpITnkIbojrflj5bnmoTmlofmnKzmlbDmja5cclxuICAgICAgICAgIGlmIChwYXN0ZWREYXRhICYmIHBhc3RlZERhdGEubGVuZ3RoID4gMCAmJiAhdGhpcy5uY0Rpc2FibGVkICYmICF0aGlzLm5jUmVhZG9ubHkpIHtcclxuICAgICAgICAgICAgLy/liKDpmaTnqbrmoLxcclxuICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEucmVwbGFjZSgvXFxzKy9nLCAnJyk7XHJcbiAgICAgICAgICAgIGxldCBwYXN0ZWREYXRhQXJyOiBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBudWxsPiA9IHBhc3RlZERhdGEuc3BsaXQoJycpO1xyXG4gICAgICAgICAgICAvL2ludGVnZXJPbmx5TW9kZeS4i+WtmOWcqOmdnuaVsOWtl+S4reaWreeymOi0tFxyXG4gICAgICAgICAgICBpZiAodGhpcy5uY0ludGVnZXJPbmx5KSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgZCBvZiBwYXN0ZWREYXRhQXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKGQpKSkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoaWxlIChwYXN0ZWREYXRhQXJyLmxlbmd0aCA8IHRoaXMubmNMZW5ndGgpIHtcclxuICAgICAgICAgICAgICBwYXN0ZWREYXRhQXJyLnB1c2gobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhc3RlZERhdGFBcnIubGVuZ3RoID4gdGhpcy5uY0xlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHBhc3RlZERhdGFBcnIgPSBwYXN0ZWREYXRhQXJyLnNsaWNlKDAsIHRoaXMubmNMZW5ndGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFzdGVkRGF0YUFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIHBhc3RlZERhdGFBcnJbaV0gPSAhcGFzdGVkRGF0YUFycltpXSA/IG51bGwgOiAoaXNOYU4oTnVtYmVyKHBhc3RlZERhdGFBcnJbaV0pKSA/IHBhc3RlZERhdGFBcnJbaV0gOiBOdW1iZXIocGFzdGVkRGF0YUFycltpXSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbLi4ucGFzdGVkRGF0YUFycl07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubHMuaXNCcm93c2VyKSB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyB9KTtcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCAoKSA9PiB7IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5wdXRGb2N1cyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1ckluZGV4ID0gaW5kZXg7XHJcbiAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSB0aGlzLmlucHV0RG9tc1tpbmRleF07XHJcbiAgICBpZiAoaW5wdXRFbGVtZW50LnZhbHVlKSB7XHJcbiAgICAgIGlucHV0RWxlbWVudC5zZWxlY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlucHV0Qmx1cihpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1ckluZGV4ID0gLTE7XHJcbiAgfVxyXG5cclxuICBsYXN0SW5wdXQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgbGFzdEluZGV4OiBudW1iZXIgPSBpbmRleCA9PSAwID8gaW5kZXggOiBpbmRleCAtIDE7XHJcbiAgICBjb25zdCBsYXN0SW5wdXQgPSB0aGlzLmlucHV0RG9tc1tsYXN0SW5kZXhdO1xyXG4gICAgbGFzdElucHV0LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBuZXh0SW5wdXQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgbmV4dEluZGV4OiBudW1iZXIgPSBpbmRleCA9PSB0aGlzLm5jTGVuZ3RoIC0gMSA/IGluZGV4IDogaW5kZXggKyAxO1xyXG4gICAgY29uc3QgbmV4dElucHV0ID0gdGhpcy5pbnB1dERvbXNbbmV4dEluZGV4XTtcclxuICAgIG5leHRJbnB1dC5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbm5lclZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZhbHVlKHY6IGFueSkge1xyXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHYpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmlubmVyVmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHY7XHJcbiAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOS7juaooeWei+WGmeWFpeWAvOWIsOinhuWbvlxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5pbm5lclZhbHVlKSkge1xyXG4gICAgICB0aGlzLmlubmVyVmFsdWUgPSB2YWx1ZTtcclxuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOazqOWGjCBvbkNoYW5nZSDkuovku7ZcclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLy8g5rOo5YaMIG9uVG91Y2hlZCDkuovku7ZcclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XHJcbiAgfVxyXG5cclxuICBvbklucHV0Q2hhbmdlKGluZGV4OiBudW1iZXIsIGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIC8vaW50ZWdlck9ubHlNb2Rl5LiL6Z2e5pWw5a2X572u56m6XHJcbiAgICBpZiAodGhpcy5uY0ludGVnZXJPbmx5ICYmIGlzTmFOKE51bWJlcihldmVudCkpKSB7XHJcbiAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IHRoaXMuaW5wdXREb21zW2luZGV4XTtcclxuICAgICAgaW5wdXRFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIGV2ZW50ID0gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgdGVtcCA9IFsuLi50aGlzLnZhbHVlXTtcclxuICAgIC8v6KGl6b2Q5pWw57uEXHJcbiAgICB3aGlsZSAodGVtcC5sZW5ndGggPCB0aGlzLm5jTGVuZ3RoKSB7XHJcbiAgICAgIHRlbXAucHVzaChudWxsKTtcclxuICAgIH1cclxuICAgIGlmICh0ZW1wLmxlbmd0aCA+IHRoaXMubmNMZW5ndGgpIHtcclxuICAgICAgdGVtcCA9IHRlbXAuc2xpY2UoMCwgdGhpcy5uY0xlbmd0aCk7XHJcbiAgICB9XHJcbiAgICB0ZW1wLnNwbGljZShpbmRleCwgMSwgZXZlbnQgPT0gJycgPyBudWxsIDogKGlzTmFOKE51bWJlcihldmVudCkpID8gZXZlbnQgOiBOdW1iZXIoZXZlbnQpKSk7XHJcbiAgICB0aGlzLnZhbHVlID0gWy4uLnRlbXBdOy8v5omn6KGMc2V0IHZhbHVlXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJvdHAtY29udGFpbmVyXCIgc3R5bGU9XCItLWdhcDoge3tuY1NpemUgPT0gJ3NtYWxsJyA/ICc4cHgnIDogKG5jU2l6ZSA9PSAnbGFyZ2UnID8gJzEycHgnIDogJzEwcHgnKX19XCI+XHJcbiAgICA8aW5wdXQgKm5nRm9yPVwibGV0IGlucHV0IG9mIGlucHV0QXJyO2xldCBpbmRleCA9IGluZGV4O1wiIGNsYXNzPVwib3RwLWlucHV0XCIgW2NsYXNzLm90cC1pbnB1dC1zaW1wbGVdPVwibmNTaW1wbGVcIlxyXG4gICAgICAgIFtjbGFzcy5vdHAtaW5wdXQtbGFyZ2VdPVwibmNTaXplID09ICdsYXJnZSdcIiBbY2xhc3Mub3RwLWlucHV0LXNtYWxsXT1cIm5jU2l6ZSA9PSAnc21hbGwnXCJcclxuICAgICAgICBbY2xhc3Mub3RwLWlucHV0LW1hc2tdPVwibmNNYXNrXCIgdHlwZT1cInRleHRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbZGlzYWJsZWRdPVwibmNEaXNhYmxlZFwiIFtyZWFkb25seV09XCJuY1JlYWRvbmx5XCJcclxuICAgICAgICBtYXhsZW5ndGg9XCIxXCIgKGZvY3VzKT1cImlucHV0Rm9jdXMoaW5kZXgpXCIgKGJsdXIpPVwiaW5wdXRCbHVyKGluZGV4KVwiIFtuZ01vZGVsXT1cInZhbHVlID8gdmFsdWVbaW5kZXhdOiBudWxsXCJcclxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbklucHV0Q2hhbmdlKGluZGV4LCAkZXZlbnQpXCI+XHJcbjwvZGl2PiJdfQ==