UNPKG

@neocomplexx/ngx-neo-completer

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

243 lines 29.9 kB
import { __decorate, __metadata, __param } from "tslib"; import { ChangeDetectorRef, Directive, Host, Input, TemplateRef, ViewContainerRef } from '@angular/core'; import { timer } from 'rxjs'; import { catchError, take } from 'rxjs/operators'; import { CtrCompleter } from './ctr-completer'; import { MIN_SEARCH_LENGTH, PAUSE, CLEAR_TIMEOUT, isNil } from '../globals'; export class CtrListContext { constructor(results, searching, searchInitialized, isOpen) { this.results = results; this.searching = searching; this.searchInitialized = searchInitialized; this.isOpen = isOpen; } } let CtrList = // tslint:disable:no-non-null-assertion // tslint:disable-next-line:directive-class-suffix class CtrList { constructor(completer, templateRef, viewContainer, cd) { this.completer = completer; this.templateRef = templateRef; this.viewContainer = viewContainer; this.cd = cd; this.ctrListMinSearchLength = MIN_SEARCH_LENGTH; this.ctrListPause = PAUSE; this.ctrListAutoMatch = false; this.ctrListAutoHighlight = false; this.ctrListDisplaySearching = true; // private results: CompleterItem[] = []; this.term = null; // private searching = false; this.searchTimer = null; this.clearTimer = null; this.ctx = new CtrListContext([], false, false, false); this._initialValue = null; this.viewRef = null; } ngOnInit() { this.completer.registerList(this); this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, new CtrListContext([], false, false, false)); } set dataService(newService) { this._dataService = newService; this.dataServiceSubscribe(); } set initialValue(value) { if (this._dataService && typeof this._dataService.convertToItem === 'function') { setTimeout(() => { const initialItem = this._dataService.convertToItem(value); if (initialItem) { this.completer.onSelected(initialItem, false); } }); } else if (!this._dataService) { this._initialValue = value; } } search(term) { if (!isNil(term) && term.length >= this.ctrListMinSearchLength && this.term !== term) { if (this.searchTimer) { this.searchTimer.unsubscribe(); this.searchTimer = null; } if (!this.ctx.searching) { if (this.ctrListDisplaySearching) { this.ctx.results = []; } this.ctx.searching = true; this.ctx.searchInitialized = true; this.refreshTemplate(); } if (this.clearTimer) { this.clearTimer.unsubscribe(); } this.searchTimer = timer(this.ctrListPause).pipe(take(1)).subscribe(() => { this.searchTimerComplete(term); }); } else if (!isNil(term) && term.length < this.ctrListMinSearchLength) { this.clear(); this.term = ''; } } clear() { if (this.searchTimer) { this.searchTimer.unsubscribe(); } this.clearTimer = timer(CLEAR_TIMEOUT).pipe(take(1)).subscribe(() => { this._clear(); }); } open() { if (!this.ctx.searchInitialized) { this.search(''); } this.refreshTemplate(); } isOpen(open) { this.ctx.isOpen = open; } _clear() { if (this.searchTimer) { this.searchTimer.unsubscribe(); this.searchTimer = null; } if (this.dataService) { this.dataService.cancel(); } this.viewContainer.clear(); this.viewRef = null; } searchTimerComplete(term) { // Begin the search if (isNil(term) || term.length < this.ctrListMinSearchLength) { this.ctx.searching = false; return; } this.term = term; this._dataService.search(term); } refreshTemplate() { // create the template if it doesn't exist if (!this.viewRef) { this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, this.ctx); } else if (!this.viewRef.destroyed) { // refresh the template this.viewRef.context.isOpen = this.ctx.isOpen; this.viewRef.context.results = this.ctx.results; this.viewRef.context.searching = this.ctx.searching; this.viewRef.context.searchInitialized = this.ctx.searchInitialized; this.viewRef.detectChanges(); } this.cd.markForCheck(); } getBestMatchIndex() { if (!this.ctx.results || !this.term) { return null; } // First try to find the exact term let bestMatch = this.ctx.results.findIndex(item => item.title.toLowerCase() === this.term.toLocaleLowerCase()); // If not try to find the first item that starts with the term if (bestMatch < 0) { bestMatch = this.ctx.results.findIndex(item => item.title.toLowerCase().startsWith(this.term.toLocaleLowerCase())); } // If not try to find the first item that includes the term if (bestMatch < 0) { bestMatch = this.ctx.results.findIndex(item => item.title.toLowerCase().includes(this.term.toLocaleLowerCase())); } return bestMatch < 0 ? null : bestMatch; } dataServiceSubscribe() { if (this._dataService) { this._dataService.pipe(catchError(err => { console.error(err); console.error('Unexpected error in dataService: errors should be handled by the dataService Observable'); return []; })) .subscribe(results => { this.ctx.searchInitialized = true; this.ctx.searching = false; this.ctx.results = results; if (this.ctrListAutoMatch && results && results.length === 1 && results[0].title && !isNil(this.term) && results[0].title.toLocaleLowerCase() === this.term.toLocaleLowerCase()) { // Do automatch this.completer.onSelected(results[0]); return; } if (this._initialValue) { this.initialValue = this._initialValue; this._initialValue = null; } this.refreshTemplate(); if (this.ctrListAutoHighlight) { this.completer.autoHighlightIndex = this.getBestMatchIndex(); } }); if (this._dataService.dataSourceChange) { this._dataService.dataSourceChange.subscribe(() => { this.term = null; this.ctx.searchInitialized = false; this.ctx.searching = false; this.ctx.results = []; this.refreshTemplate(); this.completer.onDataSourceChange(); }); } } } }; CtrList.ctorParameters = () => [ { type: CtrCompleter, decorators: [{ type: Host }] }, { type: TemplateRef }, { type: ViewContainerRef }, { type: ChangeDetectorRef } ]; __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListMinSearchLength", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListPause", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListAutoMatch", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListAutoHighlight", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListDisplaySearching", void 0); __decorate([ Input('ctrList'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], CtrList.prototype, "dataService", null); __decorate([ Input('ctrListInitialValue'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], CtrList.prototype, "initialValue", null); CtrList = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[ctrList]', }) // tslint:disable:no-non-null-assertion // tslint:disable-next-line:directive-class-suffix , __param(0, Host()), __metadata("design:paramtypes", [CtrCompleter, TemplateRef, ViewContainerRef, ChangeDetectorRef]) ], CtrList); export { CtrList }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWxpc3QuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1jb21wbGV0ZXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy9jdHItbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUUsTUFBTSxPQUFPLGNBQWM7SUFDdkIsWUFDVyxPQUErQixFQUMvQixTQUFrQixFQUNsQixpQkFBMEIsRUFDMUIsTUFBZTtRQUhmLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDbEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFTO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVM7SUFDdEIsQ0FBQztDQUNSO0FBUUQsSUFBYSxPQUFPO0FBRnBCLHVDQUF1QztBQUN2QyxrREFBa0Q7QUFDbEQsTUFBYSxPQUFPO0lBaUJoQixZQUNvQixTQUF1QixFQUMvQixXQUF3QyxFQUN4QyxhQUErQixFQUMvQixFQUFxQjtRQUhiLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXBCakIsMkJBQXNCLEdBQUcsaUJBQWlC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SUFDdkMsa0RBQWtEOztJQW1CekMsV0FBQSxJQUFJLEVBQUUsQ0FBQTtxQ0FBb0IsWUFBWTtRQUNsQixXQUFXO1FBQ1QsZ0JBQWdCO1FBQzNCLGlCQUFpQjtHQXJCeEIsT0FBTyxDQTJNbkI7U0EzTVksT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEhvc3QsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBFbWJlZGRlZFZpZXdSZWYsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ3RyQ29tcGxldGVyIH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcbmltcG9ydCB0eXBlIHsgQ29tcGxldGVyTGlzdCB9IGZyb20gJy4vY3RyLWNvbXBsZXRlcic7XG5pbXBvcnQgeyBDb21wbGV0ZXJEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY29tcGxldGVyLWRhdGEnO1xuaW1wb3J0IHsgQ29tcGxldGVySXRlbSB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tcGxldGVyLWl0ZW0nO1xuaW1wb3J0IHsgTUlOX1NFQVJDSF9MRU5HVEgsIFBBVVNFLCBDTEVBUl9USU1FT1VULCBpc05pbCB9IGZyb20gJy4uL2dsb2JhbHMnO1xuXG5leHBvcnQgY2xhc3MgQ3RyTGlzdENvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVzdWx0czogQ29tcGxldGVySXRlbVtdIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHNlYXJjaGluZzogYm9vbGVhbixcbiAgICAgICAgcHVibGljIHNlYXJjaEluaXRpYWxpemVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgaXNPcGVuOiBib29sZWFuXG4gICAgKSB7IH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2N0ckxpc3RdJyxcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1ub24tbnVsbC1hc3NlcnRpb25cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ3RyTGlzdCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29tcGxldGVyTGlzdCB7XG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RNaW5TZWFyY2hMZW5ndGggPSBNSU5fU0VBUkNIX0xFTkdUSDtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdFBhdXNlID0gUEFVU0U7XG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RBdXRvTWF0Y2ggPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdEF1dG9IaWdobGlnaHQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdERpc3BsYXlTZWFyY2hpbmcgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBfZGF0YVNlcnZpY2U6IENvbXBsZXRlckRhdGE7XG4gICAgLy8gcHJpdmF0ZSByZXN1bHRzOiBDb21wbGV0ZXJJdGVtW10gPSBbXTtcbiAgICBwcml2YXRlIHRlcm06IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIHByaXZhdGUgc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lcjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBjbGVhclRpbWVyOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGN0eCA9IG5ldyBDdHJMaXN0Q29udGV4dChbXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgcHJpdmF0ZSBfaW5pdGlhbFZhbHVlOiBhbnkgPSBudWxsO1xuICAgIHByaXZhdGUgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEN0ckxpc3RDb250ZXh0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBIb3N0KCkgcHJpdmF0ZSBjb21wbGV0ZXI6IEN0ckNvbXBsZXRlcixcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8Q3RyTGlzdENvbnRleHQ+LFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIucmVnaXN0ZXJMaXN0KHRoaXMpO1xuICAgICAgICB0aGlzLnZpZXdSZWYgPSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgIG5ldyBDdHJMaXN0Q29udGV4dChbXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBASW5wdXQoJ2N0ckxpc3QnKVxuICAgIHB1YmxpYyBzZXQgZGF0YVNlcnZpY2UobmV3U2VydmljZTogQ29tcGxldGVyRGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhU2VydmljZSA9IG5ld1NlcnZpY2U7XG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2VTdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBASW5wdXQoJ2N0ckxpc3RJbml0aWFsVmFsdWUnKVxuICAgIHB1YmxpYyBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlICYmIHR5cGVvZiB0aGlzLl9kYXRhU2VydmljZS5jb252ZXJ0VG9JdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IHRoaXMuX2RhdGFTZXJ2aWNlLmNvbnZlcnRUb0l0ZW0hKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZChpbml0aWFsSXRlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9kYXRhU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoKHRlcm06IHN0cmluZykge1xuICAgICAgICBpZiAoIWlzTmlsKHRlcm0pICYmIHRlcm0ubGVuZ3RoID49IHRoaXMuY3RyTGlzdE1pblNlYXJjaExlbmd0aCAmJiB0aGlzLnRlcm0gIT09IHRlcm0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmN0eC5zZWFyY2hpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdHJMaXN0RGlzcGxheVNlYXJjaGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclRpbWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gdGltZXIodGhpcy5jdHJMaXN0UGF1c2UpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyQ29tcGxldGUodGVybSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwodGVybSkgJiYgdGVybS5sZW5ndGggPCB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMudGVybSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lciA9IHRpbWVyKENMRUFSX1RJTUVPVVQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuKCkge1xuICAgICAgICBpZiAoIXRoaXMuY3R4LnNlYXJjaEluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jdHguaXNPcGVuID0gb3BlbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhcigpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLmNhbmNlbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudmlld1JlZiA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lckNvbXBsZXRlKHRlcm06IHN0cmluZykge1xuICAgICAgICAvLyBCZWdpbiB0aGUgc2VhcmNoXG4gICAgICAgIGlmIChpc05pbCh0ZXJtKSB8fCB0ZXJtLmxlbmd0aCA8IHRoaXMuY3RyTGlzdE1pblNlYXJjaExlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICAgICAgdGhpcy5fZGF0YVNlcnZpY2Uuc2VhcmNoKHRlcm0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaFRlbXBsYXRlKCkge1xuICAgICAgICAvLyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdSZWYpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICB0aGlzLmN0eFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy52aWV3UmVmLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgdGVtcGxhdGVcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiEuY29udGV4dC5pc09wZW4gPSB0aGlzLmN0eC5pc09wZW47XG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQucmVzdWx0cyA9IHRoaXMuY3R4LnJlc3VsdHM7XG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQuc2VhcmNoaW5nID0gdGhpcy5jdHguc2VhcmNoaW5nO1xuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LnNlYXJjaEluaXRpYWxpemVkID0gdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQ7XG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCZXN0TWF0Y2hJbmRleCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN0eC5yZXN1bHRzIHx8ICF0aGlzLnRlcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIGV4YWN0IHRlcm1cbiAgICAgICAgbGV0IGJlc3RNYXRjaCA9IHRoaXMuY3R4LnJlc3VsdHMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50aXRsZS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyBJZiBub3QgdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBzdGFydHMgd2l0aCB0aGUgdGVybVxuICAgICAgICBpZiAoYmVzdE1hdGNoIDwgMCkge1xuICAgICAgICAgICAgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBub3QgdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBpbmNsdWRlcyB0aGUgdGVybVxuICAgICAgICBpZiAoYmVzdE1hdGNoIDwgMCkge1xuICAgICAgICAgICAgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXJtIS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmVzdE1hdGNoIDwgMCA/IG51bGwgOiBiZXN0TWF0Y2g7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZVN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5waXBlKFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIGRhdGFTZXJ2aWNlOiBlcnJvcnMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGRhdGFTZXJ2aWNlIE9ic2VydmFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgucmVzdWx0cyA9IHJlc3VsdHM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3RyTGlzdEF1dG9NYXRjaCAmJiByZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID09PSAxICYmIHJlc3VsdHNbMF0udGl0bGUgJiYgIWlzTmlsKHRoaXMudGVybSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbMF0udGl0bGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gdGhpcy50ZXJtIS50b0xvY2FsZUxvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBhdXRvbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uU2VsZWN0ZWQocmVzdWx0c1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuX2luaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN0ckxpc3RBdXRvSGlnaGxpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5hdXRvSGlnaGxpZ2h0SW5kZXggPSB0aGlzLmdldEJlc3RNYXRjaEluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlLmRhdGFTb3VyY2VDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5kYXRhU291cmNlQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaEluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=