UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

195 lines 26.8 kB
import { coerceAttrBoolean } from '@alauda/ui'; import { ChangeDetectorRef, Directive, inject, Input, QueryList, ViewChildren, } from '@angular/core'; import { FormGroupDirective, NgControl, NgForm, } from '@angular/forms'; import { assocPath, identity, mergeDeepRight, path } from 'ramda'; import { ReplaySubject, startWith, switchMap, Subject, takeUntil, debounceTime, merge, combineLatest, filter, map, tap, take, of, } from 'rxjs'; import * as i0 from "@angular/core"; export function createNestedFormControl({ autoEmitChange = false, asyncValidator = false, } = {}) { return class NestedFormControl extends BaseNestedFormControl { constructor() { super(...arguments); this.autoEmitChange = autoEmitChange; this.asyncValidator = asyncValidator; } }; } export class BaseNestedFormControl { get disabled() { return this._disabled; } set disabled(val) { this._disabled = coerceAttrBoolean(val); } constructor() { this._disabled = false; this.model = null; this.submitted = false; this.autoEmitChange = false; this.asyncValidator = false; this.cdr = inject(ChangeDetectorRef); this.destroy$$ = new Subject(); this.hostForm = inject(NgForm, { optional: true }) ?? inject(FormGroupDirective, { optional: true }); if (this.hostForm) { this.hostForm.ngSubmit.pipe(takeUntil(this.destroy$$)).subscribe(() => { this.submitted = this.hostForm.submitted; this.onSubmitted?.(); this.cdr.markForCheck(); }); } } ngAfterViewInit() { this.controls.changes .pipe(startWith(this.controls), switchMap((controls) => controls.length ? merge(...controls.toArray().map(control => control.statusChanges)).pipe(startWith(null)) : of(null)), debounceTime(0)) .subscribe(() => { this.onValidatorChange?.(); }); if (this.autoEmitChange) { this.controls.changes .pipe(startWith(this.controls), switchMap((controls) => merge(...controls.toArray().map(control => control.valueChanges)))) .pipe(debounceTime(0)) .subscribe(() => { this.emitModel(this.model); }); } } ngOnDestroy() { this.destroy$$.next(); this.destroy$$.complete(); } registerOnValidatorChange(fn) { this.onValidatorChange = fn; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; this.cdr.markForCheck(); } writeValue(value) { this.model = this.valueIn(value); this.cdr.markForCheck(); } validate(_control) { const getErrors = () => this.controls?.reduce((acc, control) => { if (control.errors) { return mergeDeepRight(acc, control.name ? { [control.name]: control.errors } : control.errors); } return acc; }, {}); return this.asyncValidator ? combineLatest((this.controls?.toArray() ?? []).map(control => control.statusChanges.pipe(startWith(control.status)))).pipe(debounceTime(0), filter(statuses => statuses.includes('INVALID') || !statuses.includes('PENDING')), take(1), map(() => getErrors()), tap(() => { this.cdr.markForCheck(); })) : getErrors(); } emitModel(model = this.model) { this.model = model; this.emitValue(this.modelOut(this.model)); } emitValue(value) { if (this.onChange) { this.onChange(value); } } valueIn(value) { return value; } modelOut(model) { return model; } static { this.ɵfac = function BaseNestedFormControl_Factory(t) { return new (t || BaseNestedFormControl)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControl, viewQuery: function BaseNestedFormControl_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(NgControl, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.controls = _t); } }, inputs: { disabled: "disabled" } }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControl, [{ type: Directive }], () => [], { controls: [{ type: ViewChildren, args: [NgControl] }], disabled: [{ type: Input }] }); })(); /** * @deprecated use {@link BaseNestedFormControl} instead. */ export class BaseNestedFormControlPure extends BaseNestedFormControl { constructor() { super(); this.model$ = new ReplaySubject(1); this.model$.subscribe(model => { this.model = model; this.cdr.markForCheck(); }); } writeValue(value) { this.model$.next(this.valueIn(value)); } emitValue(value) { if (this.onChange) { this.onChange(value); this.writeValue(value); } } static { this.ɵfac = function BaseNestedFormControlPure_Factory(t) { return new (t || BaseNestedFormControlPure)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControlPure, features: [i0.ɵɵInheritDefinitionFeature] }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControlPure, [{ type: Directive }], () => [], null); })(); function collectPaths(mapper, parent) { return Object.entries(mapper).reduce((acc, [key, value]) => { const path = typeof value === 'string' ? value.split('.') : value; if (Array.isArray(path)) { acc.push([parent.concat(key), path]); return acc; } return acc.concat(collectPaths(path, parent.concat(key))); }, []); } export function dataTransfer(mapper) { const tuples = collectPaths(mapper, []); let _source; let _target = {}; return [ source => { _source = source; return tuples.reduce((acc, [left, right]) => { const newValue = path(right, source); if (path(left, acc) === newValue) { return acc; } return (_target = assocPath(left, newValue, acc)); }, _target); }, target => { _target = target; return tuples.reduce((acc, [left, right]) => { const newValue = path(left, target); if (path(right, acc) === newValue) { return acc; } return (_source = assocPath(right, newValue, acc)); }, _source); }, ]; } function parsePath(path) { return typeof path === 'string' ? path.split('.') : path; } export function copyValue(from, to, mapper = identity) { const fromPath = parsePath(from); const toPath = parsePath(to); return (object) => assocPath(toPath, mapper(path(fromPath, object)), object); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvcmUvYWJzdHJhY3QvYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMvQyxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUVMLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixTQUFTLEVBQ1QsTUFBTSxHQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsRSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsRUFDVCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLGFBQWEsRUFDYixNQUFNLEVBQ04sR0FBRyxFQUNILEdBQUcsRUFDSCxJQUFJLEVBQ0osRUFBRSxHQUNILE1BQU0sTUFBTSxDQUFDOztBQUVkLE1BQU0sVUFBVSx1QkFBdUIsQ0FBVyxFQUNoRCxjQUFjLEdBQUcsS0FBSyxFQUN0QixjQUFjLEdBQUcsS0FBSyxNQUlwQixFQUFFO0lBRUosT0FBTyxNQUFNLGlCQUFrQixTQUFRLHFCQUEyQjtRQUEzRDs7WUFDYyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztZQUNoQyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUNyRCxDQUFDO0tBQUEsQ0FBQztBQUNKLENBQUM7QUFHRCxNQUFNLE9BQU8scUJBQXFCO0lBTWhDLElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lB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QUcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQVUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUU3QyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2xDLE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUM7Z0JBRUQsT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQWEsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLElBQVU7SUFDM0IsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsSUFBVSxFQUNWLEVBQVEsRUFDUixTQUEwQixRQUFRO0lBRWxDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsT0FBTyxDQUFDLE1BQVMsRUFBRSxFQUFFLENBQ25CLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQXR0ckJvb2xlYW4gfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOZ0NvbnRyb2wsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgYXNzb2NQYXRoLCBpZGVudGl0eSwgbWVyZ2VEZWVwUmlnaHQsIHBhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge1xuICBSZXBsYXlTdWJqZWN0LFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgU3ViamVjdCxcbiAgdGFrZVVudGlsLFxuICBkZWJvdW5jZVRpbWUsXG4gIG1lcmdlLFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgdGFwLFxuICB0YWtlLFxuICBvZixcbn0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZXN0ZWRGb3JtQ29udHJvbDxWLCBNID0gVj4oe1xuICBhdXRvRW1pdENoYW5nZSA9IGZhbHNlLFxuICBhc3luY1ZhbGlkYXRvciA9IGZhbHNlLFxufToge1xuICBhdXRvRW1pdENoYW5nZT86IGJvb2xlYW47XG4gIGFzeW5jVmFsaWRhdG9yPzogYm9vbGVhbjtcbn0gPSB7fSk6IC8vIHdvcmthcm91bmQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzAzNTVcbm5ldyAoKSA9PiBCYXNlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTT4ge1xuICByZXR1cm4gY2xhc3MgTmVzdGVkRm9ybUNvbnRyb2wgZXh0ZW5kcyBCYXNlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTT4ge1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhdXRvRW1pdENoYW5nZSA9IGF1dG9FbWl0Q2hhbmdlO1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luY1ZhbGlkYXRvciA9IGFzeW5jVmFsaWRhdG9yO1xuICB9O1xufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBCYXNlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTSA9IFY+XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3Nvclxue1xuICBAVmlld0NoaWxkcmVuKE5nQ29udHJvbClcbiAgcHJvdGVjdGVkIGNvbnRyb2xzOiBRdWVyeUxpc3Q8TmdDb250cm9sPjtcblxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgc2V0IGRpc2FibGVkKHZhbDogYm9vbGVhbiB8ICcnKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VBdHRyQm9vbGVhbih2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZDtcbiAgb25DaGFuZ2U6IChfOiBWKSA9PiB2b2lkO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG4gIG9uU3VibWl0dGVkOiAoKSA9PiB2b2lkO1xuXG4gIG1vZGVsOiBNID0gbnVsbDtcbiAgc3VibWl0dGVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGF1dG9FbWl0Q2hhbmdlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhc3luY1ZhbGlkYXRvciA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJvdGVjdGVkIGRlc3Ryb3kkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBob3N0Rm9ybSA9XG4gICAgaW5qZWN0KE5nRm9ybSwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/P1xuICAgIGluamVjdChGb3JtR3JvdXBEaXJlY3RpdmUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuaG9zdEZvcm0pIHtcbiAgICAgIHRoaXMuaG9zdEZvcm0ubmdTdWJtaXQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRoaXMuaG9zdEZvcm0uc3VibWl0dGVkO1xuICAgICAgICB0aGlzLm9uU3VibWl0dGVkPy4oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jb250cm9scy5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuY29udHJvbHMpLFxuICAgICAgICBzd2l0Y2hNYXAoKGNvbnRyb2xzOiBRdWVyeUxpc3Q8TmdDb250cm9sPikgPT5cbiAgICAgICAgICBjb250cm9scy5sZW5ndGhcbiAgICAgICAgICAgID8gbWVyZ2UoXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbHMudG9BcnJheSgpLm1hcChjb250cm9sID0+IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcyksXG4gICAgICAgICAgICAgICkucGlwZShzdGFydFdpdGgobnVsbCkpXG4gICAgICAgICAgICA6IG9mKG51bGwpLFxuICAgICAgICApLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZT8uKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLmF1dG9FbWl0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoKHRoaXMuY29udHJvbHMpLFxuICAgICAgICAgIHN3aXRjaE1hcCgoY29udHJvbHM6IFF1ZXJ5TGlzdDxOZ0NvbnRyb2w+KSA9PlxuICAgICAgICAgICAgbWVyZ2UoLi4uY29udHJvbHMudG9BcnJheSgpLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWVDaGFuZ2VzKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW1pdE1vZGVsKHRoaXMubW9kZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogVikgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogVikge1xuICAgIHRoaXMubW9kZWwgPSB0aGlzLnZhbHVlSW4odmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgX2NvbnRyb2w/OiBBYnN0cmFjdENvbnRyb2wsXG4gICk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdldEVycm9ycyA9ICgpID0+XG4gICAgICB0aGlzLmNvbnRyb2xzPy5yZWR1Y2UoKGFjYywgY29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgICAgICByZXR1cm4gbWVyZ2VEZWVwUmlnaHQoXG4gICAgICAgICAgICBhY2MsXG4gICAgICAgICAgICBjb250cm9sLm5hbWUgPyB7IFtjb250cm9sLm5hbWVdOiBjb250cm9sLmVycm9ycyB9IDogY29udHJvbC5lcnJvcnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgVmFsaWRhdGlvbkVycm9ycyk7XG5cbiAgICByZXR1cm4gdGhpcy5hc3luY1ZhbGlkYXRvclxuICAgICAgPyBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgICh0aGlzLmNvbnRyb2xzPy50b0FycmF5KCkgPz8gW10pLm1hcChjb250cm9sID0+XG4gICAgICAgICAgICBjb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgoY29udHJvbC5zdGF0dXMpKSxcbiAgICAgICAgICApLFxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIHN0YXR1c2VzID0+XG4gICAgICAgICAgICAgIHN0YXR1c2VzLmluY2x1ZGVzKCdJTlZBTElEJykgfHwgIXN0YXR1c2VzLmluY2x1ZGVzKCdQRU5ESU5HJyksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIG1hcCgoKSA9PiBnZXRFcnJvcnMoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IGdldEVycm9ycygpO1xuICB9XG5cbiAgZW1pdE1vZGVsKG1vZGVsOiBNID0gdGhpcy5tb2RlbCkge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmVtaXRWYWx1ZSh0aGlzLm1vZGVsT3V0KHRoaXMubW9kZWwpKTtcbiAgfVxuXG4gIGVtaXRWYWx1ZSh2YWx1ZTogVikge1xuICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsdWVJbih2YWx1ZTogVik6IE0ge1xuICAgIHJldHVybiB2YWx1ZSBhcyBhbnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW9kZWxPdXQobW9kZWw6IE0pOiBWIHtcbiAgICByZXR1cm4gbW9kZWwgYXMgYW55O1xuICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBCYXNlTmVzdGVkRm9ybUNvbnRyb2x9IGluc3RlYWQuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEJhc2VOZXN0ZWRGb3JtQ29udHJvbFB1cmU8ViwgTSA9IFY+IGV4dGVuZHMgQmFzZU5lc3RlZEZvcm1Db250cm9sPFxuICBWLFxuICBNXG4+IHtcbiAgbW9kZWwkID0gbmV3IFJlcGxheVN1YmplY3Q8TT4oMSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubW9kZWwkLnN1YnNjcmliZShtb2RlbCA9PiB7XG4gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IFYpIHtcbiAgICB0aGlzLm1vZGVsJC5uZXh0KHRoaXMudmFsdWVJbih2YWx1ZSkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZW1pdFZhbHVlKHZhbHVlOiBWKSB7XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBQYXRoID0gc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcblxuaW50ZXJmYWNlIE1hcHBlciB7XG4gIFt4OiBzdHJpbmddOiBNYXBwZXIgfCBQYXRoO1xufVxuXG50eXBlIFBhdGhUdXBsZSA9IFtzdHJpbmdbXSwgc3RyaW5nW11dO1xuXG5mdW5jdGlvbiBjb2xsZWN0UGF0aHMobWFwcGVyOiBNYXBwZXIsIHBhcmVudDogc3RyaW5nW10pOiBQYXRoVHVwbGVbXSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwYXRoID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KCcuJykgOiB2YWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgYWNjLnB1c2goW3BhcmVudC5jb25jYXQoa2V5KSwgcGF0aF0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoY29sbGVjdFBhdGhzKHBhdGgsIHBhcmVudC5jb25jYXQoa2V5KSkpO1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVHJhbnNmZXI8XG4gIFMgZXh0ZW5kcyBvYmplY3QsXG4gIFQgZXh0ZW5kcyBvYmplY3QsXG4gIE0gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4gPSBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4sXG4+KG1hcHBlcjogTSk6IFsoc291cmNlOiBTKSA9PiBULCAodGFyZ2V0OiBUKSA9PiBTXSB7XG4gIGNvbnN0IHR1cGxlcyA9IGNvbGxlY3RQYXRocyhtYXBwZXIsIFtdKTtcbiAgbGV0IF9zb3VyY2U6IFM7XG4gIGxldCBfdGFyZ2V0OiBUID0ge30gYXMgVDtcbiAgcmV0dXJuIFtcbiAgICBzb3VyY2UgPT4ge1xuICAgICAgX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHJldHVybiB0dXBsZXMucmVkdWNlKChhY2MsIFtsZWZ0LCByaWdodF0pID0+IHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXRoPHVua25vd24+KHJpZ2h0LCBzb3VyY2UpO1xuXG4gICAgICAgIGlmIChwYXRoKGxlZnQsIGFjYykgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoX3RhcmdldCA9IGFzc29jUGF0aDx1bmtub3duLCBUPihsZWZ0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfdGFyZ2V0KTtcbiAgICB9LFxuICAgIHRhcmdldCA9PiB7XG4gICAgICBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgcmV0dXJuIHR1cGxlcy5yZWR1Y2UoKGFjYywgW2xlZnQsIHJpZ2h0XSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHBhdGg8dW5rbm93bj4obGVmdCwgdGFyZ2V0KTtcblxuICAgICAgICBpZiAocGF0aChyaWdodCwgYWNjKSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChfc291cmNlID0gYXNzb2NQYXRoPHVua25vd24sIFM+KHJpZ2h0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfc291cmNlKTtcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogUGF0aCk6IEFycmF5PHN0cmluZyB8IG51bWJlcj4ge1xuICByZXR1cm4gdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnID8gcGF0aC5zcGxpdCgnLicpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgZnJvbTogUGF0aCxcbiAgdG86IFBhdGgsXG4gIG1hcHBlcjogKHY6IGFueSkgPT4gYW55ID0gaWRlbnRpdHksXG4pIHtcbiAgY29uc3QgZnJvbVBhdGggPSBwYXJzZVBhdGgoZnJvbSk7XG4gIGNvbnN0IHRvUGF0aCA9IHBhcnNlUGF0aCh0byk7XG4gIHJldHVybiAob2JqZWN0OiBUKSA9PlxuICAgIGFzc29jUGF0aCh0b1BhdGgsIG1hcHBlcihwYXRoKGZyb21QYXRoLCBvYmplY3QpKSwgb2JqZWN0KTtcbn1cbiJdfQ==