UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

293 lines 39.4 kB
import { Component, ElementRef } from '@angular/core'; import * as Ro from '@nakedobjects/restful-objects'; import { ChoiceViewModel } from '@nakedobjects/view-models'; import every from 'lodash-es/every'; import find from 'lodash-es/find'; import keys from 'lodash-es/keys'; import mapValues from 'lodash-es/mapValues'; import omit from 'lodash-es/omit'; import { BehaviorSubject } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { accept, dropOn, focus, paste, safeUnsubscribe } from '../helpers-components'; import * as i0 from "@angular/core"; import * as i1 from "@nakedobjects/services"; import * as i2 from "@nakedobjects/view-models"; export class FieldComponent { loggerService; renderer; dragAndDrop; constructor(loggerService, renderer, dragAndDrop) { this.loggerService = loggerService; this.renderer = renderer; this.dragAndDrop = dragAndDrop; } set formGroup(fm) { this.formGrp = fm; this.formGrp.valueChanges.pipe(debounceTime(200)).subscribe(_ => this.onValueChanged()); this.onValueChanged(); // (re)set validation messages now } get formGroup() { return this.formGrp; } get message() { return this.model.getMessage(); } get isBoolean() { return this.model.returnType === 'boolean'; } get subject() { if (!this.bSubject) { const initialValue = this.control.value; this.bSubject = new BehaviorSubject(initialValue); this.sub = this.control.valueChanges.subscribe((data) => { this.bSubject.next(data); }); } return this.bSubject; } formGrp; vmParent; model; isConditionalChoices; isAutoComplete; bSubject; sub; lastArgs; control; currentOptions = []; pArgs; paneId; canDrop = false; dragOver = false; init(vmParent, vm, control) { this.vmParent = vmParent; this.model = vm; this.control = control; this.paneId = this.model.onPaneId; this.isConditionalChoices = (this.model.entryType === Ro.EntryType.ConditionalChoices || this.model.entryType === Ro.EntryType.MultipleConditionalChoices); this.isAutoComplete = this.model.entryType === Ro.EntryType.AutoComplete; if (this.isConditionalChoices) { this.pArgs = omit(this.model.promptArguments, 'x-ro-nof-members'); this.populateDropdown(); } } get accept() { // eslint-disable-next-line @typescript-eslint/no-this-alias const _this = this; return (cdkDrag, _cdkDropList) => { return accept(_this.model, _this, cdkDrag.data); }; } drop(event) { const cdkDrag = event.item; if (event.isPointerOverContainer) { dropOn(cdkDrag.data, this.model, this); } this.canDrop = false; this.dragOver = false; } exit() { this.canDrop = false; this.dragOver = false; } enter() { this.dragOver = true; } isDomainObjectViewModel(object) { return !!(object && object instanceof Object && 'properties' in object); } mapValues(args, parmsOrProps) { return mapValues(args, (v, n) => { const pop = find(parmsOrProps, p => p.argId === n); return pop.getValue(); }); } populateArguments() { const dialog = this.vmParent; const object = this.vmParent; if (!dialog && !object) { this.loggerService.throw('FieldComponent:populateArguments Expect dialog or object'); } let parmsOrProps; if (this.isDomainObjectViewModel(object)) { parmsOrProps = object.properties; } else { parmsOrProps = dialog.parameters; } return this.mapValues(this.pArgs, parmsOrProps); } argsChanged(newArgs) { const same = this.lastArgs && keys(this.lastArgs).length === keys(newArgs).length && every(this.lastArgs, (v, k) => newArgs[k].toValueString() === v.toValueString()); this.lastArgs = newArgs; return !same; } populateDropdown() { const nArgs = this.populateArguments(); if (this.argsChanged(nArgs)) { const prompts = this.model.conditionalChoices; if (prompts) { prompts(nArgs). then((cvms) => { // if unchanged return if (cvms.length === this.currentOptions.length && every(cvms, (c, i) => c.equals(this.currentOptions[i]))) { return; } this.model.choices = cvms; this.currentOptions = cvms; if (this.isConditionalChoices) { // need to reset control to find the selected options if (this.model.entryType === Ro.EntryType.MultipleConditionalChoices) { this.control.reset(this.model.selectedMultiChoices); } else { this.control.reset(this.model.selectedChoice); } } }). catch(() => { // error clear everything this.model.selectedChoice = null; this.currentOptions = []; }); } } } onChange() { if (this.isConditionalChoices) { this.populateDropdown(); } else if (this.isAutoComplete) { this.populateAutoComplete(); } else if (this.isBoolean) { this.populateBoolean(); } } onValueChanged() { if (this.model) { this.onChange(); } } populateAutoComplete() { const input = this.control.value; if (input instanceof ChoiceViewModel) { return; } const prompt = this.model.prompt; if (prompt && input && input.length > 0 && input.length >= (this.model.minLength ?? 0)) { prompt(input) .then((cvms) => { if (cvms.length === this.currentOptions.length && every(cvms, (c, i) => c.equals(this.currentOptions[i]))) { return; } this.model.choices = cvms; this.currentOptions = cvms; this.model.selectedChoice = null; }) .catch(() => { this.model.choices = []; this.currentOptions = []; this.model.selectedChoice = null; }); } else { this.model.choices = []; this.currentOptions = []; this.model.selectedChoice = null; } } populateBoolean() { // editable booleans only if (this.isBoolean && this.control) { const input = this.control.value; const element = this.checkboxList?.first.nativeElement; if (input == null) { this.renderer.setProperty(element, 'indeterminate', true); this.renderer.setProperty(element, 'checked', null); } else { this.renderer.setProperty(element, 'indeterminate', false); this.renderer.setProperty(element, 'checked', !!input); } } } select(item) { this.model.choices = []; this.model.selectedChoice = item; this.control.reset(item); } fileUpload(evt) { const file = evt.target.files[0]; const fileReader = new FileReader(); fileReader.onloadend = () => { const link = new Ro.Link({ href: fileReader.result, type: file.type, title: file.name }); this.control.reset(link); this.model.file = link; }; fileReader.readAsDataURL(file); } paste(event) { paste(event, this.model, this, () => this.dragAndDrop.getCopyViewModel(), () => this.dragAndDrop.setCopyViewModel(null)); } clear() { if (this.model.isEditable) { this.control.reset(''); this.model.clear(); } } filterEnter(event) { const enterKeyCode = 13; if (event && event.keyCode === enterKeyCode) { event.preventDefault(); } } handleKeyEvents(event, isMultiline) { this.paste(event); // catch and filter enters or they will submit form - ok for multiline if (!isMultiline) { this.filterEnter(event); } } triStateClick = (currentValue) => { switch (currentValue) { case false: return true; case true: return null; default: // null return false; } }; handleClick(event) { if (this.isBoolean && this.model.optional) { const currentValue = this.control.value; setTimeout(() => this.control.setValue(this.triStateClick(currentValue))); event.preventDefault(); } } focus() { const first = this.focusList && this.focusList.first; if (first instanceof ElementRef) { return focus(first); } return first && first.focus(); } ngOnDestroy() { safeUnsubscribe(this.sub); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: FieldComponent, deps: [{ token: i1.LoggerService }, { token: i0.Renderer2 }, { token: i2.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: FieldComponent, selector: "ng-component", ngImport: i0, template: '<div></div>', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: FieldComponent, decorators: [{ type: Component, args: [{ template: '<div></div>' }] }], ctorParameters: () => [{ type: i1.LoggerService }, { type: i0.Renderer2 }, { type: i2.DragAndDropService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZ2VtaW5pL3NyYy9maWVsZC9maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQW1DLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFcEQsT0FBTyxFQUNILGVBQWUsRUFRbEIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFxQyxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUt0RixNQUFNLE9BQWdCLGNBQWM7SUFHWDtJQUNBO0lBQ0U7SUFIdkIsWUFDcUIsYUFBNEIsRUFDNUIsUUFBbUIsRUFDakIsV0FBK0I7UUFGakMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNqQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFDbEQsQ0FBQztJQUVMLElBQUksU0FBUyxDQUFDLEVBQWE7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxH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QUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3hDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUVyRCxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUUsQ0FBQztZQUM5QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1AsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO3VHQW5VaUIsY0FBYzsyRkFBZCxjQUFjLG9EQURiLGFBQWE7OzJGQUNkLGNBQWM7a0JBRG5DLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCAqIGFzIFJvIGZyb20gJ0BuYWtlZG9iamVjdHMvcmVzdGZ1bC1vYmplY3RzJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UsIFBhbmUgfSBmcm9tICdAbmFrZWRvYmplY3RzL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gICAgQ2hvaWNlVmlld01vZGVsLFxuICAgIERpYWxvZ1ZpZXdNb2RlbCxcbiAgICBEb21haW5PYmplY3RWaWV3TW9kZWwsXG4gICAgRHJhZ0FuZERyb3BTZXJ2aWNlLFxuICAgIElEcmFnZ2FibGVWaWV3TW9kZWwsXG4gICAgTWVudVZpZXdNb2RlbCxcbiAgICBQYXJhbWV0ZXJWaWV3TW9kZWwsXG4gICAgUHJvcGVydHlWaWV3TW9kZWxcbn0gZnJvbSAnQG5ha2Vkb2JqZWN0cy92aWV3LW1vZGVscyc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBldmVyeSBmcm9tICdsb2Rhc2gtZXMvZXZlcnknO1xuaW1wb3J0IGZpbmQgZnJvbSAnbG9kYXNoLWVzL2ZpbmQnO1xuaW1wb3J0IGtleXMgZnJvbSAnbG9kYXNoLWVzL2tleXMnO1xuaW1wb3J0IG1hcFZhbHVlcyBmcm9tICdsb2Rhc2gtZXMvbWFwVmFsdWVzJztcbmltcG9ydCBvbWl0IGZyb20gJ2xvZGFzaC1lcy9vbWl0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uTGlrZSBhcyBJU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBdXRvQ29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJGYWNhZGVDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLXBpY2tlci1mYWNhZGUvZGF0ZS1waWNrZXItZmFjYWRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBhY2NlcHQsIGRyb3BPbiwgZm9jdXMsIHBhc3RlLCBzYWZlVW5zdWJzY3JpYmUgfSBmcm9tICcuLi9oZWxwZXJzLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGltZVBpY2tlckZhY2FkZUNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUtcGlja2VyLWZhY2FkZS90aW1lLXBpY2tlci1mYWNhZGUuY29tcG9uZW50JztcbmltcG9ydCB7IENka0RyYWcsIENka0Ryb3BMaXN0LCBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuXG5AQ29tcG9uZW50KHsgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2PicgfSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZTogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZHJhZ0FuZERyb3A6IERyYWdBbmREcm9wU2VydmljZVxuICAgICkgeyB9XG5cbiAgICBzZXQgZm9ybUdyb3VwKGZtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JwID0gZm07XG4gICAgICAgIHRoaXMuZm9ybUdycC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKF8gPT4gdGhpcy5vblZhbHVlQ2hhbmdlZCgpKTtcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpOyAvLyAocmUpc2V0IHZhbGlkYXRpb24gbWVzc2FnZXMgbm93XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1Hcm91cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUdycDtcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0TWVzc2FnZSgpO1xuICAgIH1cblxuICAgIGdldCBpc0Jvb2xlYW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnJldHVyblR5cGUgPT09ICdib29sZWFuJztcbiAgICB9XG5cbiAgICBnZXQgc3ViamVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJTdWJqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsVmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLnN1YiA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5iU3ViamVjdCEubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYlN1YmplY3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb3JtR3JwITogRm9ybUdyb3VwO1xuICAgIHByaXZhdGUgdm1QYXJlbnQ/OiBEaWFsb2dWaWV3TW9kZWwgfCBEb21haW5PYmplY3RWaWV3TW9kZWwgfCBNZW51Vmlld01vZGVsO1xuICAgIHByaXZhdGUgbW9kZWwhOiBQYXJhbWV0ZXJWaWV3TW9kZWwgfCBQcm9wZXJ0eVZpZXdNb2RlbDtcbiAgICBwcml2YXRlIGlzQ29uZGl0aW9uYWxDaG9pY2VzPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIGlzQXV0b0NvbXBsZXRlPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIGJTdWJqZWN0PzogQmVoYXZpb3JTdWJqZWN0PHVua25vd24+O1xuICAgIHByaXZhdGUgc3ViPzogSVN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGxhc3RBcmdzPzogRGljdGlvbmFyeTxSby5WYWx1ZT47XG5cbiAgICBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xuICAgIGN1cnJlbnRPcHRpb25zOiBDaG9pY2VWaWV3TW9kZWxbXSA9IFtdO1xuICAgIHBBcmdzPzogRGljdGlvbmFyeTxSby5WYWx1ZT47XG4gICAgcGFuZUlkPzogUGFuZTtcbiAgICBjYW5Ecm9wID0gZmFsc2U7XG4gICAgZHJhZ092ZXIgPSBmYWxzZTtcblxuICAgIGFic3RyYWN0IGNoZWNrYm94TGlzdD86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgICBhYnN0cmFjdCBmb2N1c0xpc3Q/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZiB8IERhdGVQaWNrZXJGYWNhZGVDb21wb25lbnQgfCBUaW1lUGlja2VyRmFjYWRlQ29tcG9uZW50IHwgQXV0b0NvbXBsZXRlQ29tcG9uZW50PjtcblxuICAgIHByb3RlY3RlZCBpbml0KFxuICAgICAgICB2bVBhcmVudDogRGlhbG9nVmlld01vZGVsIHwgRG9tYWluT2JqZWN0Vmlld01vZGVsIHwgTWVudVZpZXdNb2RlbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgdm06IFBhcmFtZXRlclZpZXdNb2RlbCB8IFByb3BlcnR5Vmlld01vZGVsLFxuICAgICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcblxuICAgICAgICB0aGlzLnZtUGFyZW50ID0gdm1QYXJlbnQ7XG4gICAgICAgIHRoaXMubW9kZWwgPSB2bTtcbiAgICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcblxuICAgICAgICB0aGlzLnBhbmVJZCA9IHRoaXMubW9kZWwub25QYW5lSWQ7XG5cbiAgICAgICAgdGhpcy5pc0NvbmRpdGlvbmFsQ2hvaWNlcyA9ICh0aGlzLm1vZGVsLmVudHJ5VHlwZSA9PT0gUm8uRW50cnlUeXBlLkNvbmRpdGlvbmFsQ2hvaWNlcyB8fFxuICAgICAgICAgICAgdGhpcy5tb2RlbC5lbnRyeVR5cGUgPT09IFJvLkVudHJ5VHlwZS5NdWx0aXBsZUNvbmRpdGlvbmFsQ2hvaWNlcyk7XG5cbiAgICAgICAgdGhpcy5pc0F1dG9Db21wbGV0ZSA9IHRoaXMubW9kZWwuZW50cnlUeXBlID09PSBSby5FbnRyeVR5cGUuQXV0b0NvbXBsZXRlO1xuXG4gICAgICAgIGlmICh0aGlzLmlzQ29uZGl0aW9uYWxDaG9pY2VzKSB7XG4gICAgICAgICAgICB0aGlzLnBBcmdzID0gb21pdCh0aGlzLm1vZGVsLnByb21wdEFyZ3VtZW50cywgJ3gtcm8tbm9mLW1lbWJlcnMnKSBhcyBEaWN0aW9uYXJ5PFJvLlZhbHVlPjtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFjY2VwdCgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChjZGtEcmFnOiBDZGtEcmFnPElEcmFnZ2FibGVWaWV3TW9kZWw+LCBfY2RrRHJvcExpc3Q6IENka0Ryb3BMaXN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWNjZXB0KF90aGlzLm1vZGVsLCBfdGhpcywgY2RrRHJhZy5kYXRhKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxDZGtEcmFnPElEcmFnZ2FibGVWaWV3TW9kZWw+Pikge1xuICAgICAgICBjb25zdCBjZGtEcmFnOiBDZGtEcmFnPElEcmFnZ2FibGVWaWV3TW9kZWw+ID0gZXZlbnQuaXRlbTtcbiAgICAgICAgaWYgKGV2ZW50LmlzUG9pbnRlck92ZXJDb250YWluZXIpIHtcbiAgICAgICAgICAgIGRyb3BPbihjZGtEcmFnLmRhdGEsIHRoaXMubW9kZWwsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FuRHJvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZXhpdCgpIHtcbiAgICAgICAgdGhpcy5jYW5Ecm9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZHJhZ092ZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBlbnRlcigpIHtcbiAgICAgICAgdGhpcy5kcmFnT3ZlciA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RvbWFpbk9iamVjdFZpZXdNb2RlbChvYmplY3Q6IHVua25vd24pOiBvYmplY3QgaXMgRG9tYWluT2JqZWN0Vmlld01vZGVsIHtcbiAgICAgICAgcmV0dXJuICEhKG9iamVjdCAmJiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgJiYgJ3Byb3BlcnRpZXMnIGluIG9iamVjdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBWYWx1ZXMoYXJnczogRGljdGlvbmFyeTxSby5WYWx1ZT4gfCB1bmRlZmluZWQsIHBhcm1zT3JQcm9wczogeyBhcmdJZDogc3RyaW5nLCBnZXRWYWx1ZTogKCkgPT4gUm8uVmFsdWUgfVtdKSB7XG4gICAgICAgIHJldHVybiBtYXBWYWx1ZXMoYXJncyxcbiAgICAgICAgICAgICh2LCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9wID0gZmluZChwYXJtc09yUHJvcHMsIHAgPT4gcC5hcmdJZCA9PT0gbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcCEuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9wdWxhdGVBcmd1bWVudHMoKSB7XG5cbiAgICAgICAgY29uc3QgZGlhbG9nID0gdGhpcy52bVBhcmVudCBhcyBEaWFsb2dWaWV3TW9kZWw7XG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMudm1QYXJlbnQgYXMgRG9tYWluT2JqZWN0Vmlld01vZGVsO1xuXG4gICAgICAgIGlmICghZGlhbG9nICYmICFvYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS50aHJvdygnRmllbGRDb21wb25lbnQ6cG9wdWxhdGVBcmd1bWVudHMgRXhwZWN0IGRpYWxvZyBvciBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJtc09yUHJvcHM6IHsgYXJnSWQ6IHN0cmluZywgZ2V0VmFsdWU6ICgpID0+IFJvLlZhbHVlIH1bXTtcblxuICAgICAgICBpZiAodGhpcy5pc0RvbWFpbk9iamVjdFZpZXdNb2RlbChvYmplY3QpKSB7XG4gICAgICAgICAgICBwYXJtc09yUHJvcHMgPSBvYmplY3QucHJvcGVydGllcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcm1zT3JQcm9wcyA9IGRpYWxvZy5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWFwVmFsdWVzKHRoaXMucEFyZ3MsIHBhcm1zT3JQcm9wcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcmdzQ2hhbmdlZChuZXdBcmdzOiBEaWN0aW9uYXJ5PFJvLlZhbHVlPikge1xuICAgICAgICBjb25zdCBzYW1lID0gdGhpcy5sYXN0QXJncyAmJlxuICAgICAgICAgICAga2V5cyh0aGlzLmxhc3RBcmdzKS5sZW5ndGggPT09IGtleXMobmV3QXJncykubGVuZ3RoICYmXG4gICAgICAgICAgICBldmVyeSh0aGlzLmxhc3RBcmdzLCAodiwgaykgPT4gbmV3QXJnc1trXS50b1ZhbHVlU3RyaW5nKCkgPT09IHYudG9WYWx1ZVN0cmluZygpKTtcblxuICAgICAgICB0aGlzLmxhc3RBcmdzID0gbmV3QXJncztcbiAgICAgICAgcmV0dXJuICFzYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9wdWxhdGVEcm9wZG93bigpIHtcbiAgICAgICAgY29uc3QgbkFyZ3MgPSB0aGlzLnBvcHVsYXRlQXJndW1lbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLmFyZ3NDaGFuZ2VkKG5BcmdzKSkge1xuICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IHRoaXMubW9kZWwuY29uZGl0aW9uYWxDaG9pY2VzO1xuICAgICAgICAgICAgaWYgKHByb21wdHMpIHtcbiAgICAgICAgICAgICAgICBwcm9tcHRzKG5BcmdzKS5cbiAgICAgICAgICAgICAgICAgICAgdGhlbigoY3ZtczogQ2hvaWNlVmlld01vZGVsW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVuY2hhbmdlZCByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdm1zLmxlbmd0aCA9PT0gdGhpcy5jdXJyZW50T3B0aW9ucy5sZW5ndGggJiYgZXZlcnkoY3ZtcywgKGMsIGkpID0+IGMuZXF1YWxzKHRoaXMuY3VycmVudE9wdGlvbnNbaV0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hvaWNlcyA9IGN2bXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gY3ZtcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25kaXRpb25hbENob2ljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHJlc2V0IGNvbnRyb2wgdG8gZmluZCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmVudHJ5VHlwZSA9PT0gUm8uRW50cnlUeXBlLk11bHRpcGxlQ29uZGl0aW9uYWxDaG9pY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZXNldCh0aGlzLm1vZGVsLnNlbGVjdGVkTXVsdGlDaG9pY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVzZXQodGhpcy5tb2RlbC5zZWxlY3RlZENob2ljZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KS5cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY2xlYXIgZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZENob2ljZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25kaXRpb25hbENob2ljZXMpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVEcm9wZG93bigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNBdXRvQ29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVBdXRvQ29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQm9vbGVhbikge1xuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZUJvb2xlYW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHBvcHVsYXRlQXV0b0NvbXBsZXRlKCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuY29udHJvbC52YWx1ZTtcblxuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDaG9pY2VWaWV3TW9kZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb21wdCA9IHRoaXMubW9kZWwucHJvbXB0O1xuXG4gICAgICAgIGlmIChwcm9tcHQgJiYgaW5wdXQgJiYgaW5wdXQubGVuZ3RoID4gMCAmJiBpbnB1dC5sZW5ndGggPj0gKHRoaXMubW9kZWwubWluTGVuZ3RoID8/IDApKSB7XG4gICAgICAgICAgICBwcm9tcHQoaW5wdXQpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGN2bXM6IENob2ljZVZpZXdNb2RlbFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdm1zLmxlbmd0aCA9PT0gdGhpcy5jdXJyZW50T3B0aW9ucy5sZW5ndGggJiYgZXZlcnkoY3ZtcywgKGMsIGkpID0+IGMuZXF1YWxzKHRoaXMuY3VycmVudE9wdGlvbnNbaV0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hvaWNlcyA9IGN2bXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9wdGlvbnMgPSBjdm1zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkQ2hvaWNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hvaWNlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRDaG9pY2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5jaG9pY2VzID0gW107XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gW107XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkQ2hvaWNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3B1bGF0ZUJvb2xlYW4oKSB7XG5cbiAgICAgICAgLy8gZWRpdGFibGUgYm9vbGVhbnMgb25seVxuICAgICAgICBpZiAodGhpcy5pc0Jvb2xlYW4gJiYgdGhpcy5jb250cm9sKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNoZWNrYm94TGlzdD8uZmlyc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShlbGVtZW50LCAnaW5kZXRlcm1pbmF0ZScsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZWxlbWVudCwgJ2NoZWNrZWQnLCBudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShlbGVtZW50LCAnaW5kZXRlcm1pbmF0ZScsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnQsICdjaGVja2VkJywgISFpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdChpdGVtOiBDaG9pY2VWaWV3TW9kZWwpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5jaG9pY2VzID0gW107XG4gICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRDaG9pY2UgPSBpdGVtO1xuICAgICAgICB0aGlzLmNvbnRyb2wucmVzZXQoaXRlbSk7XG4gICAgfVxuXG4gICAgZmlsZVVwbG9hZChldnQ6IEV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgZmlsZTogRmlsZSA9IChldnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpIS5maWxlcyFbMF07XG4gICAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBuZXcgUm8uTGluayh7XG4gICAgICAgICAgICAgICAgaHJlZjogZmlsZVJlYWRlci5yZXN1bHQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogZmlsZS5uYW1lXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlc2V0KGxpbmspO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5maWxlID0gbGluaztcbiAgICAgICAgfTtcblxuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfVxuXG4gICAgcGFzdGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgcGFzdGUoZXZlbnQsIHRoaXMubW9kZWwsIHRoaXMsICgpID0+IHRoaXMuZHJhZ0FuZERyb3AuZ2V0Q29weVZpZXdNb2RlbCgpLCAoKSA9PiB0aGlzLmRyYWdBbmREcm9wLnNldENvcHlWaWV3TW9kZWwobnVsbCkpO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5pc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVzZXQoJycpO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJFbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBlbnRlcktleUNvZGUgPSAxMztcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUgPT09IGVudGVyS2V5Q29kZSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVLZXlFdmVudHMoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGlzTXVsdGlsaW5lOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucGFzdGUoZXZlbnQpO1xuICAgICAgICAvLyBjYXRjaCBhbmQgZmlsdGVyIGVudGVycyBvciB0aGV5IHdpbGwgc3VibWl0IGZvcm0gLSBvayBmb3IgbXVsdGlsaW5lXG4gICAgICAgIGlmICghaXNNdWx0aWxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRW50ZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlTdGF0ZUNsaWNrID0gKGN1cnJlbnRWYWx1ZTogdW5rbm93bikgPT4ge1xuXG4gICAgICAgIHN3aXRjaCAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZGVmYXVsdDogLy8gbnVsbFxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzQm9vbGVhbiAmJiB0aGlzLm1vZGVsLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLnRyaVN0YXRlQ2xpY2soY3VycmVudFZhbHVlKSkpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuZm9jdXNMaXN0ICYmIHRoaXMuZm9jdXNMaXN0LmZpcnN0O1xuXG4gICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBmb2N1cyhmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHNhZmVVbnN1YnNjcmliZSh0aGlzLnN1Yik7XG4gICAgfVxufVxuIl19