UNPKG

family-hierarchy

Version:

A small library for **Angular 9+** that implements [vis-network](https://github.com/visjs/vis-network) to generate a hierarchy chart of a family.

198 lines 26.9 kB
import { __decorate } from "tslib"; import { Injectable } from '@angular/core'; import { Subject, BehaviorSubject } from 'rxjs'; import { DataSet } from 'vis-network/standalone'; import { DEFAULT_CONFIG } from '../config/default'; import { isObject } from 'util'; import * as i0 from "@angular/core"; /* tslint:disable */ let FamilyHierarchyService = class FamilyHierarchyService { constructor() { this.currentEdges = new BehaviorSubject(new DataSet()); this._Edges = this.currentEdges.asObservable(); this.currentNodes = new BehaviorSubject(new DataSet()); this._Nodes = this.currentNodes.asObservable(); this.currentFhNodes = new BehaviorSubject([]); this._fhNodes = this.currentFhNodes.asObservable(); this.currentFhUnions = new BehaviorSubject([]); this._fhUnions = this.currentFhUnions.asObservable(); this.currentFhLinks = new BehaviorSubject([]); this._fhLinks = this.currentFhLinks.asObservable(); this.currentConfig = new BehaviorSubject(DEFAULT_CONFIG); this._config = this.currentConfig.asObservable(); this.init = new Subject(); this._init = this.init.asObservable(); this._clickNode = new Subject(); this.clickNode = this._clickNode.asObservable(); this._clickUnion = new Subject(); this.clickUnion = this._clickUnion.asObservable(); this._clickLink = new Subject(); this.clickLink = this._clickLink.asObservable(); } get Edges() { return this._Edges; } get Nodes() { return this._Nodes; } setFhNodes(nodes) { this.currentNodes.next(this.generateNodes(nodes)); this.currentFhNodes.next(nodes); } get FhNodes() { return this._fhNodes; } setFhUnions(unions) { this.generateUnions(unions); this.currentFhUnions.next(unions); } get FhUnions() { return this._fhUnions; } setFhLinks(links) { this.currentEdges.next(this.generateEdges(links)); this.currentFhLinks.next(links); } get FhLinks() { return this._fhLinks; } setConfig(config) { this.currentConfig.next(this.mergeDeep(this.currentConfig.getValue(), config)); } get config() { return this._config; } sendClickEvent(e, type) { if (type === 'node') { const node = this.currentFhNodes.getValue().find(el => el.id === e.nodes[0]); if (node) { this._clickNode.next(node); } else { const id = e.nodes[0].replace('u', ''); const union = this.currentFhUnions.getValue().find(el => el.id == id); this._clickUnion.next(union); } } else { const link = this.currentFhLinks.getValue().find(el => el.id == e.edges[0]); if (link) { this._clickLink.next(link); } else { const regex = /(?<=l)(.*?)(?=_)/; const id = e.edges[0].toString().match(regex)[0]; this._clickLink.next(this.currentFhUnions.getValue().find(o => o.id == id)); } } } initialize(data, config) { this.currentFhLinks.next(data.links); this.currentFhNodes.next(data.nodes); this.currentFhUnions.next(data.unions); this.currentEdges.next(this.generateEdges(data.links)), this.currentNodes.next(this.generateNodes(data.nodes)); this.generateUnions(data.unions); if (config) { this.setConfig(config); } this.init.next(true); } mergeDeep(target, ...sources) { if (!sources.length) { return target; } const source = sources.shift(); if (isObject(target) && isObject(source)) { for (const key in source) { if (isObject(source[key])) { if (!target[key]) { Object.assign(target, { [key]: {} }); } else { target[key] = Object.assign({}, target[key]); } this.mergeDeep(target[key], source[key]); } else { Object.assign(target, { [key]: source[key] }); } } } return this.mergeDeep(target, ...sources); } generateNodes(nodes) { return new DataSet(nodes.map((o) => { return this.createNode(o); })); } createNode(o) { return { id: o.id, image: o.image ? o.image : this.currentConfig.getValue().nodes.images, shape: 'image', size: this.currentConfig.getValue().nodes.size, level: (o.level * 2) - 1, label: o.label }; } createEdge(o) { return { id: o.id, from: o.nodeId, to: `u${o.unionId}`, color: this.currentConfig.getValue().links.childrens.styles }; } generateEdges(links) { return new DataSet(links.map((o) => { return this.createEdge(o); })); } generateUnions(unions) { unions.forEach((u) => { this.createUnion(u); }); } createUnion(u) { let level; const node = { id: `u${u.id}`, image: this.currentConfig.getValue().union.images, shape: 'image', size: this.currentConfig.getValue().union.size, }; u.components.forEach((e) => { const edge = { id: `l${u.id}_${node.id}-${e}`, from: node.id, to: e, color: this.currentConfig.getValue().links.parents.styles, }; level = this.currentFhNodes.getValue().filter(n => n.id === e)[0].level; this.currentEdges.getValue().add(edge); }); node.level = (level * 2); this.currentNodes.getValue().add(node); } addNode(node) { this.currentFhNodes.getValue().push(node); this.currentNodes.getValue().add(this.createNode(node)); } addLink(link) { this.currentFhLinks.getValue().push(link); this.currentEdges.getValue().add(this.createEdge(link)); } addUnion(union) { this.currentFhUnions.getValue().push(union); this.createUnion(union); } }; FamilyHierarchyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FamilyHierarchyService_Factory() { return new FamilyHierarchyService(); }, token: FamilyHierarchyService, providedIn: "root" }); FamilyHierarchyService = __decorate([ Injectable({ providedIn: 'root' }) ], FamilyHierarchyService); export { FamilyHierarchyService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaWx5LWhpZXJhcmNoeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFtaWx5LWhpZXJhcmNoeS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2ZhbWlseS1oaWVyYXJjaHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU1RCxPQUFPLEVBQUUsT0FBTyxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUVoQyxvQkFBb0I7QUFLcEIsSUFBYSxzQkFBc0IsR0FBbkMsTUFBYSxzQkFBc0I7SUF3RmpDO1FBdkZRLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksT0FBTyxFQUFRLENBQUMsQ0FBQztRQUN2RSxXQUFNLEdBQStCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFNdEUsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxPQUFPLEVBQVEsQ0FBQyxDQUFDO1FBQ3ZFLFdBQU0sR0FBK0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU10RSxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELGFBQVEsR0FBMEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQVNwRSxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELGNBQVMsR0FBMkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQVN2RSxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFZLEVBQUUsQ0FB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LFFBQVEsQ0FBQyxLQUFjO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGLENBQUE7O0FBL01ZLHNCQUFzQjtJQUhsQyxVQUFVLENBQUM7UUFDVixVQUFVLEVBQUUsTUFBTTtLQUNuQixDQUFDO0dBQ1csc0JBQXNCLENBK01sQztTQS9NWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaE5vZGUsIEZoVW5pb24sIEZoTGluaywgRmhDb25maWcsIEZoRGF0YSB9IGZyb20gJy4uL21vZGVscy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBEYXRhU2V0LCBOb2RlLCBFZGdlLCBEYXRhIH0gZnJvbSAndmlzLW5ldHdvcmsvc3RhbmRhbG9uZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQnO1xyXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJ3V0aWwnO1xyXG5cclxuLyogdHNsaW50OmRpc2FibGUgKi9cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZhbWlseUhpZXJhcmNoeVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY3VycmVudEVkZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU2V0PEVkZ2U+PihuZXcgRGF0YVNldDxFZGdlPigpKTtcclxuICBwcml2YXRlIF9FZGdlcyA6IE9ic2VydmFibGU8RGF0YVNldDxFZGdlPj4gPSB0aGlzLmN1cnJlbnRFZGdlcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHVibGljIGdldCBFZGdlcygpOiBPYnNlcnZhYmxlPERhdGFTZXQ8RWRnZT4+IHtcclxuICAgIHJldHVybiB0aGlzLl9FZGdlcztcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBjdXJyZW50Tm9kZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTZXQ8Tm9kZT4+KG5ldyBEYXRhU2V0PE5vZGU+KCkpO1xyXG4gIHByaXZhdGUgX05vZGVzIDogT2JzZXJ2YWJsZTxEYXRhU2V0PE5vZGU+PiA9IHRoaXMuY3VycmVudE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwdWJsaWMgZ2V0IE5vZGVzKCk6IE9ic2VydmFibGU8RGF0YVNldDxOb2RlPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX05vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhOb2RlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhOb2RlIFtdPihbXSk7XHJcbiAgcHVibGljIF9maE5vZGVzOiBPYnNlcnZhYmxlPEZoTm9kZSBbXT4gPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaE5vZGVzKG5vZGVzOiBGaE5vZGUgW10pIHtcclxuICAgIHRoaXMuY3VycmVudE5vZGVzLm5leHQodGhpcy5nZW5lcmF0ZU5vZGVzKG5vZGVzKSk7XHJcbiAgICB0aGlzLmN1cnJlbnRGaE5vZGVzLm5leHQobm9kZXMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoTm9kZXMoKTogT2JzZXJ2YWJsZTxGaE5vZGUgW10+IHtcclxuICAgIHJldHVybiB0aGlzLl9maE5vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhVbmlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZoVW5pb24gW10+KFtdKTtcclxuICBwdWJsaWMgX2ZoVW5pb25zOiBPYnNlcnZhYmxlPEZoVW5pb24gW10+ID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldEZoVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVVuaW9ucyh1bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RmhVbmlvbnMubmV4dCh1bmlvbnMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoVW5pb25zKCk6IE9ic2VydmFibGU8RmhVbmlvbiBbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZoVW5pb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhMaW5rcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhMaW5rIFtdPihbXSk7XHJcbiAgcHVibGljIF9maExpbmtzOiBPYnNlcnZhYmxlPEZoTGluayBbXT4gPSB0aGlzLmN1cnJlbnRGaExpbmtzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaExpbmtzKGxpbmtzOiBGaExpbmsgW10pIHtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLm5leHQodGhpcy5nZW5lcmF0ZUVkZ2VzKGxpbmtzKSlcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChsaW5rcyk7XHJcbiAgfVxyXG4gIGdldCBGaExpbmtzKCk6IE9ic2VydmFibGU8RmhMaW5rIFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmhMaW5rcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3VycmVudENvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhDb25maWc+KERFRkFVTFRfQ09ORklHKTtcclxuICBwdWJsaWMgX2NvbmZpZzogT2JzZXJ2YWJsZTxGaENvbmZpZz4gPSB0aGlzLmN1cnJlbnRDb25maWcuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldENvbmZpZyhjb25maWc6IEZoQ29uZmlnKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRDb25maWcubmV4dCh0aGlzLm1lcmdlRGVlcCh0aGlzLmN1cnJlbnRDb25maWcuZ2V0VmFsdWUoKSwgY29uZmlnKSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IE9ic2VydmFibGU8RmhDb25maWc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyBfaW5pdDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaW5pdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2xpY2tOb2RlID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHB1YmxpYyBjbGlja05vZGUgPSB0aGlzLl9jbGlja05vZGUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrVW5pb24gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrVW5pb24gPSB0aGlzLl9jbGlja1VuaW9uLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9jbGlja0xpbmsgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrTGluayA9IHRoaXMuX2NsaWNrTGluay5hc09ic2VydmFibGUoKTtcclxuICBcclxuICBwdWJsaWMgc2VuZENsaWNrRXZlbnQoZTogYW55LCB0eXBlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ25vZGUnKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmdldFZhbHVlKCkuZmluZCggZWwgPT4gZWwuaWQgPT09IGUubm9kZXNbMF0pO1xyXG4gICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuX2NsaWNrTm9kZS5uZXh0KG5vZGUpO1xyXG4gICAgICB9IGVsc2UgeyBcclxuICAgICAgICBjb25zdCBpZCA9IGUubm9kZXNbMF0ucmVwbGFjZSgndScsJycpO1xyXG4gICAgICAgIGNvbnN0IHVuaW9uID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBpZClcclxuICAgICAgICB0aGlzLl9jbGlja1VuaW9uLm5leHQodW5pb24pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsaW5rICA9IHRoaXMuY3VycmVudEZoTGlua3MuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBlLmVkZ2VzWzBdKTtcclxuICAgICAgaWYgKGxpbmspIHtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dChsaW5rKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByZWdleCA9IC8oPzw9bCkoLio/KSg/PV8pLztcclxuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gZS5lZGdlc1swXS50b1N0cmluZygpLm1hdGNoKHJlZ2V4KVswXTtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dCh0aGlzLmN1cnJlbnRGaFVuaW9ucy5nZXRWYWx1ZSgpLmZpbmQoIG8gPT4gby5pZCA9PSBpZCkgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplKGRhdGE6IEZoRGF0YSwgY29uZmlnPzogRmhDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChkYXRhLmxpbmtzKTtcclxuICAgIHRoaXMuY3VycmVudEZoTm9kZXMubmV4dChkYXRhLm5vZGVzKTtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLm5leHQoZGF0YS51bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RWRnZXMubmV4dCh0aGlzLmdlbmVyYXRlRWRnZXMoZGF0YS5saW5rcykpLFxyXG4gICAgdGhpcy5jdXJyZW50Tm9kZXMubmV4dCh0aGlzLmdlbmVyYXRlTm9kZXMoZGF0YS5ub2RlcykpXHJcbiAgICB0aGlzLmdlbmVyYXRlVW5pb25zKGRhdGEudW5pb25zKTtcclxuXHJcbiAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0Lm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlRGVlcCh0YXJnZXQsIC4uLnNvdXJjZXMpIHtcclxuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHsgcmV0dXJuIHRhcmdldDsgfVxyXG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xyXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XHJcbiAgICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiB7fSB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0W2tleV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5tZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlTm9kZXMobm9kZXM6IEZoTm9kZSBbXSk6IERhdGFTZXQ8Tm9kZT4ge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRhU2V0PE5vZGU+IChcclxuICAgICAgbm9kZXMubWFwKFxyXG4gICAgICAgIChvOiBGaE5vZGUpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vZGUobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOb2RlKG86IEZoTm9kZSk6IE5vZGUge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQgOiBvLmlkLFxyXG4gICAgICBpbWFnZSA6IG8uaW1hZ2UgPyBvLmltYWdlIDogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubm9kZXMuaW1hZ2VzLFxyXG4gICAgICBzaGFwZTogJ2ltYWdlJyxcclxuICAgICAgc2l6ZSA6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLm5vZGVzLnNpemUsXHJcbiAgICAgIGxldmVsIDogKG8ubGV2ZWwgKiAyKSAtIDEsXHJcbiAgICAgIGxhYmVsIDogby5sYWJlbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRWRnZShvOiBGaExpbmspOiBFZGdlIHtcclxuICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IG8uaWQsXHJcbiAgICAgIGZyb206IG8ubm9kZUlkLFxyXG4gICAgICB0bzogYHUke28udW5pb25JZH1gLFxyXG4gICAgICBjb2xvcjogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubGlua3MuY2hpbGRyZW5zLnN0eWxlc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVFZGdlcyhsaW5rczogRmhMaW5rIFtdKTogRGF0YVNldDxFZGdlPiB7XHJcbiAgICByZXR1cm4gbmV3IERhdGFTZXQ8RWRnZT4gKFxyXG4gICAgICBsaW5rcy5tYXAoXHJcbiAgICAgICAgKG86IEZoTGluaykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRWRnZShvKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSk6IHZvaWQge1xyXG4gICAgdW5pb25zLmZvckVhY2goKHU6IEZoVW5pb24pID0+IHtcclxuICAgICAgdGhpcy5jcmVhdGVVbmlvbih1KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVbmlvbih1OiBGaFVuaW9uKTogdm9pZCB7XHJcbiAgICBsZXQgbGV2ZWw7XHJcbiAgICBjb25zdCBub2RlOiBOb2RlID0ge1xyXG4gICAgICBpZDogYHUke3UuaWR9YCxcclxuICAgICAgaW1hZ2U6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLmltYWdlcyxcclxuICAgICAgc2hhcGU6ICdpbWFnZScsXHJcbiAgICAgIHNpemU6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLnNpemUsXHJcbiAgICB9O1xyXG4gICAgdS5jb21wb25lbnRzLmZvckVhY2goKGU6bnVtYmVyIHwgc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7XHJcbiAgICAgICAgaWQ6IGBsJHt1LmlkfV8ke25vZGUuaWR9LSR7ZX1gLFxyXG4gICAgICAgIGZyb206IG5vZGUuaWQsXHJcbiAgICAgICAgdG86IGUsXHJcbiAgICAgICAgY29sb3I6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLmxpbmtzLnBhcmVudHMuc3R5bGVzLFxyXG4gICAgICB9O1xyXG4gICAgICBsZXZlbCA9IHRoaXMuY3VycmVudEZoTm9kZXMuZ2V0VmFsdWUoKS5maWx0ZXIoIG4gPT4gbi5pZCA9PT0gZSlbMF0ubGV2ZWw7XHJcbiAgICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKGVkZ2UpO1xyXG4gICAgfSk7XHJcbiAgICBub2RlLmxldmVsID0gKGxldmVsICogMik7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZChub2RlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGROb2RlKG5vZGU6IEZoTm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50RmhOb2Rlcy5nZXRWYWx1ZSgpLnB1c2gobm9kZSk7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZCh0aGlzLmNyZWF0ZU5vZGUobm9kZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZExpbmsobGluazogRmhMaW5rKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRGaExpbmtzLmdldFZhbHVlKCkucHVzaChsaW5rKTtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKHRoaXMuY3JlYXRlRWRnZShsaW5rKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkVW5pb24odW5pb246IEZoVW5pb24pOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLmdldFZhbHVlKCkucHVzaCh1bmlvbik7XHJcbiAgICB0aGlzLmNyZWF0ZVVuaW9uKHVuaW9uKTtcclxuICB9XHJcbn1cclxuIl19