UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

170 lines 21.8 kB
import { Component, Inject, Input, ViewChild } from '@angular/core'; import { NAE_SEARCH_CATEGORIES } from '../category-factory/search-categories-injection-token'; import { Query } from '../models/query/query'; import * as i0 from "@angular/core"; import * as i1 from "../../logger/services/logger.service"; import * as i2 from "../advanced-search-component-initialization-service/advanced-search-component-initialization.service"; import * as i3 from "../category-factory/category-factory"; /** * Is responsible for the interactive creation of a single {@link ElementaryPredicate} object instance. */ export class AbstractSearchPredicateComponent { _naeSearchCategories; _logger; _initializationService; _categoryFactory; /** * Whether the contents displayed in this component can be edited by the user or not. * * Defaults to `true` */ editable = true; predicate; predicateId; remove$; /** * Optional generator with prefilled values. Can be used to add prefilled predicate components to the search GUI. */ generator; _selectedCategory; _predicateChange; _searchCategories; constructor(_naeSearchCategories, _logger, _initializationService, _categoryFactory) { this._naeSearchCategories = _naeSearchCategories; this._logger = _logger; this._initializationService = _initializationService; this._categoryFactory = _categoryFactory; } ngOnInit() { let found = false; this._searchCategories = this._naeSearchCategories.map(category => { // if the provided generator is the same class as one of the injected search categories if (this.generator && this.generator.constructor === category) { found = true; this.categoryChanged(this.generator); return this.generator; } return this._categoryFactory.get(category); }); if (this.generator && !found) { this._logger.error('Provided predicate generator is not an allowed category from the NAE_SEARCH_CATEGORIES injection token!' + ' Behavior in this case is undefined.'); } this.predicate.setMetadataGenerator(() => { if (!!this._selectedCategory) { return this._selectedCategory.createMetadata(); } return undefined; }); this.predicate.setFilterTextSegmentsGenerator(() => { if (!!this._selectedCategory) { return this._selectedCategory.createFilterTextSegments(); } return []; }); } ngOnDestroy() { if (this._predicateChange && !this._predicateChange.closed) { this._predicateChange.unsubscribe(); } this._searchCategories.forEach(cat => { if (cat !== this.generator) { cat.destroy(); } }); } get searchCategories() { return this._searchCategories; } set categoryInput(input) { if (input && this._initializationService.isInitialized) { setTimeout(() => { input.focus(); input.open(); }); } } get selectedCategory() { return this._selectedCategory; } set selectedCategory(newCategory) { this.categoryChanged(newCategory); } /** * Lambda that is used to preserve `this` reference in HTML binding. * * See [_renderSelection()]{@link AbstractSearchPredicateComponent#_renderSelection} for information about the transform function. * @param option the {@link SearchAutocompleteOption} object that was selected in the autocomplete list. */ renderSelection = (option) => this._renderSelection(option); remove() { this.remove$.next(this.predicateId); } categoryChanged(newCategory) { if (this.selectedCategory !== undefined) { this.selectedCategory.reset(); } this._selectedCategory = newCategory; if (newCategory !== undefined) { if (this._predicateChange) { this._predicateChange.unsubscribe(); } this._predicateChange = newCategory.generatedPredicate$.subscribe(predicate => this.processPredicateChange(predicate)); } } clearCategorySelection() { if (!this.editable) { return; } this.categoryChanged(undefined); } /** * Transforms a {@link SearchAutocompleteOption} object into it's name. * Used for displaying user selection in the input field, when an autocomplete option is selected. * @param option the object we want to transform. It might not exist if user input doesn't match any autocomplete option * @returns option name if it exists, empty string otherwise */ _renderSelection(option) { return option ? option.text : ''; } /** * Notifies the `EditableElementaryPredicate` about changes to the predicate generated by the selected `Category`. * @param newPredicate predicate generated by the selected `Category` */ processPredicateChange(newPredicate) { if (newPredicate === undefined) { this.predicate.query = Query.emptyQuery(); this._logger.debug('Editable query changed to empty query'); } else { this.predicate.query = newPredicate.query; this._logger.debug(`Editable query changed to: ${newPredicate.query.value}`); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractSearchPredicateComponent, deps: [{ token: NAE_SEARCH_CATEGORIES }, { token: i1.LoggerService }, { token: i2.AdvancedSearchComponentInitializationService }, { token: i3.CategoryFactory }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractSearchPredicateComponent, selector: "ncc-abstract-search-predicate", inputs: { editable: "editable", predicate: "predicate", predicateId: "predicateId", remove$: "remove$", generator: "generator" }, viewQueries: [{ propertyName: "categoryInput", first: true, predicate: ["categoryInput"], descendants: true }], ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractSearchPredicateComponent, decorators: [{ type: Component, args: [{ selector: 'ncc-abstract-search-predicate', template: '' }] }], ctorParameters: () => [{ type: Array, decorators: [{ type: Inject, args: [NAE_SEARCH_CATEGORIES] }] }, { type: i1.LoggerService }, { type: i2.AdvancedSearchComponentInitializationService }, { type: i3.CategoryFactory }], propDecorators: { editable: [{ type: Input }], predicate: [{ type: Input }], predicateId: [{ type: Input }], remove$: [{ type: Input }], generator: [{ type: Input }], categoryInput: [{ type: ViewChild, args: ['categoryInput'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3Qtc2VhcmNoLXByZWRpY2F0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3NlYXJjaC9zZWFyY2gtcHJlZGljYXRlLWNvbXBvbmVudC9hYnN0cmFjdC1zZWFyY2gtcHJlZGljYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQTJCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUzRixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUk1RixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7Ozs7O0FBVTVDOztHQUVHO0FBS0gsTUFBTSxPQUFnQixnQ0FBZ0M7SUFzQlc7SUFDN0I7SUFDQTtJQUNBO0lBdkJoQzs7OztPQUlHO0lBQ00sUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixTQUFTLENBQThCO0lBQ3ZDLFdBQVcsQ0FBUztJQUNwQixPQUFPLENBQWtCO0lBQ2xDOztPQUVHO0lBQ00sU0FBUyxDQUE0QjtJQUVwQyxpQkFBaUIsQ0FBZ0I7SUFFakMsZ0JBQWdCLENBQWU7SUFFL0IsaUJBQWlCLENBQXVCO0lBRWxELFlBQTZELG9CQUFnRCxFQUM3RSxPQUFzQixFQUN0QixzQkFBb0UsRUFDcEUsZ0JBQWlDO1FBSEoseUJBQW9CLEdBQXBCLG9CQUFvQixDQUE0QjtRQUM3RSxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3RCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBOEM7UUFDcEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtJQUNqRSxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFB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OzRGQXRCakMsZ0NBQWdDLHVUQUZ4QyxFQUFFOzs0RkFFTSxnQ0FBZ0M7a0JBSnJELFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLCtCQUErQjtvQkFDekMsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7OzBCQXVCMEIsTUFBTTsyQkFBQyxxQkFBcUI7OEpBZjFDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQThESyxhQUFhO3NCQUR2QixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFR5cGUsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge05BRV9TRUFSQ0hfQ0FURUdPUklFU30gZnJvbSAnLi4vY2F0ZWdvcnktZmFjdG9yeS9zZWFyY2gtY2F0ZWdvcmllcy1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2NhdGVnb3J5JztcbmltcG9ydCB7U2VhcmNoQXV0b2NvbXBsZXRlT3B0aW9ufSBmcm9tICcuLi9tb2RlbHMvY2F0ZWdvcnkvc2VhcmNoLWF1dG9jb21wbGV0ZS1vcHRpb24nO1xuaW1wb3J0IHtFbGVtZW50YXJ5UHJlZGljYXRlfSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlL2VsZW1lbnRhcnktcHJlZGljYXRlJztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL21vZGVscy9xdWVyeS9xdWVyeSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge01hdFNlbGVjdH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7RWRpdGFibGVFbGVtZW50YXJ5UHJlZGljYXRlfSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlL2VkaXRhYmxlLWVsZW1lbnRhcnktcHJlZGljYXRlJztcbmltcG9ydCB7XG4gICAgQWR2YW5jZWRTZWFyY2hDb21wb25lbnRJbml0aWFsaXphdGlvblNlcnZpY2Vcbn0gZnJvbSAnLi4vYWR2YW5jZWQtc2VhcmNoLWNvbXBvbmVudC1pbml0aWFsaXphdGlvbi1zZXJ2aWNlL2FkdmFuY2VkLXNlYXJjaC1jb21wb25lbnQtaW5pdGlhbGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQge0NhdGVnb3J5RmFjdG9yeX0gZnJvbSAnLi4vY2F0ZWdvcnktZmFjdG9yeS9jYXRlZ29yeS1mYWN0b3J5JztcblxuXG4vKipcbiAqIElzIHJlc3BvbnNpYmxlIGZvciB0aGUgaW50ZXJhY3RpdmUgY3JlYXRpb24gb2YgYSBzaW5nbGUge0BsaW5rIEVsZW1lbnRhcnlQcmVkaWNhdGV9IG9iamVjdCBpbnN0YW5jZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3Qtc2VhcmNoLXByZWRpY2F0ZScsXG4gICAgdGVtcGxhdGU6ICcnXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VhcmNoUHJlZGljYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29udGVudHMgZGlzcGxheWVkIGluIHRoaXMgY29tcG9uZW50IGNhbiBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYHRydWVgXG4gICAgICovXG4gICAgQElucHV0KCkgZWRpdGFibGUgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHByZWRpY2F0ZTogRWRpdGFibGVFbGVtZW50YXJ5UHJlZGljYXRlO1xuICAgIEBJbnB1dCgpIHByZWRpY2F0ZUlkOiBudW1iZXI7XG4gICAgQElucHV0KCkgcmVtb3ZlJDogU3ViamVjdDxudW1iZXI+O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGdlbmVyYXRvciB3aXRoIHByZWZpbGxlZCB2YWx1ZXMuIENhbiBiZSB1c2VkIHRvIGFkZCBwcmVmaWxsZWQgcHJlZGljYXRlIGNvbXBvbmVudHMgdG8gdGhlIHNlYXJjaCBHVUkuXG4gICAgICovXG4gICAgQElucHV0KCkgZ2VuZXJhdG9yOiBDYXRlZ29yeTxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gICAgcHJvdGVjdGVkIF9zZWxlY3RlZENhdGVnb3J5OiBDYXRlZ29yeTxhbnk+O1xuXG4gICAgcHJvdGVjdGVkIF9wcmVkaWNhdGVDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcblxuICAgIHByb3RlY3RlZCBfc2VhcmNoQ2F0ZWdvcmllczogQXJyYXk8Q2F0ZWdvcnk8YW55Pj47XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoQEluamVjdChOQUVfU0VBUkNIX0NBVEVHT1JJRVMpIHByaXZhdGUgX25hZVNlYXJjaENhdGVnb3JpZXM6IEFycmF5PFR5cGU8Q2F0ZWdvcnk8YW55Pj4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9pbml0aWFsaXphdGlvblNlcnZpY2U6IEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50SW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NhdGVnb3J5RmFjdG9yeTogQ2F0ZWdvcnlGYWN0b3J5KSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zZWFyY2hDYXRlZ29yaWVzID0gdGhpcy5fbmFlU2VhcmNoQ2F0ZWdvcmllcy5tYXAoY2F0ZWdvcnkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHByb3ZpZGVkIGdlbmVyYXRvciBpcyB0aGUgc2FtZSBjbGFzcyBhcyBvbmUgb2YgdGhlIGluamVjdGVkIHNlYXJjaCBjYXRlZ29yaWVzXG4gICAgICAgICAgICBpZiAodGhpcy5nZW5lcmF0b3IgJiYgdGhpcy5nZW5lcmF0b3IuY29uc3RydWN0b3IgPT09IGNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlDaGFuZ2VkKHRoaXMuZ2VuZXJhdG9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2F0ZWdvcnlGYWN0b3J5LmdldChjYXRlZ29yeSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmdlbmVyYXRvciAmJiAhZm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignUHJvdmlkZWQgcHJlZGljYXRlIGdlbmVyYXRvciBpcyBub3QgYW4gYWxsb3dlZCBjYXRlZ29yeSBmcm9tIHRoZSBOQUVfU0VBUkNIX0NBVEVHT1JJRVMgaW5qZWN0aW9uIHRva2VuISdcbiAgICAgICAgICAgICAgICArICcgQmVoYXZpb3IgaW4gdGhpcyBjYXNlIGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJlZGljYXRlLnNldE1ldGFkYXRhR2VuZXJhdG9yKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDYXRlZ29yeS5jcmVhdGVNZXRhZGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcmVkaWNhdGUuc2V0RmlsdGVyVGV4dFNlZ21lbnRzR2VuZXJhdG9yKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDYXRlZ29yeS5jcmVhdGVGaWx0ZXJUZXh0U2VnbWVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGVDaGFuZ2UgJiYgIXRoaXMuX3ByZWRpY2F0ZUNoYW5nZS5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZUNoYW5nZS51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlYXJjaENhdGVnb3JpZXMuZm9yRWFjaChjYXQgPT4ge1xuICAgICAgICAgICAgaWYgKGNhdCAhPT0gdGhpcy5nZW5lcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBjYXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaENhdGVnb3JpZXMoKTogQXJyYXk8Q2F0ZWdvcnk8YW55Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoQ2F0ZWdvcmllcztcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdjYXRlZ29yeUlucHV0JylcbiAgICBwdWJsaWMgc2V0IGNhdGVnb3J5SW5wdXQoaW5wdXQ6IE1hdFNlbGVjdCkge1xuICAgICAgICBpZiAoaW5wdXQgJiYgdGhpcy5faW5pdGlhbGl6YXRpb25TZXJ2aWNlLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgaW5wdXQub3BlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnkoKTogQ2F0ZWdvcnk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZENhdGVnb3J5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRDYXRlZ29yeShuZXdDYXRlZ29yeTogQ2F0ZWdvcnk8YW55Pikge1xuICAgICAgICB0aGlzLmNhdGVnb3J5Q2hhbmdlZChuZXdDYXRlZ29yeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGFtYmRhIHRoYXQgaXMgdXNlZCB0byBwcmVzZXJ2ZSBgdGhpc2AgcmVmZXJlbmNlIGluIEhUTUwgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFNlZSBbX3JlbmRlclNlbGVjdGlvbigpXXtAbGluayBBYnN0cmFjdFNlYXJjaFByZWRpY2F0ZUNvbXBvbmVudCNfcmVuZGVyU2VsZWN0aW9ufSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIHRoZSB7QGxpbmsgU2VhcmNoQXV0b2NvbXBsZXRlT3B0aW9ufSBvYmplY3QgdGhhdCB3YXMgc2VsZWN0ZWQgaW4gdGhlIGF1dG9jb21wbGV0ZSBsaXN0LlxuICAgICAqL1xuICAgIHB1YmxpYyByZW5kZXJTZWxlY3Rpb24gPSAob3B0aW9uOiBTZWFyY2hBdXRvY29tcGxldGVPcHRpb248dW5rbm93bj4pID0+IHRoaXMuX3JlbmRlclNlbGVjdGlvbihvcHRpb24pO1xuXG4gICAgcHVibGljIHJlbW92ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmUkLm5leHQodGhpcy5wcmVkaWNhdGVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhdGVnb3J5Q2hhbmdlZChuZXdDYXRlZ29yeTogQ2F0ZWdvcnk8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkgPSBuZXdDYXRlZ29yeTtcbiAgICAgICAgaWYgKG5ld0NhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcmVkaWNhdGVDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZUNoYW5nZSA9IG5ld0NhdGVnb3J5LmdlbmVyYXRlZFByZWRpY2F0ZSQuc3Vic2NyaWJlKHByZWRpY2F0ZSA9PiB0aGlzLnByb2Nlc3NQcmVkaWNhdGVDaGFuZ2UocHJlZGljYXRlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJDYXRlZ29yeVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhdGVnb3J5Q2hhbmdlZCh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgYSB7QGxpbmsgU2VhcmNoQXV0b2NvbXBsZXRlT3B0aW9ufSBvYmplY3QgaW50byBpdCdzIG5hbWUuXG4gICAgICogVXNlZCBmb3IgZGlzcGxheWluZyB1c2VyIHNlbGVjdGlvbiBpbiB0aGUgaW5wdXQgZmllbGQsIHdoZW4gYW4gYXV0b2NvbXBsZXRlIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIHRoZSBvYmplY3Qgd2Ugd2FudCB0byB0cmFuc2Zvcm0uIEl0IG1pZ2h0IG5vdCBleGlzdCBpZiB1c2VyIGlucHV0IGRvZXNuJ3QgbWF0Y2ggYW55IGF1dG9jb21wbGV0ZSBvcHRpb25cbiAgICAgKiBAcmV0dXJucyBvcHRpb24gbmFtZSBpZiBpdCBleGlzdHMsIGVtcHR5IHN0cmluZyBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3JlbmRlclNlbGVjdGlvbihvcHRpb246IFNlYXJjaEF1dG9jb21wbGV0ZU9wdGlvbjx1bmtub3duPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24udGV4dCA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBgRWRpdGFibGVFbGVtZW50YXJ5UHJlZGljYXRlYCBhYm91dCBjaGFuZ2VzIHRvIHRoZSBwcmVkaWNhdGUgZ2VuZXJhdGVkIGJ5IHRoZSBzZWxlY3RlZCBgQ2F0ZWdvcnlgLlxuICAgICAqIEBwYXJhbSBuZXdQcmVkaWNhdGUgcHJlZGljYXRlIGdlbmVyYXRlZCBieSB0aGUgc2VsZWN0ZWQgYENhdGVnb3J5YFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzUHJlZGljYXRlQ2hhbmdlKG5ld1ByZWRpY2F0ZTogRWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAobmV3UHJlZGljYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJlZGljYXRlLnF1ZXJ5ID0gUXVlcnkuZW1wdHlRdWVyeSgpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdFZGl0YWJsZSBxdWVyeSBjaGFuZ2VkIHRvIGVtcHR5IHF1ZXJ5Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZWRpY2F0ZS5xdWVyeSA9IG5ld1ByZWRpY2F0ZS5xdWVyeTtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgRWRpdGFibGUgcXVlcnkgY2hhbmdlZCB0bzogJHtuZXdQcmVkaWNhdGUucXVlcnkudmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=