UNPKG

@igo2/utils

Version:
208 lines 24.2 kB
export const TREE_SEPERATOR = '.'; export class Tree { config; _data; getChildren; getId; getLevel; constructor(initialData, config) { this.config = config; this.getChildren = config.getChildren; this.getId = config.getId; this.getLevel = config.getLevel; this._data = this.sortDeep(initialData); } get data() { return this._data; } get flattened() { return this.flatten([...this.data]); } add(...nodes) { this.sortDeep(nodes); this._data.unshift(...nodes); return nodes; } addBefore(beforeId, ...nodes) { this.sortDeep(nodes); this._addBefore(beforeId, this._data, ...nodes); } remove(...nodes) { return this._remove(...nodes); } clear() { this._data = []; } exist(node) { const id = this.getId(node); return this.flattened.some((layer) => this.getId(layer) === id); } /** * Move a node to a different position * @param node * @param beforeTo The position of index into the tree. If -1 move at the end */ moveTo(beforeTo, ...nodes) { const clonedBeforeTo = [...beforeTo]; const lastIndex = clonedBeforeTo.pop(); const recipient = this.getAncestorAtPosition(clonedBeforeTo); const beforeId = lastIndex === -1 || lastIndex >= recipient.length ? null : this.getId(recipient[lastIndex]); const nodesToMove = nodes.filter((node) => beforeId !== this.getId(node)); return this.move(beforeId, recipient, ...nodesToMove); } getPosition(node) { const id = this.getId(node); return this._getPosition(id); } _addBefore(beforeId, recipient = this._data, ...nodes) { if (!beforeId) { recipient.push(...nodes); return nodes; } const beforeIndex = this.getIndex(beforeId, recipient); recipient.splice(beforeIndex, 0, ...nodes); return nodes; } _remove(...nodes) { return nodes.reduce((acc, node) => { const ancestor = this.getNodeAncestor(node); if (!ancestor) { return; } const index = this.getIndex(this.getId(node), ancestor); if (index === -1) { return; } ancestor.splice(index, 1); return acc.concat(node); }, []); } /** * Move an node before an id * @param node Node to be move * @param recipient * @param beforeId */ move(beforeId, recipient, ...nodes) { this._remove(...nodes); return this._addBefore(beforeId, recipient, ...nodes); } _getPosition(id, ancestorsIndex = [], values = this._data) { let indexList; values.some((value, index) => { if (this.getId(value) === id) { indexList = ancestorsIndex.concat(index); return true; } const children = this.getChildren(value); if (children) { const groupIndexList = this._getPosition(id, ancestorsIndex.concat(index), children); if (groupIndexList) { indexList = groupIndexList; return true; } } return false; }); return indexList; } getAncestorAtPosition(position) { if (!position.length) { return this._data; } const node = this.getNodeByPosition(position); return this.getChildren(node); } /** Recursive */ sortDeep(data = this._data) { data.forEach((node) => { const children = this.getChildren(node); if (children) { this.sortDeep(children); } }); return this.sort(data); } sort(children) { const sorted = children.sort((a, b) => this.getLevel(a) - this.getLevel(b)); return this.config.reverse ? sorted.reverse() : sorted; } /** Recursive */ _getNodeById(id, data = this._data) { let node; data.some((item) => { if (this.getId(item) === id) { node = item; return true; } const children = this.getChildren(item); if (children) { node = this._getNodeById(id, children); if (node) { return true; } } return false; }); return node; } getNodeByPosition(indexes) { if (indexes.length > 1) { return indexes.reduce((previousValue, index) => { const ancestor = previousValue ? this.getChildren(previousValue) : this._data; return this._getByIndex(index, ancestor); }, null); } else { return this._getByIndex(indexes[0]); } } _getByIndex(index, ancestor = this._data) { return ancestor[index]; } getNodeAncestor(node) { const id = this.getId(node); return this.getAncestorById(id); } /** Recursive */ getAncestorById(id, data = this._data) { let ancestor; data.some((item) => { if (this.getId(item) === id) { ancestor = data; return true; } const children = this.getChildren(item); if (children) { ancestor = this.getAncestorById(id, children); if (ancestor) { return true; } } return false; }); return ancestor; } /** Recursive */ flatten(nodes) { return nodes.reduce((list, node) => { const children = this.getChildren(node); if (children) { const flattened = this.flatten(children); list.push(node, ...flattened); } else { list.push(node); } return list; }, []); } getIndex(id, ancestor) { return ancestor.findIndex((node) => this.getId(node) === id); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvdHJlZS90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFFbEMsTUFBTSxPQUFPLElBQUk7SUFTTDtJQVJGLEtBQUssQ0FBTTtJQUVuQixXQUFXLENBQTBDO0lBQ3JELEtBQUssQ0FBMEI7SUFDL0IsUUFBUSxDQUEwQjtJQUVsQyxZQUNFLFdBQWdCLEVBQ1IsTUFBc0I7UUFBdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFHLEtBQVU7UUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQTRCLEVBQUUsR0FBRyxLQUFVO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsS0FB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O1lBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsRUFBRSxFQUFTLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRU8sUUFBUSxDQUFDLEVBQVUsRUFBRSxRQUFhO1FBQ3hDLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbnRlcmZhY2UgSVRyZWVDb25maWc8VD4ge1xuICBnZXRDaGlsZHJlbjogKGRhdGFOb2RlOiBUKSA9PiBUW10gfCB1bmRlZmluZWQgfCBudWxsO1xuICBnZXRJZDogKGRhdGFOb2RlOiBUKSA9PiBzdHJpbmc7XG4gIGdldExldmVsOiAoZGF0YU5vZGU6IFQpID0+IG51bWJlcjtcbiAgcmV2ZXJzZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBUUkVFX1NFUEVSQVRPUiA9ICcuJztcblxuZXhwb3J0IGNsYXNzIFRyZWU8VD4ge1xuICBwcml2YXRlIF9kYXRhOiBUW107XG5cbiAgZ2V0Q2hpbGRyZW46IChkYXRhTm9kZTogVCkgPT4gVFtdIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgZ2V0SWQ6IChkYXRhTm9kZTogVCkgPT4gc3RyaW5nO1xuICBnZXRMZXZlbDogKGRhdGFOb2RlOiBUKSA9PiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5pdGlhbERhdGE6IFRbXSxcbiAgICBwcml2YXRlIGNvbmZpZzogSVRyZWVDb25maWc8VD5cbiAgKSB7XG4gICAgdGhpcy5nZXRDaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbjtcbiAgICB0aGlzLmdldElkID0gY29uZmlnLmdldElkO1xuICAgIHRoaXMuZ2V0TGV2ZWwgPSBjb25maWcuZ2V0TGV2ZWw7XG5cbiAgICB0aGlzLl9kYXRhID0gdGhpcy5zb3J0RGVlcChpbml0aWFsRGF0YSk7XG4gIH1cblxuICBnZXQgZGF0YSgpOiByZWFkb25seSBUW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgZ2V0IGZsYXR0ZW5lZCgpOiByZWFkb25seSBUW10ge1xuICAgIHJldHVybiB0aGlzLmZsYXR0ZW4oWy4uLnRoaXMuZGF0YV0pO1xuICB9XG5cbiAgYWRkKC4uLm5vZGVzOiBUW10pOiBUW10ge1xuICAgIHRoaXMuc29ydERlZXAobm9kZXMpO1xuICAgIHRoaXMuX2RhdGEudW5zaGlmdCguLi5ub2Rlcyk7XG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgYWRkQmVmb3JlKGJlZm9yZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLm5vZGVzOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLnNvcnREZWVwKG5vZGVzKTtcbiAgICB0aGlzLl9hZGRCZWZvcmUoYmVmb3JlSWQsIHRoaXMuX2RhdGEsIC4uLm5vZGVzKTtcbiAgfVxuXG4gIHJlbW92ZSguLi5ub2RlczogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlKC4uLm5vZGVzKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSBbXTtcbiAgfVxuXG4gIGV4aXN0KG5vZGU6IFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SWQobm9kZSk7XG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbmVkLnNvbWUoKGxheWVyKSA9PiB0aGlzLmdldElkKGxheWVyKSA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSBub2RlIHRvIGEgZGlmZmVyZW50IHBvc2l0aW9uXG4gICAqIEBwYXJhbSBub2RlXG4gICAqIEBwYXJhbSBiZWZvcmVUbyBUaGUgcG9zaXRpb24gb2YgaW5kZXggaW50byB0aGUgdHJlZS4gSWYgLTEgbW92ZSBhdCB0aGUgZW5kXG4gICAqL1xuICBtb3ZlVG8oYmVmb3JlVG86IG51bWJlcltdLCAuLi5ub2RlczogVFtdKTogVFtdIHtcbiAgICBjb25zdCBjbG9uZWRCZWZvcmVUbyA9IFsuLi5iZWZvcmVUb107XG4gICAgY29uc3QgbGFzdEluZGV4ID0gY2xvbmVkQmVmb3JlVG8ucG9wKCk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gdGhpcy5nZXRBbmNlc3RvckF0UG9zaXRpb24oY2xvbmVkQmVmb3JlVG8pO1xuICAgIGNvbnN0IGJlZm9yZUlkID1cbiAgICAgIGxhc3RJbmRleCA9PT0gLTEgfHwgbGFzdEluZGV4ID49IHJlY2lwaWVudC5sZW5ndGhcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdGhpcy5nZXRJZChyZWNpcGllbnRbbGFzdEluZGV4XSk7XG5cbiAgICBjb25zdCBub2Rlc1RvTW92ZSA9IG5vZGVzLmZpbHRlcigobm9kZSkgPT4gYmVmb3JlSWQgIT09IHRoaXMuZ2V0SWQobm9kZSkpO1xuICAgIHJldHVybiB0aGlzLm1vdmUoYmVmb3JlSWQsIHJlY2lwaWVudCwgLi4ubm9kZXNUb01vdmUpO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24obm9kZTogVCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SWQobm9kZSk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFBvc2l0aW9uKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEJlZm9yZShcbiAgICBiZWZvcmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJlY2lwaWVudCA9IHRoaXMuX2RhdGEsXG4gICAgLi4ubm9kZXM6IFRbXVxuICApOiBUW10ge1xuICAgIGlmICghYmVmb3JlSWQpIHtcbiAgICAgIHJlY2lwaWVudC5wdXNoKC4uLm5vZGVzKTtcbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmVJbmRleCA9IHRoaXMuZ2V0SW5kZXgoYmVmb3JlSWQsIHJlY2lwaWVudCk7XG4gICAgcmVjaXBpZW50LnNwbGljZShiZWZvcmVJbmRleCwgMCwgLi4ubm9kZXMpO1xuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlKC4uLm5vZGVzOiBUW10pOiBUW10ge1xuICAgIHJldHVybiBub2Rlcy5yZWR1Y2UoKGFjYzogVFtdLCBub2RlKSA9PiB7XG4gICAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZ2V0Tm9kZUFuY2VzdG9yKG5vZGUpO1xuICAgICAgaWYgKCFhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJbmRleCh0aGlzLmdldElkKG5vZGUpLCBhbmNlc3Rvcik7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFuY2VzdG9yLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgIHJldHVybiBhY2MuY29uY2F0KG5vZGUpO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGFuIG5vZGUgYmVmb3JlIGFuIGlkXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gYmUgbW92ZVxuICAgKiBAcGFyYW0gcmVjaXBpZW50XG4gICAqIEBwYXJhbSBiZWZvcmVJZFxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlKFxuICAgIGJlZm9yZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjaXBpZW50OiBUW10sXG4gICAgLi4ubm9kZXM6IFRbXVxuICApOiBUW10ge1xuICAgIHRoaXMuX3JlbW92ZSguLi5ub2Rlcyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZEJlZm9yZShiZWZvcmVJZCwgcmVjaXBpZW50LCAuLi5ub2Rlcyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRQb3NpdGlvbihcbiAgICBpZDogc3RyaW5nLFxuICAgIGFuY2VzdG9yc0luZGV4OiBudW1iZXJbXSA9IFtdLFxuICAgIHZhbHVlcyA9IHRoaXMuX2RhdGFcbiAgKSB7XG4gICAgbGV0IGluZGV4TGlzdDogbnVtYmVyW107XG4gICAgdmFsdWVzLnNvbWUoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ2V0SWQodmFsdWUpID09PSBpZCkge1xuICAgICAgICBpbmRleExpc3QgPSBhbmNlc3RvcnNJbmRleC5jb25jYXQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKHZhbHVlKTtcbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBncm91cEluZGV4TGlzdCA9IHRoaXMuX2dldFBvc2l0aW9uKFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGFuY2VzdG9yc0luZGV4LmNvbmNhdChpbmRleCksXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdyb3VwSW5kZXhMaXN0KSB7XG4gICAgICAgICAgaW5kZXhMaXN0ID0gZ3JvdXBJbmRleExpc3Q7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHJldHVybiBpbmRleExpc3Q7XG4gIH1cblxuICBwcml2YXRlIGdldEFuY2VzdG9yQXRQb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyW10pIHtcbiAgICBpZiAoIXBvc2l0aW9uLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVCeVBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5nZXRDaGlsZHJlbihub2RlKTtcbiAgfVxuXG4gIC8qKiBSZWN1cnNpdmUgKi9cbiAgcHJpdmF0ZSBzb3J0RGVlcChkYXRhID0gdGhpcy5fZGF0YSk6IFRbXSB7XG4gICAgZGF0YS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4obm9kZSk7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5zb3J0RGVlcChjaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc29ydChkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgc29ydChjaGlsZHJlbjogVFtdKTogVFtdIHtcbiAgICBjb25zdCBzb3J0ZWQgPSBjaGlsZHJlbi5zb3J0KChhLCBiKSA9PiB0aGlzLmdldExldmVsKGEpIC0gdGhpcy5nZXRMZXZlbChiKSk7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldmVyc2UgPyBzb3J0ZWQucmV2ZXJzZSgpIDogc29ydGVkO1xuICB9XG5cbiAgLyoqIFJlY3Vyc2l2ZSAqL1xuICBwcml2YXRlIF9nZXROb2RlQnlJZChpZDogc3RyaW5nLCBkYXRhID0gdGhpcy5fZGF0YSk6IFQge1xuICAgIGxldCBub2RlOiBUO1xuICAgIGRhdGEuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ2V0SWQoaXRlbSkgPT09IGlkKSB7XG4gICAgICAgIG5vZGUgPSBpdGVtO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKGl0ZW0pO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIG5vZGUgPSB0aGlzLl9nZXROb2RlQnlJZChpZCwgY2hpbGRyZW4pO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGdldE5vZGVCeVBvc2l0aW9uKGluZGV4ZXM6IG51bWJlcltdKTogVCB7XG4gICAgaWYgKGluZGV4ZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIGluZGV4ZXMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBULCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBhbmNlc3RvciA9IHByZXZpb3VzVmFsdWVcbiAgICAgICAgICA/IHRoaXMuZ2V0Q2hpbGRyZW4ocHJldmlvdXNWYWx1ZSlcbiAgICAgICAgICA6IHRoaXMuX2RhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUluZGV4KGluZGV4LCBhbmNlc3Rvcik7XG4gICAgICB9LCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5SW5kZXgoaW5kZXhlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlJbmRleChpbmRleDogbnVtYmVyLCBhbmNlc3RvciA9IHRoaXMuX2RhdGEpIHtcbiAgICByZXR1cm4gYW5jZXN0b3JbaW5kZXhdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROb2RlQW5jZXN0b3Iobm9kZTogVCk6IFRbXSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldElkKG5vZGUpO1xuICAgIHJldHVybiB0aGlzLmdldEFuY2VzdG9yQnlJZChpZCk7XG4gIH1cblxuICAvKiogUmVjdXJzaXZlICovXG4gIHByaXZhdGUgZ2V0QW5jZXN0b3JCeUlkKGlkOiBzdHJpbmcsIGRhdGEgPSB0aGlzLl9kYXRhKTogVFtdIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgYW5jZXN0b3I6IFRbXTtcbiAgICBkYXRhLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgIGlmICh0aGlzLmdldElkKGl0ZW0pID09PSBpZCkge1xuICAgICAgICBhbmNlc3RvciA9IGRhdGE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oaXRlbSk7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgYW5jZXN0b3IgPSB0aGlzLmdldEFuY2VzdG9yQnlJZChpZCwgY2hpbGRyZW4pO1xuICAgICAgICBpZiAoYW5jZXN0b3IpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG5cbiAgLyoqIFJlY3Vyc2l2ZSAqL1xuICBwcml2YXRlIGZsYXR0ZW4obm9kZXM6IFRbXSk6IFRbXSB7XG4gICAgcmV0dXJuIG5vZGVzLnJlZHVjZSgobGlzdCwgbm9kZSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKG5vZGUpO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IHRoaXMuZmxhdHRlbihjaGlsZHJlbik7XG4gICAgICAgIGxpc3QucHVzaChub2RlLCAuLi5mbGF0dGVuZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfSwgW10gYXMgVFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5kZXgoaWQ6IHN0cmluZywgYW5jZXN0b3I6IFRbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFuY2VzdG9yLmZpbmRJbmRleCgobm9kZSkgPT4gdGhpcy5nZXRJZChub2RlKSA9PT0gaWQpO1xuICB9XG59XG4iXX0=