UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

171 lines 22.7 kB
import { BaseTooltip, coerceAttrBoolean, TooltipTrigger, TooltipType, } from '@alauda/ui'; import { Overlay } from '@angular/cdk/overlay'; import { ChangeDetectorRef, Directive, ElementRef, Input, NgZone, Renderer2, ViewContainerRef, forwardRef, } from '@angular/core'; import { NG_VALIDATORS, } from '@angular/forms'; import { converge, mergeAll } from 'ramda'; import { STRONG_PASSWORD_SPECIAL_CHARS } from '../utils'; import { StrongPasswordTooltipComponent } from './strong-password-tooltip/component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; export class StrongPasswordDirective extends BaseTooltip { set aclStrongPassword(enabled) { this._enabled = coerceAttrBoolean(enabled); } get aclStrongPassword() { return this._enabled && !this.disabled; } set required(required) { this._required = coerceAttrBoolean(required); } get required() { return this._required; } registerOnValidatorChange(fn) { this.onValidatorChange = fn; } ngOnChanges() { this.onValidatorChange?.(); } constructor(overlay, viewContainerRef, elRef, renderer, cdr, ngZone) { super(overlay, viewContainerRef, elRef, renderer, cdr, ngZone); this.specialChars = STRONG_PASSWORD_SPECIAL_CHARS; this.minlength = 8; this.maxlength = 32; this.notStartsWith = ''; this.componentClass = StrongPasswordTooltipComponent; this.validate = (control) => { const v = control.value ?? ''; const isFocusing = this.elRef.nativeElement === document.activeElement; if (this.aclStrongPassword && v) { if (isFocusing) { this.show(); } } else if (!isFocusing || !this.required) { this.hide(); } // 必填校验由 required validator 控制 const errors = this.aclStrongPassword && (this.required || v) ? converge((...list) => mergeAll(list), [ this.validateLength, this.validatePattern, ])(v) : null; this.resetContext(errors, v); return errors; }; this.validatePattern = (v) => { if (!v) { return null; } const errors = converge((...list) => mergeAll(list), [ this.validateEnglishChar, this.validateSpecialChar, this.validateNumber, this.validateNotStartsWith, ])(v); return Object.keys(errors).length ? { pattern: errors } : null; }; this.validateLength = (v) => { if (!v || (v.length >= this.minlength && v.length <= this.maxlength)) { return null; } const errors = {}; if (v.length < this.minlength) { errors.minlength = { requiredLength: this.minlength, actualLength: v.length, }; } if (v.length > this.maxlength) { errors.maxlength = { requiredLength: this.maxlength, actualLength: v.length, }; } return errors; }; this.validateEnglishChar = (v) => /[A-Za-z]/.test(v) ? null : { needEnglishChar: true }; this.validateNumber = (v) => /\d/.test(v) ? null : { needNumber: true }; this.validateSpecialChar = (v) => { if (!this.specialChars) { return null; } const chars = this.specialChars.split('').join('\\'); const unexpectedChars = (v.match(new RegExp(`(?![a-zA-Z0-9${chars}]).`, 'g')) ?? []).join(''); return new RegExp(`[${chars}]`, 'g').test(v) && !unexpectedChars ? null : { needSpecialChar: { requiredChars: this.specialChars, actualChars: unexpectedChars, }, }; }; this.validateNotStartsWith = (v) => this.notStartsWith && v.startsWith(this.notStartsWith) ? { notStartsWith: this.notStartsWith } : null; this.type = TooltipType.Info; this.position = 'top start'; this.trigger = TooltipTrigger.Focus; } onFocus() { if (!this.aclStrongPassword) { return; } super.onFocus(); } resetContext(errors, value) { const length = !!value && !errors?.maxlength && !errors?.minlength; const englishChar = !!value && !errors?.pattern?.needEnglishChar; const needNumber = !!value && !errors?.pattern?.needNumber; const specialChar = !!value && !errors?.pattern?.needSpecialChar; this.context = { state: { length, englishChar, specialChar, number: needNumber, }, conditions: { specialChar: this.specialChars, minLength: this.minlength, maxLength: this.maxlength, }, }; } static { this.ɵfac = function StrongPasswordDirective_Factory(t) { return new (t || StrongPasswordDirective)(i0.ɵɵdirectiveInject(i1.Overlay), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: StrongPasswordDirective, selectors: [["input", "aclStrongPassword", "", "ngModel", ""], ["input", "aclStrongPassword", "", "formControl", ""], ["input", "aclStrongPassword", "", "formControlName", ""]], inputs: { aclStrongPassword: "aclStrongPassword", required: "required", specialChars: "specialChars", minlength: "minlength", maxlength: "maxlength", notStartsWith: "notStartsWith" }, features: [i0.ɵɵProvidersFeature([ { provide: NG_VALIDATORS, useExisting: forwardRef(() => StrongPasswordDirective), multi: true, }, ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature] }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(StrongPasswordDirective, [{ type: Directive, args: [{ selector: 'input[aclStrongPassword][ngModel],input[aclStrongPassword][formControl],input[aclStrongPassword][formControlName]', providers: [ { provide: NG_VALIDATORS, useExisting: forwardRef(() => StrongPasswordDirective), multi: true, }, ], }] }], () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }], { aclStrongPassword: [{ type: Input }], required: [{ type: Input }], specialChars: [{ type: Input }], minlength: [{ type: Input }], maxlength: [{ type: Input }], notStartsWith: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Ryb25nLXBhc3N3b3JkLXZhbGlkYXRvci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvZm9ybS92YWxpZGF0b3JzL3N0cm9uZy1wYXNzd29yZC9zdHJvbmctcGFzc3dvcmQtdmFsaWRhdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsV0FBVyxHQUNaLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsYUFBYSxHQUdkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFM0MsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7QUFhckYsTUFBTSxPQUFPLHVCQUNYLFNBQVEsV0FBVztJQUtuQixJQUNJLGlCQUFpQixDQUFDLE9BQXFCO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekMsQ0FBQztJQUlELElBQ0ksUUFBUSxDQUFDLFFBQXNCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcs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O2lCQUNGO2FBQ0Y7NktBUUssaUJBQWlCO2tCQURwQixLQUFLO1lBWUYsUUFBUTtrQkFEWCxLQUFLO1lBVU4sWUFBWTtrQkFEWCxLQUFLO1lBSU4sU0FBUztrQkFEUixLQUFLO1lBSU4sU0FBUztrQkFEUixLQUFLO1lBSU4sYUFBYTtrQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZVRvb2x0aXAsXG4gIGNvZXJjZUF0dHJCb29sZWFuLFxuICBUb29sdGlwVHJpZ2dlcixcbiAgVG9vbHRpcFR5cGUsXG59IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgZm9yd2FyZFJlZixcbiAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb252ZXJnZSwgbWVyZ2VBbGwgfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7IFNUUk9OR19QQVNTV09SRF9TUEVDSUFMX0NIQVJTIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBTdHJvbmdQYXNzd29yZFRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuL3N0cm9uZy1wYXNzd29yZC10b29sdGlwL2NvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnaW5wdXRbYWNsU3Ryb25nUGFzc3dvcmRdW25nTW9kZWxdLGlucHV0W2FjbFN0cm9uZ1Bhc3N3b3JkXVtmb3JtQ29udHJvbF0saW5wdXRbYWNsU3Ryb25nUGFzc3dvcmRdW2Zvcm1Db250cm9sTmFtZV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU3Ryb25nUGFzc3dvcmREaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3Ryb25nUGFzc3dvcmREaXJlY3RpdmVcbiAgZXh0ZW5kcyBCYXNlVG9vbHRpcFxuICBpbXBsZW1lbnRzIFZhbGlkYXRvciwgT25DaGFuZ2VzXG57XG4gIHByaXZhdGUgX2VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgc2V0IGFjbFN0cm9uZ1Bhc3N3b3JkKGVuYWJsZWQ6IGJvb2xlYW4gfCAnJykge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBjb2VyY2VBdHRyQm9vbGVhbihlbmFibGVkKTtcbiAgfVxuXG4gIGdldCBhY2xTdHJvbmdQYXNzd29yZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCAmJiAhdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHNldCByZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbiB8ICcnKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VBdHRyQm9vbGVhbihyZXF1aXJlZCk7XG4gIH1cblxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc3BlY2lhbENoYXJzID0gU1RST05HX1BBU1NXT1JEX1NQRUNJQUxfQ0hBUlM7XG5cbiAgQElucHV0KClcbiAgbWlubGVuZ3RoID0gODtcblxuICBASW5wdXQoKVxuICBtYXhsZW5ndGggPSAzMjtcblxuICBASW5wdXQoKVxuICBub3RTdGFydHNXaXRoID0gJyc7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNvbXBvbmVudENsYXNzID0gU3Ryb25nUGFzc3dvcmRUb29sdGlwQ29tcG9uZW50O1xuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlPy4oKTtcbiAgfVxuXG4gIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBlbFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgbmdab25lOiBOZ1pvbmUsXG4gICkge1xuICAgIHN1cGVyKG92ZXJsYXksIHZpZXdDb250YWluZXJSZWYsIGVsUmVmLCByZW5kZXJlciwgY2RyLCBuZ1pvbmUpO1xuICAgIHRoaXMudHlwZSA9IFRvb2x0aXBUeXBlLkluZm87XG4gICAgdGhpcy5wb3NpdGlvbiA9ICd0b3Agc3RhcnQnO1xuICAgIHRoaXMudHJpZ2dlciA9IFRvb2x0aXBUcmlnZ2VyLkZvY3VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFjbFN0cm9uZ1Bhc3N3b3JkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIub25Gb2N1cygpO1xuICB9XG5cbiAgdmFsaWRhdGUgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyA9PiB7XG4gICAgY29uc3Qgdjogc3RyaW5nID0gY29udHJvbC52YWx1ZSA/PyAnJztcblxuICAgIGNvbnN0IGlzRm9jdXNpbmcgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5hY2xTdHJvbmdQYXNzd29yZCAmJiB2KSB7XG4gICAgICBpZiAoaXNGb2N1c2luZykge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc0ZvY3VzaW5nIHx8ICF0aGlzLnJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICAvLyDlv4XloavmoKHpqoznlLEgcmVxdWlyZWQgdmFsaWRhdG9yIOaOp+WItlxuICAgIGNvbnN0IGVycm9ycyA9XG4gICAgICB0aGlzLmFjbFN0cm9uZ1Bhc3N3b3JkICYmICh0aGlzLnJlcXVpcmVkIHx8IHYpXG4gICAgICAgID8gY29udmVyZ2UoKC4uLmxpc3QpID0+IG1lcmdlQWxsKGxpc3QpLCBbXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlTGVuZ3RoLFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhdHRlcm4sXG4gICAgICAgICAgXSBhcyBjb25zdCkodilcbiAgICAgICAgOiBudWxsO1xuXG4gICAgdGhpcy5yZXNldENvbnRleHQoZXJyb3JzLCB2KTtcblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldENvbnRleHQoZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gISF2YWx1ZSAmJiAhZXJyb3JzPy5tYXhsZW5ndGggJiYgIWVycm9ycz8ubWlubGVuZ3RoO1xuICAgIGNvbnN0IGVuZ2xpc2hDaGFyID0gISF2YWx1ZSAmJiAhZXJyb3JzPy5wYXR0ZXJuPy5uZWVkRW5nbGlzaENoYXI7XG4gICAgY29uc3QgbmVlZE51bWJlciA9ICEhdmFsdWUgJiYgIWVycm9ycz8ucGF0dGVybj8ubmVlZE51bWJlcjtcbiAgICBjb25zdCBzcGVjaWFsQ2hhciA9ICEhdmFsdWUgJiYgIWVycm9ycz8ucGF0dGVybj8ubmVlZFNwZWNpYWxDaGFyO1xuXG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgbGVuZ3RoLFxuICAgICAgICBlbmdsaXNoQ2hhcixcbiAgICAgICAgc3BlY2lhbENoYXIsXG4gICAgICAgIG51bWJlcjogbmVlZE51bWJlcixcbiAgICAgIH0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIHNwZWNpYWxDaGFyOiB0aGlzLnNwZWNpYWxDaGFycyxcbiAgICAgICAgbWluTGVuZ3RoOiB0aGlzLm1pbmxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiB0aGlzLm1heGxlbmd0aCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGVQYXR0ZXJuID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xuICAgIGlmICghdikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gY29udmVyZ2UoKC4uLmxpc3QpID0+IG1lcmdlQWxsKGxpc3QpLCBbXG4gICAgICB0aGlzLnZhbGlkYXRlRW5nbGlzaENoYXIsXG4gICAgICB0aGlzLnZhbGlkYXRlU3BlY2lhbENoYXIsXG4gICAgICB0aGlzLnZhbGlkYXRlTnVtYmVyLFxuICAgICAgdGhpcy52YWxpZGF0ZU5vdFN0YXJ0c1dpdGgsXG4gICAgXSBhcyBjb25zdCkodik7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyB7IHBhdHRlcm46IGVycm9ycyB9IDogbnVsbDtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRlTGVuZ3RoID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xuICAgIGlmICghdiB8fCAodi5sZW5ndGggPj0gdGhpcy5taW5sZW5ndGggJiYgdi5sZW5ndGggPD0gdGhpcy5tYXhsZW5ndGgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgPSB7fTtcbiAgICBpZiAodi5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkge1xuICAgICAgZXJyb3JzLm1pbmxlbmd0aCA9IHtcbiAgICAgICAgcmVxdWlyZWRMZW5ndGg6IHRoaXMubWlubGVuZ3RoLFxuICAgICAgICBhY3R1YWxMZW5ndGg6IHYubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHYubGVuZ3RoID4gdGhpcy5tYXhsZW5ndGgpIHtcbiAgICAgIGVycm9ycy5tYXhsZW5ndGggPSB7XG4gICAgICAgIHJlcXVpcmVkTGVuZ3RoOiB0aGlzLm1heGxlbmd0aCxcbiAgICAgICAgYWN0dWFsTGVuZ3RoOiB2Lmxlbmd0aCxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0ZUVuZ2xpc2hDaGFyID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT5cbiAgICAvW0EtWmEtel0vLnRlc3QodikgPyBudWxsIDogeyBuZWVkRW5nbGlzaENoYXI6IHRydWUgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRlTnVtYmVyID0gKHY6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgPT5cbiAgICAvXFxkLy50ZXN0KHYpID8gbnVsbCA6IHsgbmVlZE51bWJlcjogdHJ1ZSB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGVTcGVjaWFsQ2hhciA9ICh2OiBzdHJpbmcpOiBWYWxpZGF0aW9uRXJyb3JzID0+IHtcbiAgICBpZiAoIXRoaXMuc3BlY2lhbENoYXJzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2hhcnMgPSB0aGlzLnNwZWNpYWxDaGFycy5zcGxpdCgnJykuam9pbignXFxcXCcpO1xuICAgIGNvbnN0IHVuZXhwZWN0ZWRDaGFycyA9IChcbiAgICAgIHYubWF0Y2gobmV3IFJlZ0V4cChgKD8hW2EtekEtWjAtOSR7Y2hhcnN9XSkuYCwgJ2cnKSkgPz8gW11cbiAgICApLmpvaW4oJycpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBbJHtjaGFyc31dYCwgJ2cnKS50ZXN0KHYpICYmICF1bmV4cGVjdGVkQ2hhcnNcbiAgICAgID8gbnVsbFxuICAgICAgOiB7XG4gICAgICAgICAgbmVlZFNwZWNpYWxDaGFyOiB7XG4gICAgICAgICAgICByZXF1aXJlZENoYXJzOiB0aGlzLnNwZWNpYWxDaGFycyxcbiAgICAgICAgICAgIGFjdHVhbENoYXJzOiB1bmV4cGVjdGVkQ2hhcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRlTm90U3RhcnRzV2l0aCA9ICh2OiBzdHJpbmcpOiBWYWxpZGF0aW9uRXJyb3JzID0+XG4gICAgdGhpcy5ub3RTdGFydHNXaXRoICYmIHYuc3RhcnRzV2l0aCh0aGlzLm5vdFN0YXJ0c1dpdGgpXG4gICAgICA/IHsgbm90U3RhcnRzV2l0aDogdGhpcy5ub3RTdGFydHNXaXRoIH1cbiAgICAgIDogbnVsbDtcbn1cbiJdfQ==