@alfresco/adf-content-services
Version:
Alfresco ADF content services
134 lines • 17.2 kB
JavaScript
/*!
* @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.
*/
import { Injectable } from '@angular/core';
import { DataSource } from '@angular/cdk/collections';
import { FlatTreeControl } from '@angular/cdk/tree';
import { BehaviorSubject } from 'rxjs';
import * as i0 from "@angular/core";
export class TreeService extends DataSource {
get treeNodes() {
return this.treeControl.dataNodes;
}
set treeNodes(nodes) {
this.treeControl.dataNodes = nodes;
this.treeNodesSource.next(nodes);
}
constructor() {
super();
this.treeNodesSource = new BehaviorSubject([]);
this.treeControl = new FlatTreeControl((node) => node.level, (node) => node.hasChildren);
this.treeNodes = [];
}
/**
* Expands node applying subnodes to it.
*
* @param nodeToExpand Node to be expanded
* @param subNodes List of nodes that will be added as children of expanded node
*/
expandNode(nodeToExpand, subNodes) {
if (nodeToExpand != null && subNodes != null && nodeToExpand.hasChildren) {
this.treeControl.expand(nodeToExpand);
const index = this.treeNodes.indexOf(nodeToExpand);
this.treeNodes.splice(index + 1, 0, ...subNodes);
nodeToExpand.isLoading = false;
this.treeNodesSource.next(this.treeNodes);
}
}
/**
* Collapses a node removing all children from it.
*
* @param nodeToCollapse Node to be collapsed
*/
collapseNode(nodeToCollapse) {
if (nodeToCollapse?.hasChildren) {
this.treeControl.collapse(nodeToCollapse);
const children = this.treeNodes.filter((node) => nodeToCollapse.id === node.parentId);
children.forEach((child) => {
this.collapseInnerNode(child);
});
this.treeNodesSource.next(this.treeNodes);
}
}
/**
* Append more child nodes to already expanded parent node
*
* @param nodeToAppend Expanded parent node
* @param subNodes List of nodes that will be added as children of expanded node
*/
appendNodes(nodeToAppend, subNodes) {
if (nodeToAppend != null && subNodes != null) {
const lastChild = this.treeNodes.filter((treeNode) => nodeToAppend.id === treeNode.parentId).pop();
const index = this.treeNodes.indexOf(lastChild);
const children = this.treeControl.getDescendants(lastChild).length;
this.treeNodes.splice(index + children + 1, 0, ...subNodes);
nodeToAppend.isLoading = false;
this.treeNodesSource.next(this.treeNodes);
}
}
/**
* Removes provided node from the tree
*
* @param node Node to be removed
*/
removeNode(node) {
this.treeNodes.splice(this.treeNodes.indexOf(node), 1);
}
/**
* Gets children of the node
*
* @param parentNode Parent node
* @returns children of parent node
*/
getChildren(parentNode) {
return this.treeNodes.filter((treeNode) => treeNode.parentId === parentNode.id);
}
/**
* Checks if tree is empty
*
* @returns boolean
*/
isEmpty() {
return !this.treeNodes.length;
}
/**
* Gets parent node of given node. If node with parentNodeId is not found it returns undefined.
*
* @param parentNodeId Id of a parent node to be found
* @returns parent node or undefined when not found
*/
getParentNode(parentNodeId) {
return this.treeNodes.find((treeNode) => treeNode.id === parentNodeId);
}
connect() {
return this.treeNodesSource.asObservable();
}
disconnect() { }
collapseInnerNode(nodeToCollapse) {
const index = this.treeNodes.indexOf(nodeToCollapse);
this.treeNodes.splice(index, 1);
if (nodeToCollapse.hasChildren) {
this.treeNodes.filter((node) => nodeToCollapse.id === node.parentId).forEach((child) => this.collapseInnerNode(child));
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi90cmVlL3NlcnZpY2VzL3RyZWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFLbkQsTUFBTSxPQUFnQixXQUFnQyxTQUFRLFVBQWE7SUFJdkUsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBVTtRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEO1FBQ0ksS0FBSyxFQUFFLENBQUM7UUFaTCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBYWxELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQ2xDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUNwQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FDN0IsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFJRDs7Ozs7T0FLRztJQUNJLFVBQVUsQ0FBQyxZQUFlLEVBQUUsUUFBYTtRQUM1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Ozs7T0FLRztJQUNJLGFBQWEsQ0FBQyxZQUFvQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBVyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFTSxVQUFVLEtBQVUsQ0FBQztJQUVwQixpQkFBaUIsQ0FBQyxjQUFpQjtRQUN2QyxNQUFNLEtBQUssR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFPLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakksQ0FBQztJQUNMLENBQUM7OEdBM0hpQixXQUFXO2tIQUFYLFdBQVcsY0FEUCxNQUFNOzsyRkFDVixXQUFXO2tCQURoQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi4vbW9kZWxzL3RyZWUtbm9kZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVHJlZVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3RyZWUtcmVzcG9uc2UuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmVlU2VydmljZTxUIGV4dGVuZHMgVHJlZU5vZGU+IGV4dGVuZHMgRGF0YVNvdXJjZTxUPiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHRyZWVDb250cm9sOiBGbGF0VHJlZUNvbnRyb2w8VD47XG4gICAgcHVibGljIHRyZWVOb2Rlc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VFtdPihbXSk7XG5cbiAgICBnZXQgdHJlZU5vZGVzKCk6IFRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2RlcztcbiAgICB9XG5cbiAgICBzZXQgdHJlZU5vZGVzKG5vZGVzOiBUW10pIHtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy50cmVlTm9kZXNTb3VyY2UubmV4dChub2Rlcyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPFQ+KFxuICAgICAgICAgICAgKG5vZGUpID0+IG5vZGUubGV2ZWwsXG4gICAgICAgICAgICAobm9kZSkgPT4gbm9kZS5oYXNDaGlsZHJlblxuICAgICAgICApO1xuICAgICAgICB0aGlzLnRyZWVOb2RlcyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRTdWJOb2RlcyhwYXJlbnROb2RlSWQ6IHN0cmluZywgc2tpcENvdW50PzogbnVtYmVyLCBtYXhJdGVtcz86IG51bWJlciwgc2VhcmNoVGVybT86IHN0cmluZyk6IE9ic2VydmFibGU8VHJlZVJlc3BvbnNlPFQ+PjtcblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgbm9kZSBhcHBseWluZyBzdWJub2RlcyB0byBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlVG9FeHBhbmQgTm9kZSB0byBiZSBleHBhbmRlZFxuICAgICAqIEBwYXJhbSBzdWJOb2RlcyBMaXN0IG9mIG5vZGVzIHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBjaGlsZHJlbiBvZiBleHBhbmRlZCBub2RlXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZE5vZGUobm9kZVRvRXhwYW5kOiBULCBzdWJOb2RlczogVFtdKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlVG9FeHBhbmQgIT0gbnVsbCAmJiBzdWJOb2RlcyAhPSBudWxsICYmIG5vZGVUb0V4cGFuZC5oYXNDaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZVRvRXhwYW5kKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLnRyZWVOb2Rlcy5pbmRleE9mKG5vZGVUb0V4cGFuZCk7XG4gICAgICAgICAgICB0aGlzLnRyZWVOb2Rlcy5zcGxpY2UoaW5kZXggKyAxLCAwLCAuLi5zdWJOb2Rlcyk7XG4gICAgICAgICAgICBub2RlVG9FeHBhbmQuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRyZWVOb2Rlc1NvdXJjZS5uZXh0KHRoaXMudHJlZU5vZGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyBhIG5vZGUgcmVtb3ZpbmcgYWxsIGNoaWxkcmVuIGZyb20gaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZVRvQ29sbGFwc2UgTm9kZSB0byBiZSBjb2xsYXBzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VOb2RlKG5vZGVUb0NvbGxhcHNlOiBUKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlVG9Db2xsYXBzZT8uaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2Uobm9kZVRvQ29sbGFwc2UpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW46IFRbXSA9IHRoaXMudHJlZU5vZGVzLmZpbHRlcigobm9kZTogVCkgPT4gbm9kZVRvQ29sbGFwc2UuaWQgPT09IG5vZGUucGFyZW50SWQpO1xuICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlSW5uZXJOb2RlKGNoaWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50cmVlTm9kZXNTb3VyY2UubmV4dCh0aGlzLnRyZWVOb2Rlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmQgbW9yZSBjaGlsZCBub2RlcyB0byBhbHJlYWR5IGV4cGFuZGVkIHBhcmVudCBub2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZVRvQXBwZW5kIEV4cGFuZGVkIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHN1Yk5vZGVzIExpc3Qgb2Ygbm9kZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGNoaWxkcmVuIG9mIGV4cGFuZGVkIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwZW5kTm9kZXMobm9kZVRvQXBwZW5kOiBULCBzdWJOb2RlczogVFtdKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlVG9BcHBlbmQgIT0gbnVsbCAmJiBzdWJOb2RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0Q2hpbGQ6IFQgPSB0aGlzLnRyZWVOb2Rlcy5maWx0ZXIoKHRyZWVOb2RlOiBUKSA9PiBub2RlVG9BcHBlbmQuaWQgPT09IHRyZWVOb2RlLnBhcmVudElkKS5wb3AoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLnRyZWVOb2Rlcy5pbmRleE9mKGxhc3RDaGlsZCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbjogbnVtYmVyID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhsYXN0Q2hpbGQpLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMudHJlZU5vZGVzLnNwbGljZShpbmRleCArIGNoaWxkcmVuICsgMSwgMCwgLi4uc3ViTm9kZXMpO1xuICAgICAgICAgICAgbm9kZVRvQXBwZW5kLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50cmVlTm9kZXNTb3VyY2UubmV4dCh0aGlzLnRyZWVOb2Rlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHByb3ZpZGVkIG5vZGUgZnJvbSB0aGUgdHJlZVxuICAgICAqXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBiZSByZW1vdmVkXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZU5vZGUobm9kZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyZWVOb2Rlcy5zcGxpY2UodGhpcy50cmVlTm9kZXMuaW5kZXhPZihub2RlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmVudE5vZGUgUGFyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBjaGlsZHJlbiBvZiBwYXJlbnQgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDaGlsZHJlbihwYXJlbnROb2RlOiBUKTogVFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVzLmZpbHRlcigodHJlZU5vZGU6IFQpID0+IHRyZWVOb2RlLnBhcmVudElkID09PSBwYXJlbnROb2RlLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdHJlZSBpcyBlbXB0eVxuICAgICAqXG4gICAgICogQHJldHVybnMgYm9vbGVhblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudHJlZU5vZGVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHBhcmVudCBub2RlIG9mIGdpdmVuIG5vZGUuIElmIG5vZGUgd2l0aCBwYXJlbnROb2RlSWQgaXMgbm90IGZvdW5kIGl0IHJldHVybnMgdW5kZWZpbmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmVudE5vZGVJZCBJZCBvZiBhIHBhcmVudCBub2RlIHRvIGJlIGZvdW5kXG4gICAgICogQHJldHVybnMgcGFyZW50IG5vZGUgb3IgdW5kZWZpbmVkIHdoZW4gbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmVudE5vZGUocGFyZW50Tm9kZUlkOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVzLmZpbmQoKHRyZWVOb2RlOiBUKSA9PiB0cmVlTm9kZS5pZCA9PT0gcGFyZW50Tm9kZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlTm9kZXNTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7fVxuXG4gICAgcHJpdmF0ZSBjb2xsYXBzZUlubmVyTm9kZShub2RlVG9Db2xsYXBzZTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy50cmVlTm9kZXMuaW5kZXhPZihub2RlVG9Db2xsYXBzZSk7XG4gICAgICAgIHRoaXMudHJlZU5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGlmIChub2RlVG9Db2xsYXBzZS5oYXNDaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy50cmVlTm9kZXMuZmlsdGVyKChub2RlOiBUKSA9PiBub2RlVG9Db2xsYXBzZS5pZCA9PT0gbm9kZS5wYXJlbnRJZCkuZm9yRWFjaCgoY2hpbGQ6IFQpID0+IHRoaXMuY29sbGFwc2VJbm5lck5vZGUoY2hpbGQpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==