@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
233 lines • 37 kB
JavaScript
import { Injectable, Optional } from '@angular/core';
import { HeaderType } from '../../header/models/header-type';
import { filter } from 'rxjs/operators';
import { HeaderChangeType } from '../../header/models/user-changes/header-change-type';
import { HeaderMode } from '../../header/models/header-mode';
import { HeaderColumnType } from '../../header/models/header-column';
import { CaseMetaField } from '../../header/case-header/case-menta-enum';
import { CaseVisualId } from '../models/category/case/case-visual-id';
import { CaseAuthor } from '../models/category/case/case-author';
import { CaseCreationDate } from '../models/category/case/case-creation-date';
import { CaseTitle } from '../models/category/case/case-title';
import { CaseStringId } from '../models/category/case/case-string-id';
import { CaseSimpleDataset } from '../models/category/case/case-simple-dataset';
import * as i0 from "@angular/core";
import * as i1 from "../category-factory/category-factory";
import * as i2 from "../../process/process.service";
import * as i3 from "@ngx-translate/core";
import * as i4 from "../../logger/services/logger.service";
import * as i5 from "../search-service/search.service";
/**
* Acts as an intermediary between the {@link AbstractHeaderService} instances of various types and the {@link SearchService}
*/
export class HeaderSearchService {
_categoryFactory;
_processService;
_translate;
_logger;
_searchService;
_headerService;
_columnToConfiguration;
_typeToCategory;
_headerSub;
_searchSub;
constructor(_categoryFactory, _processService, _translate, _logger, _searchService) {
this._categoryFactory = _categoryFactory;
this._processService = _processService;
this._translate = _translate;
this._logger = _logger;
this._searchService = _searchService;
this._columnToConfiguration = new Map();
this._typeToCategory = new Map();
[
{ k: CaseMetaField.VISUAL_ID, v: CaseVisualId },
{ k: CaseMetaField.TITLE, v: CaseTitle },
{ k: CaseMetaField.CREATION_DATE, v: CaseCreationDate },
{ k: CaseMetaField.AUTHOR, v: CaseAuthor },
{ k: CaseMetaField.MONGO_ID, v: CaseStringId }
].forEach(pair => {
this._typeToCategory.set(pair.k, this._categoryFactory.getWithDefaultOperator(pair.v));
});
this._typeToCategory.set(HeaderColumnType.IMMEDIATE, this._categoryFactory.get(CaseSimpleDataset));
}
ngOnDestroy() {
if (this._headerSub) {
this._headerSub.unsubscribe();
}
if (this._searchSub) {
this._searchSub.unsubscribe();
}
for (const cat of this._typeToCategory.values()) {
cat.destroy();
}
}
set headerService(headerService) {
if (headerService.headerType === HeaderType.CASE || headerService.headerType === HeaderType.TASK) {
this._headerService = headerService;
}
if (headerService && this._searchService) {
this.initializeHeaderSearch();
}
}
/**
* {@link HeaderSearchService} can only be initialized if it successfully injected a {@link SearchService}
* and a {@link AbstractHeaderService} instance of any of the supported types was set into it.
*
* Currently only task and case header searching is supported.
*/
initializeHeaderSearch() {
if (!this._searchService) {
this._logger.error('You can\'t call initializeHeaderSearch without providing a SearchService to be injected!');
return;
}
if (!this._headerService) {
this._logger.error('You can\'t call initializeHeaderSearch without setting an AbstractHeaderService implementation instance!');
return;
}
this._headerSub = this._headerService.headerChange$
.pipe(filter(change => change.changeType === HeaderChangeType.SEARCH || change.changeType === HeaderChangeType.MODE_CHANGED))
.subscribe(change => {
if (change.changeType === HeaderChangeType.SEARCH) {
this.processSearchChange(change.headerType, change.description);
}
else if (change.description.previousMode === HeaderMode.SEARCH) {
this.processModeChange();
}
});
this._searchSub =
this._searchService.predicateRemoved$.subscribe(event => this.handlePredicateRemoval(event.index, event.clearInput));
}
/**
* Pushes all the predicates from the headers into the search interface and clears the header inputs
*/
processModeChange() {
const addedPredicateIds = [];
this._columnToConfiguration.forEach(config => {
this._searchService.removePredicate(config.predicateId);
let editableCategory;
if (config.type === HeaderColumnType.META) {
editableCategory = this._typeToCategory.get(config.fieldIdentifier).duplicate();
editableCategory.selectDefaultOperator();
editableCategory.setOperands(config.userInput);
}
else {
const dataset = this._typeToCategory.get(HeaderColumnType.IMMEDIATE);
editableCategory = dataset.transformToCaseDataset(config.fieldType, config.fieldTitle, config.userInput);
}
addedPredicateIds.push(this._searchService.addGeneratedLeafPredicate(editableCategory));
});
this._searchService.show(addedPredicateIds);
this._columnToConfiguration.clear();
}
/**
* Transforms the {@link HeaderChange} object into a search predicate
*/
processSearchChange(headerType, changeDescription) {
if (headerType === HeaderType.CASE) {
this.processCaseSearch(changeDescription);
}
}
/**
* Processes the change object and resolves it into the appropriate case search predicate change
* @param changeDescription the change object that should be resolved
*/
processCaseSearch(changeDescription) {
if (this.emptyInput(changeDescription)) {
this.removePredicate(changeDescription.columnIdentifier);
return;
}
if (changeDescription.type === HeaderColumnType.META) {
this.processCaseMetaSearch(changeDescription);
}
else {
this.processCaseDataSearch(changeDescription);
}
}
/**
* Processes the change object of a case meta header and resolves it into the appropriate case search predicate change
* @param changeDescription the change object that should be resolved
*/
processCaseMetaSearch(changeDescription) {
const config = {
fieldIdentifier: changeDescription.fieldIdentifier,
userInput: [changeDescription.searchInput]
};
const category = this._typeToCategory.get(config.fieldIdentifier);
const predicate = category.generatePredicate(config.userInput);
this.addPredicate(changeDescription.columnIdentifier, predicate, {
type: HeaderColumnType.META,
...config
});
}
/**
* Processes the change object of a case immediate data header and resolves it into the appropriate case search predicate change
* @param changeDescription the change object that should be resolved
*/
processCaseDataSearch(changeDescription) {
this._processService.getNet(changeDescription.petriNetIdentifier).subscribe(net => {
const config = {
fieldType: changeDescription.fieldType,
fieldTitle: changeDescription.fieldTitle,
userInput: [changeDescription.searchInput]
};
const category = this._typeToCategory.get(changeDescription.type);
category.configure(changeDescription.fieldIdentifier, config.fieldType, [net.identifier]);
const predicate = category.generatePredicate(config.userInput);
this.addPredicate(changeDescription.columnIdentifier, predicate, {
type: HeaderColumnType.IMMEDIATE,
...config
});
});
}
/**
* @param changeDescription information about the search header change
* @returns whether the input was cleared
*/
emptyInput(changeDescription) {
return changeDescription.searchInput === undefined
|| changeDescription.searchInput === null
|| (typeof changeDescription.searchInput === 'string' && changeDescription.searchInput.length === 0);
}
/**
* Updates a Predicate for a given column.
* Removes an existing predicate for this column if it exists and adds the new Predicate.
* @param column the index of the header column
* @param predicate the Predicate that should be added
* @param configuration data necessary for the configuration of the {@link Category} that generates the added predicate
*/
addPredicate(column, predicate, configuration) {
this.removePredicate(column, !this._columnToConfiguration.has(column));
const predicateId = this._searchService.addPredicate(predicate);
this._columnToConfiguration.set(column, { predicateId, ...configuration });
}
/**
* Removes a predicate that corresponds to the provided column
* @param column the index of the column that cleared it's search
* @param clearInput whether the corresponding header search input should be cleared
*/
removePredicate(column, clearInput = true) {
const predicateConfig = this._columnToConfiguration.get(column);
if (predicateConfig !== undefined) {
this._searchService.removePredicate(predicateConfig.predicateId, clearInput);
this._columnToConfiguration.delete(column);
}
}
/**
* @param removedId the id of the removed {@link Predicate}
* @param clearInput whether the corresponding header search input should be cleared
*/
handlePredicateRemoval(removedId, clearInput = true) {
if (this._headerService && clearInput) {
this._headerService.clearHeaderSearch(removedId);
}
this._columnToConfiguration.delete(removedId);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeaderSearchService, deps: [{ token: i1.CategoryFactory }, { token: i2.ProcessService }, { token: i3.TranslateService }, { token: i4.LoggerService }, { token: i5.SearchService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeaderSearchService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeaderSearchService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.CategoryFactory }, { type: i2.ProcessService }, { type: i3.TranslateService }, { type: i4.LoggerService }, { type: i5.SearchService, decorators: [{
type: Optional
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLXNlYXJjaC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9zZWFyY2gvaGVhZGVyLXNlYXJjaC1zZXJ2aWNlL2hlYWRlci1zZWFyY2guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFhLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUc5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUczRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFdkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBRXBFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDN0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBR3BFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZDQUE2QyxDQUFDOzs7Ozs7O0FBbUM5RTs7R0FFRztBQUVILE1BQU0sT0FBTyxtQkFBbUI7SUFRTjtJQUNBO0lBQ0E7SUFDQTtJQUNZO0lBVnhCLGNBQWMsQ0FBd0I7SUFDdEMsc0JBQXNCLENBQW1DO0lBQ3pELGVBQWUs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RSxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNPLHNCQUFzQixDQUFDLFNBQWlCLEVBQUUsVUFBVSxHQUFHLElBQUk7UUFDakUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLFVBQVUsRUFBRTtZQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO3dHQXhOUSxtQkFBbUI7NEdBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBYU0sUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NlYXJjaFNlcnZpY2V9IGZyb20gJy4uL3NlYXJjaC1zZXJ2aWNlL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7QWJzdHJhY3RIZWFkZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9oZWFkZXIvYWJzdHJhY3QtaGVhZGVyLXNlcnZpY2UnO1xuaW1wb3J0IHtIZWFkZXJUeXBlfSBmcm9tICcuLi8uLi9oZWFkZXIvbW9kZWxzL2hlYWRlci10eXBlJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0hlYWRlckNoYW5nZVR5cGV9IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvdXNlci1jaGFuZ2VzL2hlYWRlci1jaGFuZ2UtdHlwZSc7XG5pbXBvcnQge0hlYWRlck1vZGV9IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvaGVhZGVyLW1vZGUnO1xuaW1wb3J0IHtNb2RlQ2hhbmdlRGVzY3JpcHRpb259IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvdXNlci1jaGFuZ2VzL21vZGUtY2hhbmdlLWRlc2NyaXB0aW9uJztcbmltcG9ydCB7U2VhcmNoQ2hhbmdlRGVzY3JpcHRpb259IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvdXNlci1jaGFuZ2VzL3NlYXJjaC1jaGFuZ2UtZGVzY3JpcHRpb24nO1xuaW1wb3J0IHtIZWFkZXJDb2x1bW5UeXBlfSBmcm9tICcuLi8uLi9oZWFkZXIvbW9kZWxzL2hlYWRlci1jb2x1bW4nO1xuaW1wb3J0IHtDYXNlTWV0YUZpZWxkfSBmcm9tICcuLi8uLi9oZWFkZXIvY2FzZS1oZWFkZXIvY2FzZS1tZW50YS1lbnVtJztcbmltcG9ydCB7Q2F0ZWdvcnlGYWN0b3J5fSBmcm9tICcuLi9jYXRlZ29yeS1mYWN0b3J5L2NhdGVnb3J5LWZhY3RvcnknO1xuaW1wb3J0IHtDYXNlVmlzdWFsSWR9IGZyb20gJy4uL21vZGVscy9jYXRlZ29yeS9jYXNlL2Nhc2UtdmlzdWFsLWlkJztcbmltcG9ydCB7Q2F0ZWdvcnl9IGZyb20gJy4uL21vZGVscy9jYXRlZ29yeS9jYXRlZ29yeSc7XG5pbXBvcnQge0Nhc2VBdXRob3J9IGZyb20gJy4uL21vZGVscy9jYXRlZ29yeS9jYXNlL2Nhc2UtYXV0aG9yJztcbmltcG9ydCB7Q2FzZUNyZWF0aW9uRGF0ZX0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2Nhc2UvY2FzZS1jcmVhdGlvbi1kYXRlJztcbmltcG9ydCB7Q2FzZVRpdGxlfSBmcm9tICcuLi9tb2RlbHMvY2F0ZWdvcnkvY2FzZS9jYXNlLXRpdGxlJztcbmltcG9ydCB7Q2FzZVN0cmluZ0lkfSBmcm9tICcuLi9tb2RlbHMvY2F0ZWdvcnkvY2FzZS9jYXNlLXN0cmluZy1pZCc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnLi4vbW9kZWxzL3ByZWRpY2F0ZS9wcmVkaWNhdGUnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vcHJvY2Vzcy9wcm9jZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXNlU2ltcGxlRGF0YXNldH0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2Nhc2UvY2FzZS1zaW1wbGUtZGF0YXNldCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEhvbGRzIHRoZSBJZCBvZiB0aGUgcHJlZGljYXRlIGluIHRoZSB7QGxpbmsgU2VhcmNoU2VydmljZX1cbiAqL1xuaW50ZXJmYWNlIFByZWRpY2F0ZUlkIHtcbiAgICBwcmVkaWNhdGVJZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIGEge0BsaW5rIENhdGVnb3J5fSBjbGFzcyB0byBnZW5lcmF0ZVxuICogYSBwcmVkaWNhdGUgZm9yIGEgTWV0YSBoZWFkZXIgZmllbGRcbiAqL1xuaW50ZXJmYWNlIE1ldGFHZW5lcmF0b3JDb25maWd1cmF0aW9uIHtcbiAgICB0eXBlOiBIZWFkZXJDb2x1bW5UeXBlLk1FVEE7XG4gICAgZmllbGRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgdXNlcklucHV0OiBBcnJheTxhbnk+O1xufVxuXG4vKipcbiAqIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIGEge0BsaW5rIENhdGVnb3J5fSBjbGFzcyB0byBnZW5lcmF0ZVxuICogYSBwcmVkaWNhdGUgZm9yIGEgRGF0YSBoZWFkZXIgZmllbGRcbiAqL1xuaW50ZXJmYWNlIERhdGFHZW5lcmF0b3JDb25maWd1cmF0aW9uIHtcbiAgICB0eXBlOiBIZWFkZXJDb2x1bW5UeXBlLklNTUVESUFURTtcbiAgICBmaWVsZFR5cGU6IHN0cmluZztcbiAgICBmaWVsZFRpdGxlOiBzdHJpbmc7XG4gICAgdXNlcklucHV0OiBBcnJheTxhbnk+O1xufVxuXG50eXBlIEhlYWRlckNvbmZpZ3VyYXRpb24gPSBQcmVkaWNhdGVJZCAmIChNZXRhR2VuZXJhdG9yQ29uZmlndXJhdGlvbiB8IERhdGFHZW5lcmF0b3JDb25maWd1cmF0aW9uKTtcblxuLyoqXG4gKiBBY3RzIGFzIGFuIGludGVybWVkaWFyeSBiZXR3ZWVuIHRoZSB7QGxpbmsgQWJzdHJhY3RIZWFkZXJTZXJ2aWNlfSBpbnN0YW5jZXMgb2YgdmFyaW91cyB0eXBlcyBhbmQgdGhlIHtAbGluayBTZWFyY2hTZXJ2aWNlfVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSGVhZGVyU2VhcmNoU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcm90ZWN0ZWQgX2hlYWRlclNlcnZpY2U6IEFic3RyYWN0SGVhZGVyU2VydmljZTtcbiAgICBwcm90ZWN0ZWQgX2NvbHVtblRvQ29uZmlndXJhdGlvbjogTWFwPG51bWJlciwgSGVhZGVyQ29uZmlndXJhdGlvbj47XG4gICAgcHJvdGVjdGVkIF90eXBlVG9DYXRlZ29yeTogTWFwPHN0cmluZywgQ2F0ZWdvcnk8YW55Pj47XG4gICAgcHJvdGVjdGVkIF9oZWFkZXJTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX3NlYXJjaFN1YjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jYXRlZ29yeUZhY3Rvcnk6IENhdGVnb3J5RmFjdG9yeSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Byb2Nlc3NTZXJ2aWNlOiBQcm9jZXNzU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgX3NlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uID0gbmV3IE1hcDxudW1iZXIsIEhlYWRlckNvbmZpZ3VyYXRpb24+KCk7XG4gICAgICAgIHRoaXMuX3R5cGVUb0NhdGVnb3J5ID0gbmV3IE1hcDxzdHJpbmcsIENhdGVnb3J5PGFueT4+KCk7XG4gICAgICAgIFtcbiAgICAgICAgICAgIHtrOiBDYXNlTWV0YUZpZWxkLlZJU1VBTF9JRCwgdjogQ2FzZVZpc3VhbElkfSxcbiAgICAgICAgICAgIHtrOiBDYXNlTWV0YUZpZWxkLlRJVExFLCB2OiBDYXNlVGl0bGV9LFxuICAgICAgICAgICAge2s6IENhc2VNZXRhRmllbGQuQ1JFQVRJT05fREFURSwgdjogQ2FzZUNyZWF0aW9uRGF0ZX0sXG4gICAgICAgICAgICB7azogQ2FzZU1ldGFGaWVsZC5BVVRIT1IsIHY6IENhc2VBdXRob3J9LFxuICAgICAgICAgICAge2s6IENhc2VNZXRhRmllbGQuTU9OR09fSUQsIHY6IENhc2VTdHJpbmdJZH1cbiAgICAgICAgXS5mb3JFYWNoKHBhaXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdHlwZVRvQ2F0ZWdvcnkuc2V0KHBhaXIuaywgdGhpcy5fY2F0ZWdvcnlGYWN0b3J5LmdldFdpdGhEZWZhdWx0T3BlcmF0b3IocGFpci52KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90eXBlVG9DYXRlZ29yeS5zZXQoSGVhZGVyQ29sdW1uVHlwZS5JTU1FRElBVEUsIHRoaXMuX2NhdGVnb3J5RmFjdG9yeS5nZXQoQ2FzZVNpbXBsZURhdGFzZXQpKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlYWRlclN1Yikge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlYXJjaFN1Yikge1xuICAgICAgICAgICAgdGhpcy5fc2VhcmNoU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjYXQgb2YgdGhpcy5fdHlwZVRvQ2F0ZWdvcnkudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGNhdC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhlYWRlclNlcnZpY2UoaGVhZGVyU2VydmljZTogQWJzdHJhY3RIZWFkZXJTZXJ2aWNlKSB7XG4gICAgICAgIGlmIChoZWFkZXJTZXJ2aWNlLmhlYWRlclR5cGUgPT09IEhlYWRlclR5cGUuQ0FTRSB8fCBoZWFkZXJTZXJ2aWNlLmhlYWRlclR5cGUgPT09IEhlYWRlclR5cGUuVEFTSykge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyU2VydmljZSA9IGhlYWRlclNlcnZpY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGVhZGVyU2VydmljZSAmJiB0aGlzLl9zZWFyY2hTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVIZWFkZXJTZWFyY2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAbGluayBIZWFkZXJTZWFyY2hTZXJ2aWNlfSBjYW4gb25seSBiZSBpbml0aWFsaXplZCBpZiBpdCBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQgYSB7QGxpbmsgU2VhcmNoU2VydmljZX1cbiAgICAgKiBhbmQgYSB7QGxpbmsgQWJzdHJhY3RIZWFkZXJTZXJ2aWNlfSBpbnN0YW5jZSBvZiBhbnkgb2YgdGhlIHN1cHBvcnRlZCB0eXBlcyB3YXMgc2V0IGludG8gaXQuXG4gICAgICpcbiAgICAgKiBDdXJyZW50bHkgb25seSB0YXNrIGFuZCBjYXNlIGhlYWRlciBzZWFyY2hpbmcgaXMgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0aWFsaXplSGVhZGVyU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX3NlYXJjaFNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignWW91IGNhblxcJ3QgY2FsbCBpbml0aWFsaXplSGVhZGVyU2VhcmNoIHdpdGhvdXQgcHJvdmlkaW5nIGEgU2VhcmNoU2VydmljZSB0byBiZSBpbmplY3RlZCEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWRlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignWW91IGNhblxcJ3QgY2FsbCBpbml0aWFsaXplSGVhZGVyU2VhcmNoIHdpdGhvdXQgc2V0dGluZyBhbiBBYnN0cmFjdEhlYWRlclNlcnZpY2UgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9oZWFkZXJTdWIgPSB0aGlzLl9oZWFkZXJTZXJ2aWNlLmhlYWRlckNoYW5nZSRcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcihjaGFuZ2UgPT4gY2hhbmdlLmNoYW5nZVR5cGUgPT09IEhlYWRlckNoYW5nZVR5cGUuU0VBUkNIIHx8IGNoYW5nZS5jaGFuZ2VUeXBlID09PSBIZWFkZXJDaGFuZ2VUeXBlLk1PREVfQ0hBTkdFRCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBIZWFkZXJDaGFuZ2VUeXBlLlNFQVJDSCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTZWFyY2hDaGFuZ2UoY2hhbmdlLmhlYWRlclR5cGUsIGNoYW5nZS5kZXNjcmlwdGlvbiBhcyBTZWFyY2hDaGFuZ2VEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY2hhbmdlLmRlc2NyaXB0aW9uIGFzIE1vZGVDaGFuZ2VEZXNjcmlwdGlvbikucHJldmlvdXNNb2RlID09PSBIZWFkZXJNb2RlLlNFQVJDSCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NNb2RlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fc2VhcmNoU3ViID1cbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFNlcnZpY2UucHJlZGljYXRlUmVtb3ZlZCQuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuaGFuZGxlUHJlZGljYXRlUmVtb3ZhbChldmVudC5pbmRleCwgZXZlbnQuY2xlYXJJbnB1dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhbGwgdGhlIHByZWRpY2F0ZXMgZnJvbSB0aGUgaGVhZGVycyBpbnRvIHRoZSBzZWFyY2ggaW50ZXJmYWNlIGFuZCBjbGVhcnMgdGhlIGhlYWRlciBpbnB1dHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc01vZGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFkZGVkUHJlZGljYXRlSWRzID0gW107XG4gICAgICAgIHRoaXMuX2NvbHVtblRvQ29uZmlndXJhdGlvbi5mb3JFYWNoKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hTZXJ2aWNlLnJlbW92ZVByZWRpY2F0ZShjb25maWcucHJlZGljYXRlSWQpO1xuXG4gICAgICAgICAgICBsZXQgZWRpdGFibGVDYXRlZ29yeTtcbiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gSGVhZGVyQ29sdW1uVHlwZS5NRVRBKSB7XG4gICAgICAgICAgICAgICAgZWRpdGFibGVDYXRlZ29yeSA9IHRoaXMuX3R5cGVUb0NhdGVnb3J5LmdldChjb25maWcuZmllbGRJZGVudGlmaWVyKS5kdXBsaWNhdGUoKTtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZUNhdGVnb3J5LnNlbGVjdERlZmF1bHRPcGVyYXRvcigpO1xuICAgICAgICAgICAgICAgIGVkaXRhYmxlQ2F0ZWdvcnkuc2V0T3BlcmFuZHMoY29uZmlnLnVzZXJJbnB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzZXQgPSAodGhpcy5fdHlwZVRvQ2F0ZWdvcnkuZ2V0KEhlYWRlckNvbHVtblR5cGUuSU1NRURJQVRFKSBhcyBDYXNlU2ltcGxlRGF0YXNldCk7XG4gICAgICAgICAgICAgICAgZWRpdGFibGVDYXRlZ29yeSA9IGRhdGFzZXQudHJhbnNmb3JtVG9DYXNlRGF0YXNldChjb25maWcuZmllbGRUeXBlLCBjb25maWcuZmllbGRUaXRsZSwgY29uZmlnLnVzZXJJbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRlZFByZWRpY2F0ZUlkcy5wdXNoKHRoaXMuX3NlYXJjaFNlcnZpY2UuYWRkR2VuZXJhdGVkTGVhZlByZWRpY2F0ZShlZGl0YWJsZUNhdGVnb3J5KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3NlYXJjaFNlcnZpY2Uuc2hvdyhhZGRlZFByZWRpY2F0ZUlkcyk7XG5cbiAgICAgICAgdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyB0aGUge0BsaW5rIEhlYWRlckNoYW5nZX0gb2JqZWN0IGludG8gYSBzZWFyY2ggcHJlZGljYXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTZWFyY2hDaGFuZ2UoaGVhZGVyVHlwZTogSGVhZGVyVHlwZSwgY2hhbmdlRGVzY3JpcHRpb246IFNlYXJjaENoYW5nZURlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChoZWFkZXJUeXBlID09PSBIZWFkZXJUeXBlLkNBU0UpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Nhc2VTZWFyY2goY2hhbmdlRGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSBjaGFuZ2Ugb2JqZWN0IGFuZCByZXNvbHZlcyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjYXNlIHNlYXJjaCBwcmVkaWNhdGUgY2hhbmdlXG4gICAgICogQHBhcmFtIGNoYW5nZURlc2NyaXB0aW9uIHRoZSBjaGFuZ2Ugb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDYXNlU2VhcmNoKGNoYW5nZURlc2NyaXB0aW9uOiBTZWFyY2hDaGFuZ2VEZXNjcmlwdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5lbXB0eUlucHV0KGNoYW5nZURlc2NyaXB0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVQcmVkaWNhdGUoY2hhbmdlRGVzY3JpcHRpb24uY29sdW1uSWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlRGVzY3JpcHRpb24udHlwZSA9PT0gSGVhZGVyQ29sdW1uVHlwZS5NRVRBKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDYXNlTWV0YVNlYXJjaChjaGFuZ2VEZXNjcmlwdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDYXNlRGF0YVNlYXJjaChjaGFuZ2VEZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNoYW5nZSBvYmplY3Qgb2YgYSBjYXNlIG1ldGEgaGVhZGVyIGFuZCByZXNvbHZlcyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjYXNlIHNlYXJjaCBwcmVkaWNhdGUgY2hhbmdlXG4gICAgICogQHBhcmFtIGNoYW5nZURlc2NyaXB0aW9uIHRoZSBjaGFuZ2Ugb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDYXNlTWV0YVNlYXJjaChjaGFuZ2VEZXNjcmlwdGlvbjogU2VhcmNoQ2hhbmdlRGVzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgZmllbGRJZGVudGlmaWVyOiBjaGFuZ2VEZXNjcmlwdGlvbi5maWVsZElkZW50aWZpZXIsXG4gICAgICAgICAgICB1c2VySW5wdXQ6IFtjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dF1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLl90eXBlVG9DYXRlZ29yeS5nZXQoY29uZmlnLmZpZWxkSWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZSA9IGNhdGVnb3J5LmdlbmVyYXRlUHJlZGljYXRlKGNvbmZpZy51c2VySW5wdXQpO1xuICAgICAgICB0aGlzLmFkZFByZWRpY2F0ZShjaGFuZ2VEZXNjcmlwdGlvbi5jb2x1bW5JZGVudGlmaWVyLCBwcmVkaWNhdGUsIHtcbiAgICAgICAgICAgIHR5cGU6IEhlYWRlckNvbHVtblR5cGUuTUVUQSxcbiAgICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNoYW5nZSBvYmplY3Qgb2YgYSBjYXNlIGltbWVkaWF0ZSBkYXRhIGhlYWRlciBhbmQgcmVzb2x2ZXMgaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgY2FzZSBzZWFyY2ggcHJlZGljYXRlIGNoYW5nZVxuICAgICAqIEBwYXJhbSBjaGFuZ2VEZXNjcmlwdGlvbiB0aGUgY2hhbmdlIG9iamVjdCB0aGF0IHNob3VsZCBiZSByZXNvbHZlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzQ2FzZURhdGFTZWFyY2goY2hhbmdlRGVzY3JpcHRpb246IFNlYXJjaENoYW5nZURlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTZXJ2aWNlLmdldE5ldChjaGFuZ2VEZXNjcmlwdGlvbi5wZXRyaU5ldElkZW50aWZpZXIpLnN1YnNjcmliZShuZXQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGZpZWxkVHlwZTogY2hhbmdlRGVzY3JpcHRpb24uZmllbGRUeXBlLFxuICAgICAgICAgICAgICAgIGZpZWxkVGl0bGU6IGNoYW5nZURlc2NyaXB0aW9uLmZpZWxkVGl0bGUsXG4gICAgICAgICAgICAgICAgdXNlcklucHV0OiBbY2hhbmdlRGVzY3JpcHRpb24uc2VhcmNoSW5wdXRdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLl90eXBlVG9DYXRlZ29yeS5nZXQoY2hhbmdlRGVzY3JpcHRpb24udHlwZSkgYXMgQ2FzZVNpbXBsZURhdGFzZXQ7XG4gICAgICAgICAgICBjYXRlZ29yeS5jb25maWd1cmUoY2hhbmdlRGVzY3JpcHRpb24uZmllbGRJZGVudGlmaWVyLCBjb25maWcuZmllbGRUeXBlLCBbbmV0LmlkZW50aWZpZXJdKTtcbiAgICAgICAgICAgIGNvbnN0IHByZWRpY2F0ZSA9IGNhdGVnb3J5LmdlbmVyYXRlUHJlZGljYXRlKGNvbmZpZy51c2VySW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5hZGRQcmVkaWNhdGUoY2hhbmdlRGVzY3JpcHRpb24uY29sdW1uSWRlbnRpZmllciwgcHJlZGljYXRlLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogSGVhZGVyQ29sdW1uVHlwZS5JTU1FRElBVEUsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNoYW5nZURlc2NyaXB0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWFyY2ggaGVhZGVyIGNoYW5nZVxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGlucHV0IHdhcyBjbGVhcmVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGVtcHR5SW5wdXQoY2hhbmdlRGVzY3JpcHRpb246IFNlYXJjaENoYW5nZURlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICB8fCBjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dCA9PT0gbnVsbFxuICAgICAgICAgICAgfHwgKHR5cGVvZiBjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dCA9PT0gJ3N0cmluZycgJiYgY2hhbmdlRGVzY3JpcHRpb24uc2VhcmNoSW5wdXQubGVuZ3RoID09PSAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgUHJlZGljYXRlIGZvciBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKiBSZW1vdmVzIGFuIGV4aXN0aW5nIHByZWRpY2F0ZSBmb3IgdGhpcyBjb2x1bW4gaWYgaXQgZXhpc3RzIGFuZCBhZGRzIHRoZSBuZXcgUHJlZGljYXRlLlxuICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIGluZGV4IG9mIHRoZSBoZWFkZXIgY29sdW1uXG4gICAgICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgUHJlZGljYXRlIHRoYXQgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gZGF0YSBuZWNlc3NhcnkgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB7QGxpbmsgQ2F0ZWdvcnl9IHRoYXQgZ2VuZXJhdGVzIHRoZSBhZGRlZCBwcmVkaWNhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkUHJlZGljYXRlKGNvbHVtbjogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiBQcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiBNZXRhR2VuZXJhdG9yQ29uZmlndXJhdGlvbiB8IERhdGFHZW5lcmF0b3JDb25maWd1cmF0aW9uKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVQcmVkaWNhdGUoY29sdW1uLCAhdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uLmhhcyhjb2x1bW4pKTtcbiAgICAgICAgY29uc3QgcHJlZGljYXRlSWQgPSB0aGlzLl9zZWFyY2hTZXJ2aWNlLmFkZFByZWRpY2F0ZShwcmVkaWNhdGUpO1xuICAgICAgICB0aGlzLl9jb2x1bW5Ub0NvbmZpZ3VyYXRpb24uc2V0KGNvbHVtbiwge3ByZWRpY2F0ZUlkLCAuLi5jb25maWd1cmF0aW9ufSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByZWRpY2F0ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwcm92aWRlZCBjb2x1bW5cbiAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRoYXQgY2xlYXJlZCBpdCdzIHNlYXJjaFxuICAgICAqIEBwYXJhbSBjbGVhcklucHV0IHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgaGVhZGVyIHNlYXJjaCBpbnB1dCBzaG91bGQgYmUgY2xlYXJlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW1vdmVQcmVkaWNhdGUoY29sdW1uOiBudW1iZXIsIGNsZWFySW5wdXQgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZUNvbmZpZyA9IHRoaXMuX2NvbHVtblRvQ29uZmlndXJhdGlvbi5nZXQoY29sdW1uKTtcbiAgICAgICAgaWYgKHByZWRpY2F0ZUNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hTZXJ2aWNlLnJlbW92ZVByZWRpY2F0ZShwcmVkaWNhdGVDb25maWcucHJlZGljYXRlSWQsIGNsZWFySW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHJlbW92ZWRJZCB0aGUgaWQgb2YgdGhlIHJlbW92ZWQge0BsaW5rIFByZWRpY2F0ZX1cbiAgICAgKiBAcGFyYW0gY2xlYXJJbnB1dCB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGhlYWRlciBzZWFyY2ggaW5wdXQgc2hvdWxkIGJlIGNsZWFyZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlUHJlZGljYXRlUmVtb3ZhbChyZW1vdmVkSWQ6IG51bWJlciwgY2xlYXJJbnB1dCA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlYWRlclNlcnZpY2UgJiYgY2xlYXJJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyU2VydmljZS5jbGVhckhlYWRlclNlYXJjaChyZW1vdmVkSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbHVtblRvQ29uZmlndXJhdGlvbi5kZWxldGUocmVtb3ZlZElkKTtcbiAgICB9XG59XG4iXX0=