UNPKG

@alfresco/adf-content-services

Version:
170 lines 23.4 kB
/*! * @license * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* eslint-disable @angular-eslint/no-input-rename */ import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core'; import { FavoritesApi } from '@alfresco/js-api'; import { from, forkJoin, of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { AlfrescoApiService } from '../services/alfresco-api.service'; import * as i0 from "@angular/core"; import * as i1 from "../services/alfresco-api.service"; export class NodeFavoriteDirective { get favoritesApi() { this._favoritesApi = this._favoritesApi ?? new FavoritesApi(this.alfrescoApiService.getInstance()); return this._favoritesApi; } onClick() { this.toggleFavorite(); } constructor(alfrescoApiService) { this.alfrescoApiService = alfrescoApiService; this.favorites = []; /** Array of nodes to toggle as favorites. */ this.selection = []; /** Emitted when the favorite setting is complete. */ this.toggle = new EventEmitter(); /** Emitted when the favorite setting fails. */ this.error = new EventEmitter(); } ngOnChanges(changes) { if (!changes.selection.currentValue.length) { this.favorites = []; return; } this.markFavoritesNodes(changes.selection.currentValue); } toggleFavorite() { if (!this.favorites.length) { return; } const every = this.favorites.every((selected) => selected.entry.isFavorite); if (every) { const batch = this.favorites.map((selected) => { // shared files have nodeId const id = selected.entry.nodeId || selected.entry.id; return from(this.favoritesApi.deleteFavorite('-me-', id)); }); forkJoin(batch).subscribe(() => { this.favorites.forEach((selected) => (selected.entry.isFavorite = false)); this.toggle.emit(); }, (error) => this.error.emit(error)); } if (!every) { const notFavorite = this.favorites.filter((node) => !node.entry.isFavorite); const body = notFavorite.map((node) => this.createFavoriteBody(node)); from(this.favoritesApi.createFavorite('-me-', body)).subscribe(() => { notFavorite.forEach((selected) => (selected.entry.isFavorite = true)); this.toggle.emit(); }, (error) => this.error.emit(error)); } } markFavoritesNodes(selection) { if (selection.length <= this.favorites.length) { this.favorites = this.reduce(this.favorites, selection); } const result = this.diff(selection, this.favorites); const batch = this.getProcessBatch(result); forkJoin(batch).subscribe((data) => { this.favorites.push(...data); }); } hasFavorites() { if (this.favorites && !this.favorites.length) { return false; } return this.favorites.every((selected) => selected.entry.isFavorite); } getProcessBatch(selection) { return selection.map((selected) => this.getFavorite(selected)); } getFavorite(selected) { const node = selected.entry; // ACS 6.x with 'isFavorite' include if (node && Object.prototype.hasOwnProperty.call(node, 'isFavorite')) { return of(selected); } // ACS 5.x and 6.x without 'isFavorite' include const { name, isFile, isFolder } = node; const id = node.nodeId || node.id; const promise = this.favoritesApi.getFavorite('-me-', id); return from(promise).pipe(map(() => ({ entry: { id, isFolder, isFile, name, isFavorite: true } })), catchError(() => of({ entry: { id, isFolder, isFile, name, isFavorite: false } }))); } createFavoriteBody(node) { const type = this.getNodeType(node); // shared files have nodeId const id = node.entry['nodeId'] || node.entry.id; return { target: { [type]: { guid: id } } }; } getNodeType(node) { // shared could only be files if (!node.entry.isFile && !node.entry.isFolder) { return 'file'; } return node.entry.isFile ? 'file' : 'folder'; } diff(list, patch) { const ids = patch.map((item) => item.entry.id); return list.filter((item) => (ids.includes(item.entry.id) ? null : item)); } reduce(patch, comparator) { const ids = comparator.map((item) => item.entry.id); return patch.filter((item) => (ids.includes(item.entry.id) ? item : null)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeFavoriteDirective, deps: [{ token: i1.AlfrescoApiService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: NodeFavoriteDirective, isStandalone: true, selector: "[adf-node-favorite]", inputs: { selection: ["adf-node-favorite", "selection"] }, outputs: { toggle: "toggle", error: "error" }, host: { listeners: { "click": "onClick()" } }, exportAs: ["adfFavorite"], usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeFavoriteDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[adf-node-favorite]', exportAs: 'adfFavorite' }] }], ctorParameters: () => [{ type: i1.AlfrescoApiService }], propDecorators: { selection: [{ type: Input, args: ['adf-node-favorite'] }], toggle: [{ type: Output }], error: [{ type: Output }], onClick: [{ type: HostListener, args: ['click'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1mYXZvcml0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL2RpcmVjdGl2ZXMvbm9kZS1mYXZvcml0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsb0RBQW9EO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQW9FLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xILE9BQU8sRUFBYyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7QUFPdEUsTUFBTSxPQUFPLHFCQUFxQjtJQUk5QixJQUFJLFlBQVk7UUFDWixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFhRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxZQUFvQixrQkFBc0M7UUFBdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQXZCMUQsY0FBUyxHQUFVLEVBQUUsQ0FBQztRQVF0Qiw2Q0FBNkM7UUFFN0MsY0FBUyxHQUFnQixFQUFFLENBQUM7UUFFNUIscURBQXFEO1FBQzNDLFdBQU0sR0FBRyxJQUFJLFlBQVks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USxFQUFFLHFCQUFxQjtvQkFDL0IsUUFBUSxFQUFFLGFBQWE7aUJBQzFCO3VGQVlHLFNBQVM7c0JBRFIsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBSWhCLE1BQU07c0JBQWYsTUFBTTtnQkFHRyxLQUFLO3NCQUFkLE1BQU07Z0JBR1AsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWUgKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGYXZvcml0ZUJvZHlDcmVhdGUsIE5vZGVFbnRyeSwgU2hhcmVkTGlua0VudHJ5LCBOb2RlLCBTaGFyZWRMaW5rLCBGYXZvcml0ZXNBcGkgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxmcmVzY29BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWxmcmVzY28tYXBpLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnW2FkZi1ub2RlLWZhdm9yaXRlXScsXG4gICAgZXhwb3J0QXM6ICdhZGZGYXZvcml0ZSdcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUZhdm9yaXRlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBmYXZvcml0ZXM6IGFueVtdID0gW107XG5cbiAgICBwcml2YXRlIF9mYXZvcml0ZXNBcGk6IEZhdm9yaXRlc0FwaTtcbiAgICBnZXQgZmF2b3JpdGVzQXBpKCk6IEZhdm9yaXRlc0FwaSB7XG4gICAgICAgIHRoaXMuX2Zhdm9yaXRlc0FwaSA9IHRoaXMuX2Zhdm9yaXRlc0FwaSA/PyBuZXcgRmF2b3JpdGVzQXBpKHRoaXMuYWxmcmVzY29BcGlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZmF2b3JpdGVzQXBpO1xuICAgIH1cblxuICAgIC8qKiBBcnJheSBvZiBub2RlcyB0byB0b2dnbGUgYXMgZmF2b3JpdGVzLiAqL1xuICAgIEBJbnB1dCgnYWRmLW5vZGUtZmF2b3JpdGUnKVxuICAgIHNlbGVjdGlvbjogTm9kZUVudHJ5W10gPSBbXTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIGZhdm9yaXRlIHNldHRpbmcgaXMgY29tcGxldGUuICovXG4gICAgQE91dHB1dCgpIHRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZmF2b3JpdGUgc2V0dGluZyBmYWlscy4gKi9cbiAgICBAT3V0cHV0KCkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcbiAgICBvbkNsaWNrKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUZhdm9yaXRlKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhbGZyZXNjb0FwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSkge31cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCFjaGFuZ2VzLnNlbGVjdGlvbi5jdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZhdm9yaXRlcyA9IFtdO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1hcmtGYXZvcml0ZXNOb2RlcyhjaGFuZ2VzLnNlbGVjdGlvbi5jdXJyZW50VmFsdWUpO1xuICAgIH1cblxuICAgIHRvZ2dsZUZhdm9yaXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmF2b3JpdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlcnkgPSB0aGlzLmZhdm9yaXRlcy5ldmVyeSgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkLmVudHJ5LmlzRmF2b3JpdGUpO1xuXG4gICAgICAgIGlmIChldmVyeSkge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmZhdm9yaXRlcy5tYXAoKHNlbGVjdGVkOiBOb2RlRW50cnkgfCBTaGFyZWRMaW5rRW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaGFyZWQgZmlsZXMgaGF2ZSBub2RlSWRcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IChzZWxlY3RlZCBhcyBTaGFyZWRMaW5rRW50cnkpLmVudHJ5Lm5vZGVJZCB8fCBzZWxlY3RlZC5lbnRyeS5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuZmF2b3JpdGVzQXBpLmRlbGV0ZUZhdm9yaXRlKCctbWUtJywgaWQpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3JrSm9pbihiYXRjaCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYXZvcml0ZXMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IChzZWxlY3RlZC5lbnRyeS5pc0Zhdm9yaXRlID0gZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUuZW1pdCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB0aGlzLmVycm9yLmVtaXQoZXJyb3IpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFldmVyeSkge1xuICAgICAgICAgICAgY29uc3Qgbm90RmF2b3JpdGUgPSB0aGlzLmZhdm9yaXRlcy5maWx0ZXIoKG5vZGUpID0+ICFub2RlLmVudHJ5LmlzRmF2b3JpdGUpO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IG5vdEZhdm9yaXRlLm1hcCgobm9kZSkgPT4gdGhpcy5jcmVhdGVGYXZvcml0ZUJvZHkobm9kZSkpO1xuXG4gICAgICAgICAgICBmcm9tKHRoaXMuZmF2b3JpdGVzQXBpLmNyZWF0ZUZhdm9yaXRlKCctbWUtJywgYm9keSBhcyBhbnkpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBub3RGYXZvcml0ZS5mb3JFYWNoKChzZWxlY3RlZCkgPT4gKHNlbGVjdGVkLmVudHJ5LmlzRmF2b3JpdGUgPSB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4gdGhpcy5lcnJvci5lbWl0KGVycm9yKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1hcmtGYXZvcml0ZXNOb2RlcyhzZWxlY3Rpb246IE5vZGVFbnRyeVtdKSB7XG4gICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoIDw9IHRoaXMuZmF2b3JpdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mYXZvcml0ZXMgPSB0aGlzLnJlZHVjZSh0aGlzLmZhdm9yaXRlcywgc2VsZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGlmZihzZWxlY3Rpb24sIHRoaXMuZmF2b3JpdGVzKTtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmdldFByb2Nlc3NCYXRjaChyZXN1bHQpO1xuXG4gICAgICAgIGZvcmtKb2luKGJhdGNoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmF2b3JpdGVzLnB1c2goLi4uZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhc0Zhdm9yaXRlcygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZmF2b3JpdGVzICYmICF0aGlzLmZhdm9yaXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZhdm9yaXRlcy5ldmVyeSgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkLmVudHJ5LmlzRmF2b3JpdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0JhdGNoKHNlbGVjdGlvbjogTm9kZUVudHJ5W10pOiBPYnNlcnZhYmxlPGFueT5bXSB7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24ubWFwKChzZWxlY3RlZCkgPT4gdGhpcy5nZXRGYXZvcml0ZShzZWxlY3RlZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmF2b3JpdGUoc2VsZWN0ZWQ6IE5vZGVFbnRyeSB8IFNoYXJlZExpbmtFbnRyeSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgfCBTaGFyZWRMaW5rID0gc2VsZWN0ZWQuZW50cnk7XG5cbiAgICAgICAgLy8gQUNTIDYueCB3aXRoICdpc0Zhdm9yaXRlJyBpbmNsdWRlXG4gICAgICAgIGlmIChub2RlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCAnaXNGYXZvcml0ZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yoc2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUNTIDUueCBhbmQgNi54IHdpdGhvdXQgJ2lzRmF2b3JpdGUnIGluY2x1ZGVcbiAgICAgICAgY29uc3QgeyBuYW1lLCBpc0ZpbGUsIGlzRm9sZGVyIH0gPSBub2RlIGFzIE5vZGU7XG4gICAgICAgIGNvbnN0IGlkID0gKG5vZGUgYXMgU2hhcmVkTGluaykubm9kZUlkIHx8IG5vZGUuaWQ7XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZmF2b3JpdGVzQXBpLmdldEZhdm9yaXRlKCctbWUtJywgaWQpO1xuXG4gICAgICAgIHJldHVybiBmcm9tKHByb21pc2UpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBlbnRyeToge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgaXNGb2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIGlzRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaXNGYXZvcml0ZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgICAgICAgICBvZih7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9sZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRmF2b3JpdGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRmF2b3JpdGVCb2R5KG5vZGU6IE5vZGVFbnRyeSk6IEZhdm9yaXRlQm9keUNyZWF0ZSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKG5vZGUpO1xuICAgICAgICAvLyBzaGFyZWQgZmlsZXMgaGF2ZSBub2RlSWRcbiAgICAgICAgY29uc3QgaWQgPSBub2RlLmVudHJ5Wydub2RlSWQnXSB8fCBub2RlLmVudHJ5LmlkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBbdHlwZV06IHtcbiAgICAgICAgICAgICAgICAgICAgZ3VpZDogaWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlVHlwZShub2RlOiBOb2RlRW50cnkpOiBzdHJpbmcge1xuICAgICAgICAvLyBzaGFyZWQgY291bGQgb25seSBiZSBmaWxlc1xuICAgICAgICBpZiAoIW5vZGUuZW50cnkuaXNGaWxlICYmICFub2RlLmVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGUuZW50cnkuaXNGaWxlID8gJ2ZpbGUnIDogJ2ZvbGRlcic7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaWZmKGxpc3Q6IE5vZGVFbnRyeVtdLCBwYXRjaDogYW55W10pOiBOb2RlRW50cnlbXSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHBhdGNoLm1hcCgoaXRlbSkgPT4gaXRlbS5lbnRyeS5pZCk7XG5cbiAgICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpdGVtKSA9PiAoaWRzLmluY2x1ZGVzKGl0ZW0uZW50cnkuaWQpID8gbnVsbCA6IGl0ZW0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZHVjZShwYXRjaDogYW55W10sIGNvbXBhcmF0b3I6IE5vZGVFbnRyeVtdKTogYW55W10ge1xuICAgICAgICBjb25zdCBpZHMgPSBjb21wYXJhdG9yLm1hcCgoaXRlbSkgPT4gaXRlbS5lbnRyeS5pZCk7XG5cbiAgICAgICAgcmV0dXJuIHBhdGNoLmZpbHRlcigoaXRlbSkgPT4gKGlkcy5pbmNsdWRlcyhpdGVtLmVudHJ5LmlkKSA/IGl0ZW0gOiBudWxsKSk7XG4gICAgfVxufVxuIl19