UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

136 lines 20.5 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { DataSource } from "@angular/cdk/collections"; import { Injectable } from "@angular/core"; import _cloneDeep from "lodash/cloneDeep"; import _forEach from "lodash/forEach"; import isEqual from "lodash/isEqual"; import isNil from "lodash/isNil"; import { BehaviorSubject, Subject } from "rxjs"; import * as i0 from "@angular/core"; // eslint-disable-next-line @typescript-eslint/no-unused-vars export class DataSourceService extends DataSource { constructor() { super(); // in future dataSource in cdk may have some constructor. this.dataSubject = new BehaviorSubject([]); // in general we do not have data at this point - that's why empty array this.outputsSubject = new Subject(); // some empty state this.dataFieldsConfig = { dataFields$: new BehaviorSubject([]), }; } set componentTree(components) { this._components = components; } registerComponent(components) { this._components = { ...this._components, ...components, }; } deregisterComponent(componentKey) { delete this._components?.[componentKey]; } connect(collectionViewer) { return this.dataSubject.asObservable(); } disconnect(collectionViewer) { this.dataSubject.complete(); } async applyFilters() { // store a copy of the filters to avoid altering the stored values by reference const filters = _cloneDeep(this.getFilters()); this.beforeApplyFilters(filters); await this.afterApplyFilters(filters); } getFilter(componentName) { const filter = this._components[componentName]; if (!filter) { throw new Error(`Invalid filter name '${componentName}' requested; available filter names are: ${Object.keys(this._components)}`); } return filter?.componentInstance?.getFilters(); } getFilters() { const filters = {}; // Merge current filters _forEach(this._components, (node, componentName) => { filters[componentName] = this.getFilter(componentName); }); return filters; } get monitoredFilters() { const filters = []; _forEach(this._components, (node, componentName) => { if (node.componentInstance?.detectFilterChanges === true) { filters.push(componentName); } }); return filters; } // check if a specific filter changed filterChanged(filterName, currentFilterValue) { // retrieve provided value if provided, otherwise get a fresh one const filterValue = (currentFilterValue ?? this.getFilter(filterName)) ?.value; return (!isNil(filterValue) && this._previousFilters && !isEqual(filterValue, this._previousFilters[filterName]?.value)); } // checks if any of the filters specified by name have changed from the previous evaluation filtersChanged(filters, ...filterNames) { for (let i = 0; i < filterNames.length; i++) { const filterName = filterNames[i]; if (this.filterChanged(filterName, filters[filterName])) { return true; } } return false; } computeFiltersChange(filters) { return this.filtersChanged(filters, ...this.monitoredFilters); } beforeApplyFilters(filters) { } async afterApplyFilters(filters) { this.outputsSubject.next(await this.getFilteredData(filters)); this._previousFilters = this.getFilters(); } shouldResetFilters(filters) { const filtersChanged = this.computeFiltersChange(filters); if (filtersChanged) { this.resetFilters(filters); } return filtersChanged; } resetFilters(filters) { _forEach(filters, (node, key) => { const filter = this._components[key].componentInstance; if (filter?.resetFilter) { filter.resetFilter(); node.value = filter.getFilters().value; } }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceService, decorators: [{ type: Injectable }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9kYXRhLXNvdXJjZS9kYXRhLXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQW9CLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQWE1RCw2REFBNkQ7QUFDN0QsTUFBTSxPQUFnQixpQkFJcEIsU0FBUSxVQUFhO0lBU25CO1FBQ0ksS0FBSyxFQUFFLENBQUMsQ0FBQyx5REFBeUQ7UUFDbEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLHdFQUF3RTtRQUN6SCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUMsQ0FBQyxtQkFBbUI7UUFDN0QsSUFBSSxDQUFDLGdCQUFnQixHQUFH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Q0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztZQUN2RCxJQUFJLE1BQU0sRUFBRSxXQUFXLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQzFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQXZLaUIsaUJBQWlCO21IQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRnRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXdlciwgRGF0YVNvdXJjZSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IF9jbG9uZURlZXAgZnJvbSBcImxvZGFzaC9jbG9uZURlZXBcIjtcbmltcG9ydCBfZm9yRWFjaCBmcm9tIFwibG9kYXNoL2ZvckVhY2hcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJsb2Rhc2gvaXNFcXVhbFwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7XG4gICAgSURhdGFGaWVsZCxcbiAgICBJRGF0YUZpZWxkc0NvbmZpZyxcbiAgICBJRmlsdGVyLFxuICAgIElGaWx0ZXJpbmdPdXRwdXRzLFxuICAgIElGaWx0ZXJpbmdQYXJ0aWNpcGFudCxcbiAgICBJRmlsdGVyaW5nUGFydGljaXBhbnRzLFxuICAgIElGaWx0ZXJzLFxufSBmcm9tIFwiLi9wdWJsaWMtYXBpXCI7XG5cbkBJbmplY3RhYmxlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhU291cmNlU2VydmljZTxcbiAgICBULFxuICAgIEYgZXh0ZW5kcyBJRmlsdGVycyA9IElGaWx0ZXJzLFxuICAgIEQgPSBhbnlcbj4gZXh0ZW5kcyBEYXRhU291cmNlPFQ+IHtcbiAgICBwdWJsaWMgZGF0YVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxUW10+O1xuICAgIHB1YmxpYyBvdXRwdXRzU3ViamVjdDogU3ViamVjdDxJRmlsdGVyaW5nT3V0cHV0cz47XG4gICAgcHVibGljIGRhdGFGaWVsZHNDb25maWc6IElEYXRhRmllbGRzQ29uZmlnO1xuXG4gICAgcHJvdGVjdGVkIF9wcmV2aW91c0ZpbHRlcnM6IEY7XG5cbiAgICBwcm90ZWN0ZWQgX2NvbXBvbmVudHM6IElGaWx0ZXJpbmdQYXJ0aWNpcGFudHM7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTsgLy8gaW4gZnV0dXJlIGRhdGFTb3VyY2UgaW4gY2RrIG1heSBoYXZlIHNvbWUgY29uc3RydWN0b3IuXG4gICAgICAgIHRoaXMuZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pOyAvLyBpbiBnZW5lcmFsIHdlIGRvIG5vdCBoYXZlIGRhdGEgYXQgdGhpcyBwb2ludCAtIHRoYXQncyB3aHkgZW1wdHkgYXJyYXlcbiAgICAgICAgdGhpcy5vdXRwdXRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTsgLy8gc29tZSBlbXB0eSBzdGF0ZVxuICAgICAgICB0aGlzLmRhdGFGaWVsZHNDb25maWcgPSB7XG4gICAgICAgICAgICBkYXRhRmllbGRzJDogbmV3IEJlaGF2aW9yU3ViamVjdDxJRGF0YUZpZWxkW10+KFtdKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvbXBvbmVudFRyZWUoY29tcG9uZW50czogSUZpbHRlcmluZ1BhcnRpY2lwYW50cykge1xuICAgICAgICB0aGlzLl9jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50czogSUZpbHRlcmluZ1BhcnRpY2lwYW50cyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb21wb25lbnRzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fY29tcG9uZW50cyxcbiAgICAgICAgICAgIC4uLmNvbXBvbmVudHMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGRlcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBvbmVudHM/Lltjb21wb25lbnRLZXldO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRGaWx0ZXJlZERhdGEoZmlsdGVyczogRik6IFByb21pc2U8SUZpbHRlcmluZ091dHB1dHM+O1xuXG4gICAgcHVibGljIGNvbm5lY3QoXG4gICAgICAgIGNvbGxlY3Rpb25WaWV3ZXI6IENvbGxlY3Rpb25WaWV3ZXJcbiAgICApOiBPYnNlcnZhYmxlPFRbXSB8IFJlYWRvbmx5QXJyYXk8VD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGFTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBmaWx0ZXJzIHRvIGF2b2lkIGFsdGVyaW5nIHRoZSBzdG9yZWQgdmFsdWVzIGJ5IHJlZmVyZW5jZVxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gX2Nsb25lRGVlcCh0aGlzLmdldEZpbHRlcnMoKSk7XG5cbiAgICAgICAgdGhpcy5iZWZvcmVBcHBseUZpbHRlcnMoZmlsdGVycyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJBcHBseUZpbHRlcnMoZmlsdGVycyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbHRlcihcbiAgICAgICAgY29tcG9uZW50TmFtZToga2V5b2YgSUZpbHRlcmluZ1BhcnRpY2lwYW50c1xuICAgICk6IEYgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9jb21wb25lbnRzW2NvbXBvbmVudE5hbWVdO1xuICAgICAgICBpZiAoIWZpbHRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIGZpbHRlciBuYW1lICcke2NvbXBvbmVudE5hbWV9JyByZXF1ZXN0ZWQ7IGF2YWlsYWJsZSBmaWx0ZXIgbmFtZXMgYXJlOiAke09iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzXG4gICAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcj8uY29tcG9uZW50SW5zdGFuY2U/LmdldEZpbHRlcnMoKSBhcyBGO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWx0ZXJzKCk6IEYge1xuICAgICAgICBjb25zdCBmaWx0ZXJzOiBGID0ge30gYXMgRjtcblxuICAgICAgICAvLyBNZXJnZSBjdXJyZW50IGZpbHRlcnNcbiAgICAgICAgX2ZvckVhY2goXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzLFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIG5vZGU6IElGaWx0ZXJpbmdQYXJ0aWNpcGFudCxcbiAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lOiBrZXlvZiBJRmlsdGVyaW5nUGFydGljaXBhbnRzXG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAoZmlsdGVycyBhcyBJRmlsdGVycylbY29tcG9uZW50TmFtZV0gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZpbHRlcihjb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vbml0b3JlZEZpbHRlcnMoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIF9mb3JFYWNoKFxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50cyxcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBub2RlOiBJRmlsdGVyaW5nUGFydGljaXBhbnQsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZToga2V5b2YgSUZpbHRlcmluZ1BhcnRpY2lwYW50c1xuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuY29tcG9uZW50SW5zdGFuY2U/LmRldGVjdEZpbHRlckNoYW5nZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKGNvbXBvbmVudE5hbWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcnM7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgYSBzcGVjaWZpYyBmaWx0ZXIgY2hhbmdlZFxuICAgIHB1YmxpYyBmaWx0ZXJDaGFuZ2VkKFxuICAgICAgICBmaWx0ZXJOYW1lOiBrZXlvZiBJRmlsdGVyaW5nUGFydGljaXBhbnRzLFxuICAgICAgICBjdXJyZW50RmlsdGVyVmFsdWU/OiBJRmlsdGVyPGFueT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgLy8gcmV0cmlldmUgcHJvdmlkZWQgdmFsdWUgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBnZXQgYSBmcmVzaCBvbmVcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSAoY3VycmVudEZpbHRlclZhbHVlID8/IHRoaXMuZ2V0RmlsdGVyKGZpbHRlck5hbWUpKVxuICAgICAgICAgICAgPy52YWx1ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICFpc05pbChmaWx0ZXJWYWx1ZSkgJiZcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzRmlsdGVycyAmJlxuICAgICAgICAgICAgIWlzRXF1YWwoZmlsdGVyVmFsdWUsIHRoaXMuX3ByZXZpb3VzRmlsdGVyc1tmaWx0ZXJOYW1lXT8udmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2tzIGlmIGFueSBvZiB0aGUgZmlsdGVycyBzcGVjaWZpZWQgYnkgbmFtZSBoYXZlIGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgZXZhbHVhdGlvblxuICAgIHB1YmxpYyBmaWx0ZXJzQ2hhbmdlZChcbiAgICAgICAgZmlsdGVyczogRixcbiAgICAgICAgLi4uZmlsdGVyTmFtZXM6IChrZXlvZiBJRmlsdGVyaW5nUGFydGljaXBhbnRzKVtdXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlck5hbWUgPSBmaWx0ZXJOYW1lc1tpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlckNoYW5nZWQoZmlsdGVyTmFtZSwgZmlsdGVyc1tmaWx0ZXJOYW1lXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcHV0ZUZpbHRlcnNDaGFuZ2UoZmlsdGVyczogRik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzQ2hhbmdlZChmaWx0ZXJzLCAuLi50aGlzLm1vbml0b3JlZEZpbHRlcnMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBiZWZvcmVBcHBseUZpbHRlcnMoZmlsdGVyczogRik6IHZvaWQge31cblxuICAgIHByb3RlY3RlZCBhc3luYyBhZnRlckFwcGx5RmlsdGVycyhmaWx0ZXJzOiBGKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub3V0cHV0c1N1YmplY3QubmV4dChhd2FpdCB0aGlzLmdldEZpbHRlcmVkRGF0YShmaWx0ZXJzKSk7XG5cbiAgICAgICAgdGhpcy5fcHJldmlvdXNGaWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNob3VsZFJlc2V0RmlsdGVycyhmaWx0ZXJzOiBGKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNDaGFuZ2VkID0gdGhpcy5jb21wdXRlRmlsdGVyc0NoYW5nZShmaWx0ZXJzKTtcbiAgICAgICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJzQ2hhbmdlZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzZXRGaWx0ZXJzKGZpbHRlcnM6IEYpOiB2b2lkIHtcbiAgICAgICAgX2ZvckVhY2goZmlsdGVycywgKG5vZGUsIGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5fY29tcG9uZW50c1trZXldLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICAgICAgaWYgKGZpbHRlcj8ucmVzZXRGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIucmVzZXRGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gZmlsdGVyLmdldEZpbHRlcnMoKS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19