@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
143 lines • 24 kB
JavaScript
import { Component, Input, ViewChild } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { accept, dropOn, focus, paste, safeUnsubscribe } from '../helpers-components';
import * as i0 from "@angular/core";
import * as i1 from "@nakedobjects/view-models";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/cdk/drag-drop";
import * as i5 from "../clear.directive";
export class AutoCompleteComponent {
dragAndDrop;
constructor(dragAndDrop) {
this.dragAndDrop = dragAndDrop;
}
fieldViewModel;
bSubject;
sub;
currentIndex = -1;
inputField;
canDrop = false;
dragOver = false;
set model(m) {
this.fieldViewModel = m;
this.dragAndDrop.setDropZoneId(this.modelPaneId);
}
get model() {
return this.fieldViewModel;
}
form;
get modelPaneId() {
return this.model.paneArgId;
}
get modelId() {
return this.model.id;
}
get control() {
return this.form.controls[this.model.id];
}
get choices() {
return this.model.choices;
}
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;
}
classes() {
return {
[this.model.color]: true,
'candrop': this.canDrop,
'dnd-drag-over': this.dragOver,
};
}
get description() {
return this.model.description;
}
paste(event) {
paste(event, this.model, this, () => this.dragAndDrop.getCopyViewModel(), () => this.dragAndDrop.setCopyViewModel(null));
}
clear() {
this.model.clear();
this.control.reset();
}
select(item) {
this.model.choices = [];
this.model.selectedChoice = item;
this.control.reset(item);
}
choiceName = (choice) => choice.name;
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);
this.currentIndex = -1;
});
}
return this.bSubject;
}
isSelected(i) {
return { 'selected': i === this.currentIndex };
}
onArrowUp() {
this.currentIndex--;
this.currentIndex = this.currentIndex < -1 ? -1 : this.currentIndex;
return false;
}
onArrowDown() {
this.currentIndex++;
const maxIndex = this.choices.length - 1;
this.currentIndex = this.currentIndex > maxIndex ? maxIndex : this.currentIndex;
return false;
}
selectCurrent() {
const maxIndex = this.choices.length - 1;
if (this.currentIndex >= 0 && this.currentIndex <= maxIndex) {
this.select(this.choices[this.currentIndex]);
return false;
}
return true;
}
ngOnDestroy() {
this.dragAndDrop.clearDropZoneId(this.modelPaneId);
safeUnsubscribe(this.sub);
}
focus() {
return focus(this.inputField);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AutoCompleteComponent, deps: [{ token: i1.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AutoCompleteComponent, selector: "nof-auto-complete", inputs: { model: "model", form: "form" }, viewQueries: [{ propertyName: "inputField", first: true, predicate: ["focus"], descendants: true }], ngImport: i0, template: "<div [formGroup]=\"form\">\n <input\n #focus\n [id]=\"modelPaneId\"\n class=\"value droppable\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n (cdkDropListExited)=\"exit()\"\n (cdkDropListEntered)=\"enter()\"\n [cdkDropListEnterPredicate]=\"accept\"\n [ngClass]=\"classes()\"\n placeholder=\"{{description}}\"\n type=\"text\"\n [formControlName]=\"modelId\"\n [nofClear]=\"subject\"\n (clear)=\"clear()\"\n (keydown.arrowup)=\"onArrowUp()\"\n (keydown.arrowdown)=\"onArrowDown()\"\n (keyup.enter)=\"selectCurrent()\"/>\n <div class=\"suggestions\" *ngIf=\"choices.length > 0\">\n <ul >\n <li [ngClass]=\"isSelected(i)\" *ngFor=\"let choice of choices; let i = index\">\n <a (click)=\"select(choice)\">{{choiceName(choice)}}</a>\n </li>\n </ul>\n </div>\n</div>", styles: [".suggestions ul{list-style-type:none;width:var(--field-value-width);border-style:solid;border-width:1px;border-color:#000;margin:0;font-family:var(--font-text-family);font-size:var(--font-size-1);padding-left:0;font-weight:var(--font-weight-3)}.validation{font-family:var(--font-text-family);font-size:var(--font-size-1)}input{width:var(--field-value-width);padding-left:var(--space-3);border-style:solid;border-width:1px;border-color:gray}li a{padding-left:var(--space-3)}li:hover,.selected{background-color:var(--header-background-color);background-color:gray}.ng-clearable{background-image:var(--clearable-image);background-repeat:no-repeat;background-position:right -10px;background-size:8px}.ng-clearable[class*=link-color]{background-image:var(--clearable-link-image)}.ng-clearable.ng-x{background-position:right 2px center}.ng-clearable.ng-onX{cursor:pointer}input::-ms-clear{display:none}.value.droppable{border:solid;border-width:1px;width:var(--field-value-width);height:var(--field-value-height)}.value.droppable{border-color:#000}.value.droppable.dnd-drag-over.candrop{border-color:var(--approval-color);cursor:pointer}.value.droppable.dnd-drag-over{border-color:var(--warning-color)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", 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]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.ClearDirective, selector: "[nofClear]", inputs: ["nofClear"], outputs: ["clear"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AutoCompleteComponent, decorators: [{
type: Component,
args: [{ selector: 'nof-auto-complete', template: "<div [formGroup]=\"form\">\n <input\n #focus\n [id]=\"modelPaneId\"\n class=\"value droppable\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n (cdkDropListExited)=\"exit()\"\n (cdkDropListEntered)=\"enter()\"\n [cdkDropListEnterPredicate]=\"accept\"\n [ngClass]=\"classes()\"\n placeholder=\"{{description}}\"\n type=\"text\"\n [formControlName]=\"modelId\"\n [nofClear]=\"subject\"\n (clear)=\"clear()\"\n (keydown.arrowup)=\"onArrowUp()\"\n (keydown.arrowdown)=\"onArrowDown()\"\n (keyup.enter)=\"selectCurrent()\"/>\n <div class=\"suggestions\" *ngIf=\"choices.length > 0\">\n <ul >\n <li [ngClass]=\"isSelected(i)\" *ngFor=\"let choice of choices; let i = index\">\n <a (click)=\"select(choice)\">{{choiceName(choice)}}</a>\n </li>\n </ul>\n </div>\n</div>", styles: [".suggestions ul{list-style-type:none;width:var(--field-value-width);border-style:solid;border-width:1px;border-color:#000;margin:0;font-family:var(--font-text-family);font-size:var(--font-size-1);padding-left:0;font-weight:var(--font-weight-3)}.validation{font-family:var(--font-text-family);font-size:var(--font-size-1)}input{width:var(--field-value-width);padding-left:var(--space-3);border-style:solid;border-width:1px;border-color:gray}li a{padding-left:var(--space-3)}li:hover,.selected{background-color:var(--header-background-color);background-color:gray}.ng-clearable{background-image:var(--clearable-image);background-repeat:no-repeat;background-position:right -10px;background-size:8px}.ng-clearable[class*=link-color]{background-image:var(--clearable-link-image)}.ng-clearable.ng-x{background-position:right 2px center}.ng-clearable.ng-onX{cursor:pointer}input::-ms-clear{display:none}.value.droppable{border:solid;border-width:1px;width:var(--field-value-width);height:var(--field-value-height)}.value.droppable{border-color:#000}.value.droppable.dnd-drag-over.candrop{border-color:var(--approval-color);cursor:pointer}.value.droppable.dnd-drag-over{border-color:var(--warning-color)}\n"] }]
}], ctorParameters: () => [{ type: i1.DragAndDropService }], propDecorators: { inputField: [{
type: ViewChild,
args: ['focus', { static: false }]
}], model: [{
type: Input,
args: [{ required: true }]
}], form: [{
type: Input,
args: [{ required: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJbkYsT0FBTyxFQUFFLGVBQWUsRUFBcUMsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7OztBQU90RixNQUFNLE9BQU8scUJBQXFCO0lBR1Q7SUFEckIsWUFDcUIsV0FBK0I7UUFBL0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBQ2hELENBQUM7SUFFRyxjQUFjLENBQWtCO0lBQ2hDLFFBQVEsQ0FBNEI7SUFDcEMsR0FBRyxDQUFpQjtJQUNwQixZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFHMUIsVUFBVSxDQUFjO0lBRXhCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVqQixJQUNJLEtBQUssQ0FBQyxDQUFpQjtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBR0QsSUFBSSxDQUFhO0lBR2pCLElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFD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WUFBWSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUM3QyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO3VHQXJKUSxxQkFBcUI7MkZBQXJCLHFCQUFxQix3TUNibEMsczdCQTBCTTs7MkZEYk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNJLG1CQUFtQjt1RkFnQjdCLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQU8vQixLQUFLO3NCQURSLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUcsSUFBSSxFQUFDO2dCQVd4QixJQUFJO3NCQURILEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUcsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZywgQ2RrRHJhZ0Ryb3AsIENka0Ryb3BMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDaG9pY2VWaWV3TW9kZWwsIERyYWdBbmREcm9wU2VydmljZSwgRmllbGRWaWV3TW9kZWwsIElEcmFnZ2FibGVWaWV3TW9kZWwgfSBmcm9tICdAbmFrZWRvYmplY3RzL3ZpZXctbW9kZWxzJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb25MaWtlIGFzIElTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGFjY2VwdCwgZHJvcE9uLCBmb2N1cywgcGFzdGUsIHNhZmVVbnN1YnNjcmliZSB9IGZyb20gJy4uL2hlbHBlcnMtY29tcG9uZW50cyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbm9mLWF1dG8tY29tcGxldGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ2F1dG8tY29tcGxldGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkcmFnQW5kRHJvcDogRHJhZ0FuZERyb3BTZXJ2aWNlXG4gICAgKSB7IH1cblxuICAgIHByaXZhdGUgZmllbGRWaWV3TW9kZWwhOiBGaWVsZFZpZXdNb2RlbDtcbiAgICBwcml2YXRlIGJTdWJqZWN0PzogQmVoYXZpb3JTdWJqZWN0PHVua25vd24+O1xuICAgIHByaXZhdGUgc3ViPzogSVN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGN1cnJlbnRJbmRleCA9IC0xO1xuXG4gICAgQFZpZXdDaGlsZCgnZm9jdXMnLCB7c3RhdGljOiBmYWxzZX0pXG4gICAgaW5wdXRGaWVsZD86IEVsZW1lbnRSZWY7XG4gICAgXG4gICAgY2FuRHJvcCA9IGZhbHNlO1xuICAgIGRyYWdPdmVyID0gZmFsc2U7XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgc2V0IG1vZGVsKG06IEZpZWxkVmlld01vZGVsKSB7XG4gICAgICAgIHRoaXMuZmllbGRWaWV3TW9kZWwgPSBtO1xuICAgICAgICB0aGlzLmRyYWdBbmREcm9wLnNldERyb3Bab25lSWQodGhpcy5tb2RlbFBhbmVJZCk7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZFZpZXdNb2RlbDtcbiAgICB9XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgZm9ybSE6IEZvcm1Hcm91cDtcblxuXG4gICAgZ2V0IG1vZGVsUGFuZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5wYW5lQXJnSWQ7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmlkO1xuICAgIH1cblxuICAgIGdldCBjb250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5tb2RlbC5pZF07XG4gICAgfVxuXG4gICAgZ2V0IGNob2ljZXMoKTogQ2hvaWNlVmlld01vZGVsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5jaG9pY2VzO1xuICAgIH1cblxuICAgIGdldCBhY2NlcHQoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoY2RrRHJhZzogQ2RrRHJhZzxJRHJhZ2dhYmxlVmlld01vZGVsPiwgX2Nka0Ryb3BMaXN0OiBDZGtEcm9wTGlzdCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjY2VwdChfdGhpcy5tb2RlbCwgX3RoaXMsIGNka0RyYWcuZGF0YSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8Q2RrRHJhZzxJRHJhZ2dhYmxlVmlld01vZGVsPj4pIHtcbiAgICAgICAgY29uc3QgY2RrRHJhZzogQ2RrRHJhZzxJRHJhZ2dhYmxlVmlld01vZGVsPiA9IGV2ZW50Lml0ZW07XG4gICAgICAgIGlmIChldmVudC5pc1BvaW50ZXJPdmVyQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBkcm9wT24oY2RrRHJhZy5kYXRhLCB0aGlzLm1vZGVsLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbkRyb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnT3ZlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGV4aXQoKSB7XG4gICAgICAgIHRoaXMuY2FuRHJvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZW50ZXIoKSB7XG4gICAgICAgIHRoaXMuZHJhZ092ZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIGNsYXNzZXMoKTogRGljdGlvbmFyeTxib29sZWFuIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW3RoaXMubW9kZWwuY29sb3JdOiB0cnVlLFxuICAgICAgICAgICAgJ2NhbmRyb3AnOiB0aGlzLmNhbkRyb3AsXG4gICAgICAgICAgICAnZG5kLWRyYWctb3Zlcic6IHRoaXMuZHJhZ092ZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBwYXN0ZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBwYXN0ZShldmVudCwgdGhpcy5tb2RlbCwgdGhpcywgKCkgPT4gdGhpcy5kcmFnQW5kRHJvcC5nZXRDb3B5Vmlld01vZGVsKCksICgpID0+IHRoaXMuZHJhZ0FuZERyb3Auc2V0Q29weVZpZXdNb2RlbChudWxsKSk7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubW9kZWwuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgc2VsZWN0KGl0ZW06IENob2ljZVZpZXdNb2RlbCkge1xuICAgICAgICB0aGlzLm1vZGVsLmNob2ljZXMgPSBbXTtcbiAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZENob2ljZSA9IGl0ZW07XG4gICAgICAgIHRoaXMuY29udHJvbC5yZXNldChpdGVtKTtcbiAgICB9XG5cbiAgICBjaG9pY2VOYW1lID0gKGNob2ljZTogQ2hvaWNlVmlld01vZGVsKSA9PiBjaG9pY2UubmFtZTtcblxuICAgIGdldCBzdWJqZWN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuYlN1YmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMuY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuYlN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3ViID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJTdWJqZWN0IS5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmJTdWJqZWN0O1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQoaTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB7ICdzZWxlY3RlZCc6IGkgPT09IHRoaXMuY3VycmVudEluZGV4IH07XG4gICAgfVxuXG4gICAgb25BcnJvd1VwKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleC0tO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudEluZGV4IDwgLTEgPyAtMSA6IHRoaXMuY3VycmVudEluZGV4O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb25BcnJvd0Rvd24oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG4gICAgICAgIGNvbnN0IG1heEluZGV4ID0gdGhpcy5jaG9pY2VzLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXggPiBtYXhJbmRleCA/IG1heEluZGV4IDogdGhpcy5jdXJyZW50SW5kZXg7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZWxlY3RDdXJyZW50KCkge1xuICAgICAgICBjb25zdCBtYXhJbmRleCA9IHRoaXMuY2hvaWNlcy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5kZXggPj0gMCAmJiB0aGlzLmN1cnJlbnRJbmRleCA8PSBtYXhJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5jaG9pY2VzW3RoaXMuY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHJhZ0FuZERyb3AuY2xlYXJEcm9wWm9uZUlkKHRoaXMubW9kZWxQYW5lSWQpO1xuICAgICAgICBzYWZlVW5zdWJzY3JpYmUodGhpcy5zdWIpO1xuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICByZXR1cm4gZm9jdXModGhpcy5pbnB1dEZpZWxkKTtcbiAgICB9XG59XG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxpbnB1dFxuICAgICAgICAjZm9jdXNcbiAgICAgICAgW2lkXT1cIm1vZGVsUGFuZUlkXCJcbiAgICAgICAgY2xhc3M9XCJ2YWx1ZSBkcm9wcGFibGVcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXG4gICAgICAgIChjZGtEcm9wTGlzdEV4aXRlZCk9XCJleGl0KClcIlxuICAgICAgICAoY2RrRHJvcExpc3RFbnRlcmVkKT1cImVudGVyKClcIlxuICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJhY2NlcHRcIlxuICAgICAgICBbbmdDbGFzc109XCJjbGFzc2VzKClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ZGVzY3JpcHRpb259fVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJtb2RlbElkXCJcbiAgICAgICAgW25vZkNsZWFyXT1cInN1YmplY3RcIlxuICAgICAgICAoY2xlYXIpPVwiY2xlYXIoKVwiXG4gICAgICAgIChrZXlkb3duLmFycm93dXApPVwib25BcnJvd1VwKClcIlxuICAgICAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwib25BcnJvd0Rvd24oKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWxlY3RDdXJyZW50KClcIi8+XG4gICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb25zXCIgKm5nSWY9XCJjaG9pY2VzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPHVsID5cbiAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJpc1NlbGVjdGVkKGkpXCIgKm5nRm9yPVwibGV0IGNob2ljZSBvZiBjaG9pY2VzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdChjaG9pY2UpXCI+e3tjaG9pY2VOYW1lKGNob2ljZSl9fTwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=