UNPKG

ng-devui

Version:

DevUI components based on Angular

303 lines 41.1 kB
import { Injectable } from '@angular/core'; import { cloneDeep } from 'lodash-es'; import { Subject } from 'rxjs'; import * as i0 from "@angular/core"; export class CascaderService { constructor() { this._currentValue = []; this.multipleValue = []; this.columnList = []; this.searchResultList = []; this.canSelectParent = false; this.isMultiple = false; this.isLazyLoad = false; this.lazyloadCache = {}; this.checkboxRelation = { upward: true, downward: true }; this.closeMianDropdown = new Subject(); this.currentValueChange = new Subject(); this.resetStatus = new Subject(); this.openDrawer = new Subject(); this.updateShowText = new Subject(); this.updateTagList = new Subject(); } set currentValue(value) { this._currentValue = value.filter((item) => item !== undefined); this.currentValueChange.next(this._currentValue); } get currentValue() { return this._currentValue; } set currentMultipleValue(value) { this.resetNodeStatus(); this.multipleValue = value; } get currentMultipleValue() { this.multipleValue = []; this.getMultipleValue([], this.options); return this.multipleValue; } initOptions(options) { this.columnList = []; this.options = cloneDeep(options); // 标记根节点 this.options.forEach((t) => { t.isRoot = true; }); this.columnList.push(this.options); } openColumn(option, colIndex, islazyLoad, reload = false) { this.clearTargetActive(this.columnList[colIndex].find((t) => t.active)); option.active = true; this.columnList.splice(colIndex + 1); if (option.children && option.children.length) { this.columnList.push(option.children); this.openDrawer.next(); } else if (islazyLoad) { option._loading = true; const fn = this.loadChildrenFn(option); if (fn.then) { fn.then((res) => { this.columnList.splice(colIndex + 1); // 防止多个同时懒加载,造成多余的添加 option.children = res || []; option._loading = false; this.columnList.push(res || []); this.openDrawer.next(); if (this.isMultiple) { this.updateOptionCheckedStatus(option.value, option.checked, true, true, !reload); } if (reload) { if (!this.isMultiple) { this.updateOptionByValue(); } this.updateShowText.next(); } }); } else { fn.subscribe((res) => { this.columnList.splice(colIndex + 1); // 防止多个同时懒加载,造成多余的添加 option.children = res || []; option._loading = false; this.columnList.push(res || []); this.openDrawer.next(); if (this.isMultiple) { this.updateOptionCheckedStatus(option.value, option.checked, true, true, !reload); } if (reload) { if (!this.isMultiple) { this.updateOptionByValue(); } this.updateShowText.next(); } }); } } } clearTargetActive(option) { if (!option) { return; } option.active = false; if (option.children) { this.clearTargetActive(option.children.find((t) => t.active)); } } setCurrentValue() { this.currentValue = this.columnList.map((listItem) => listItem.find((optionItem) => optionItem.active)?.value); } updateOptionByValue() { this.resetNodeStatus(); this.columnList = [this.options]; for (let index = 0; index < this.currentValue.length; index++) { const target = this.columnList[index]?.find((listItem) => listItem.value === this.currentValue[index]); if (target) { target.active = true; if (target.children && target.children.length) { // 有子菜单展开子菜单 this.columnList.push(target.children); } else if (this.isLazyLoad) { // 懒加载没有子菜单的情况下,非叶子节点执行展开,叶子节点执行选中 this.openColumn(target, index, !target.isLeaf, !target.isLeaf); break; } } else { break; } } } lazyloadMultipleChild(target, index) { if (!this.lazyloadCache[target.value]) { this.lazyloadCache[target.value] = true; this.openColumn(target, index, true, true); } } resetNodeStatus(option = this.options) { option.forEach((item) => { item.active = false; item.checked = false; item.halfChecked = false; if (item.children) { this.resetNodeStatus(item.children); } }); } // 在多选模式下,更新节点树的checked状态 updateOptionCheckedStatus(targetValue, checked, upward = true, downward = true, isEmit = true) { let targetNode = this.options.find((t) => t.value === targetValue); // 当主下拉列表包含了目标,即目标无父节点 if (targetNode) { targetNode.checked = checked; targetNode.halfChecked = false; if (targetNode.children && downward) { this.updateChildrenChecked(targetNode, checked, isEmit); } } else { // 当存在父节点时,需要检查同级节点来确定父节点状态 const parentNode = this.getParentNode(targetValue); targetNode = parentNode.children.find((t) => t.value === targetValue); targetNode.checked = checked; targetNode.halfChecked = false; if (upward) { this.updateParentChecked(parentNode, isEmit); } if (targetNode.children && downward) { this.updateChildrenChecked(targetNode, checked, isEmit); } } } // 子节点按父节点状态更新 updateChildrenChecked(node, checked, isEmit) { let hasDisable = false; node.children.forEach((child) => { if (!child.disabled) { child.checked = checked; child.halfChecked = false; if (child.children && child.children.length) { if (this.canSelectParent) { this.updateTagList.next({ isAdd: checked, option: child, isEmit, }); } this.updateChildrenChecked(child, checked, isEmit); } else { this.updateTagList.next({ isAdd: checked, option: child, isEmit, }); } } else { hasDisable = true; } }); if (hasDisable && !this.canSelectParent) { this.updateParentChecked(node, isEmit); } } // 父节点按所有子节点状态更新 updateParentChecked(node, isEmit) { const checkedChild = node.children.find((t) => t.checked); const halfcheckedChild = node.children.find((t) => t.halfChecked); const uncheckedChild = node.children.find((t) => !t.halfChecked && !t.checked); if (halfcheckedChild || (checkedChild && uncheckedChild)) { node.checked = false; node.halfChecked = true; } else if (!checkedChild && !halfcheckedChild) { node.checked = false; node.halfChecked = false; } else { node.checked = true; node.halfChecked = false; } if (this.canSelectParent) { this.updateTagList.next({ isAdd: node.checked, option: node, isEmit, }); } // 如果此节点非根节点,则继续找它的父节点进行更新 if (!node.isRoot) { this.updateParentChecked(this.getParentNode(node.value), isEmit); } } // 获取父节点 getParentNode(childValue) { const queue = [...this.options]; let cur; while (queue.length) { cur = queue.shift(); if (cur.children && cur.children.find((t) => t.value === childValue)) { break; } else if (cur.children) { queue.push(...cur.children); } } return cur; } getMultipleValue(value, option) { const isNoRelation = !this.checkboxRelation.downward || !this.checkboxRelation.upward; option.forEach((item) => { const _value = [...value]; _value.push(item.value); if (item.children && item.children.length && (item.checked || item.halfChecked)) { this.getMultipleValue(_value, item.children); if (isNoRelation) { this.multipleValue.push(_value); } } else if (item.checked) { this.multipleValue.push(_value); } else if (isNoRelation && item.children?.length) { this.getMultipleValue(_value, item.children); } }); } closeAllDropdown() { this.closeMianDropdown.next(); } // 搜索功能 searchByString(str, currentlabel, currentValue = [], list = this.options) { list.forEach((item) => { const label = currentlabel ? currentlabel + ' / ' + item.label : item.label; const valueList = [...currentValue, item.value]; if (item.children && item.children.length) { this.searchByString(str, label, valueList, item.children); } else { if (!item.disabled && label.toLowerCase().indexOf(str.toLowerCase()) !== -1) { this.searchResultList.push({ label, valueList, checked: item.checked, }); } } }); } ngOnDestroy() { this.closeMianDropdown.complete(); this.currentValueChange.complete(); this.updateTagList.complete(); this.resetStatus.complete(); this.openDrawer.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CascaderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CascaderService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CascaderService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzY2FkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL2Nhc2NhZGVyL2Nhc2NhZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSTNDLE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBRUUsa0JBQWEsR0FBMkIsRUFBRSxDQUFDO1FBRTNDLGtCQUFhLEdBQTZCLEVBQUUsQ0FBQztRQUk3QyxlQUFVLEdBQXFCLEVBQUUsQ0FBQztRQUNsQyxxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFdEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFeEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLHFCQUFnQixHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUF3QjNDLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDeEMsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7UUFDM0QsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNyQyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUloQyxDQUFDO0tBaVJOO0lBOVNDLElBQUksWUFBWSxDQUFDLEtBQTZCO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENB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LENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzVFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM1RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUN6QixLQUFLO3dCQUNMLFNBQVM7d0JBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO3FCQUN0QixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDOytHQWpVVSxlQUFlO21IQUFmLGVBQWU7OzRGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDYXNjYWRlckl0ZW0gfSBmcm9tICcuL2Nhc2NhZGVyLnR5cGUnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ2FzY2FkZXJTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBfY3VycmVudFZhbHVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW107XHJcblxyXG4gIG11bHRpcGxlVmFsdWU6IEFycmF5PHN0cmluZyB8IG51bWJlcj5bXSA9IFtdO1xyXG5cclxuICBvcHRpb25zOiBDYXNjYWRlckl0ZW1bXTtcclxuXHJcbiAgY29sdW1uTGlzdDogQ2FzY2FkZXJJdGVtW11bXSA9IFtdO1xyXG4gIHNlYXJjaFJlc3VsdExpc3QgPSBbXTtcclxuXHJcbiAgY2FuU2VsZWN0UGFyZW50ID0gZmFsc2U7XHJcblxyXG4gIGlzTXVsdGlwbGUgPSBmYWxzZTtcclxuXHJcbiAgaXNMYXp5TG9hZCA9IGZhbHNlO1xyXG4gIGxhenlsb2FkQ2FjaGUgPSB7fTtcclxuICBjaGVja2JveFJlbGF0aW9uID0geyB1cHdhcmQ6IHRydWUsIGRvd253YXJkOiB0cnVlIH07XHJcblxyXG4gIGxvYWRDaGlsZHJlbkZuOiAodmFsdWU6IENhc2NhZGVySXRlbSkgPT4gUHJvbWlzZTxDYXNjYWRlckl0ZW1bXT4gfCBPYnNlcnZhYmxlPENhc2NhZGVySXRlbVtdPjtcclxuXHJcbiAgc2V0IGN1cnJlbnRWYWx1ZSh2YWx1ZTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikge1xyXG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdmFsdWUuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5jdXJyZW50VmFsdWVDaGFuZ2UubmV4dCh0aGlzLl9jdXJyZW50VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbnRWYWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgY3VycmVudE11bHRpcGxlVmFsdWUodmFsdWUpIHtcclxuICAgIHRoaXMucmVzZXROb2RlU3RhdHVzKCk7XHJcbiAgICB0aGlzLm11bHRpcGxlVmFsdWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50TXVsdGlwbGVWYWx1ZSgpIHtcclxuICAgIHRoaXMubXVsdGlwbGVWYWx1ZSA9IFtdO1xyXG4gICAgdGhpcy5nZXRNdWx0aXBsZVZhbHVlKFtdLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGVWYWx1ZTtcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5IGNsb3NlTWlhbkRyb3Bkb3duID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICByZWFkb25seSBjdXJyZW50VmFsdWVDaGFuZ2UgPSBuZXcgU3ViamVjdDxBcnJheTxzdHJpbmcgfCBudW1iZXI+PigpO1xyXG4gIHJlYWRvbmx5IHJlc2V0U3RhdHVzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICByZWFkb25seSBvcGVuRHJhd2VyID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICByZWFkb25seSB1cGRhdGVTaG93VGV4dCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcmVhZG9ubHkgdXBkYXRlVGFnTGlzdCA9IG5ldyBTdWJqZWN0PHtcclxuICAgIGlzQWRkOiBib29sZWFuO1xyXG4gICAgb3B0aW9uOiBDYXNjYWRlckl0ZW07XHJcbiAgICBpc0VtaXQ6IGJvb2xlYW47IC8vIOaYr+WQpuinpuWPkW9uY2hhbmdlcyzlr7nlpJblj5Hlh7rlgLxcclxuICB9PigpO1xyXG5cclxuICBpbml0T3B0aW9ucyhvcHRpb25zOiBDYXNjYWRlckl0ZW1bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb2x1bW5MaXN0ID0gW107XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBjbG9uZURlZXAob3B0aW9ucyk7XHJcbiAgICAvLyDmoIforrDmoLnoioLngrlcclxuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKCh0KSA9PiB7XHJcbiAgICAgIHQuaXNSb290ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jb2x1bW5MaXN0LnB1c2godGhpcy5vcHRpb25zKTtcclxuICB9XHJcblxyXG4gIG9wZW5Db2x1bW4ob3B0aW9uOiBDYXNjYWRlckl0ZW0sIGNvbEluZGV4OiBudW1iZXIsIGlzbGF6eUxvYWQ6IGJvb2xlYW4sIHJlbG9hZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyVGFyZ2V0QWN0aXZlKHRoaXMuY29sdW1uTGlzdFtjb2xJbmRleF0uZmluZCgodCkgPT4gdC5hY3RpdmUpKTtcclxuICAgIG9wdGlvbi5hY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5jb2x1bW5MaXN0LnNwbGljZShjb2xJbmRleCArIDEpO1xyXG5cclxuICAgIGlmIChvcHRpb24uY2hpbGRyZW4gJiYgb3B0aW9uLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmNvbHVtbkxpc3QucHVzaChvcHRpb24uY2hpbGRyZW4pO1xyXG4gICAgICB0aGlzLm9wZW5EcmF3ZXIubmV4dCgpO1xyXG4gICAgfSBlbHNlIGlmIChpc2xhenlMb2FkKSB7XHJcbiAgICAgIG9wdGlvbi5fbG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICBjb25zdCBmbiA9IHRoaXMubG9hZENoaWxkcmVuRm4ob3B0aW9uKTtcclxuXHJcbiAgICAgIGlmICgoZm4gYXMgUHJvbWlzZTxDYXNjYWRlckl0ZW1bXT4pLnRoZW4pIHtcclxuICAgICAgICAoZm4gYXMgUHJvbWlzZTxDYXNjYWRlckl0ZW1bXT4pLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnNwbGljZShjb2xJbmRleCArIDEpOyAvLyDpmLLmraLlpJrkuKrlkIzml7bmh5LliqDovb3vvIzpgKDmiJDlpJrkvZnnmoTmt7vliqBcclxuICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbiA9IHJlcyB8fCBbXTtcclxuICAgICAgICAgIG9wdGlvbi5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnB1c2gocmVzIHx8IFtdKTtcclxuICAgICAgICAgIHRoaXMub3BlbkRyYXdlci5uZXh0KCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbkNoZWNrZWRTdGF0dXMob3B0aW9uLnZhbHVlLCBvcHRpb24uY2hlY2tlZCwgdHJ1ZSwgdHJ1ZSwgIXJlbG9hZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVsb2FkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc011bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVPcHRpb25CeVZhbHVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaG93VGV4dC5uZXh0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgKGZuIGFzIE9ic2VydmFibGU8Q2FzY2FkZXJJdGVtW10+KS5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnNwbGljZShjb2xJbmRleCArIDEpOyAvLyDpmLLmraLlpJrkuKrlkIzml7bmh5LliqDovb3vvIzpgKDmiJDlpJrkvZnnmoTmt7vliqBcclxuICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbiA9IHJlcyB8fCBbXTtcclxuICAgICAgICAgIG9wdGlvbi5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnB1c2gocmVzIHx8IFtdKTtcclxuICAgICAgICAgIHRoaXMub3BlbkRyYXdlci5uZXh0KCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbkNoZWNrZWRTdGF0dXMob3B0aW9uLnZhbHVlLCBvcHRpb24uY2hlY2tlZCwgdHJ1ZSwgdHJ1ZSwgIXJlbG9hZCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlbG9hZCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlT3B0aW9uQnlWYWx1ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2hvd1RleHQubmV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhclRhcmdldEFjdGl2ZShvcHRpb246IENhc2NhZGVySXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKCFvcHRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgb3B0aW9uLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgaWYgKG9wdGlvbi5jaGlsZHJlbikge1xyXG4gICAgICB0aGlzLmNsZWFyVGFyZ2V0QWN0aXZlKG9wdGlvbi5jaGlsZHJlbi5maW5kKCh0KSA9PiB0LmFjdGl2ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q3VycmVudFZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLmNvbHVtbkxpc3QubWFwKChsaXN0SXRlbSkgPT4gbGlzdEl0ZW0uZmluZCgob3B0aW9uSXRlbSkgPT4gb3B0aW9uSXRlbS5hY3RpdmUpPy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVPcHRpb25CeVZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXNldE5vZGVTdGF0dXMoKTtcclxuICAgIHRoaXMuY29sdW1uTGlzdCA9IFt0aGlzLm9wdGlvbnNdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuY3VycmVudFZhbHVlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbHVtbkxpc3RbaW5kZXhdPy5maW5kKChsaXN0SXRlbSkgPT4gbGlzdEl0ZW0udmFsdWUgPT09IHRoaXMuY3VycmVudFZhbHVlW2luZGV4XSk7XHJcblxyXG4gICAgICBpZiAodGFyZ2V0KSB7XHJcbiAgICAgICAgdGFyZ2V0LmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRhcmdldC5jaGlsZHJlbiAmJiB0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAvLyDmnInlrZDoj5zljZXlsZXlvIDlrZDoj5zljZVcclxuICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5wdXNoKHRhcmdldC5jaGlsZHJlbik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGF6eUxvYWQpIHtcclxuICAgICAgICAgIC8vIOaHkuWKoOi9veayoeacieWtkOiPnOWNleeahOaDheWGteS4i++8jOmdnuWPtuWtkOiKgueCueaJp+ihjOWxleW8gO+8jOWPtuWtkOiKgueCueaJp+ihjOmAieS4rVxyXG4gICAgICAgICAgdGhpcy5vcGVuQ29sdW1uKHRhcmdldCwgaW5kZXgsICF0YXJnZXQuaXNMZWFmLCAhdGFyZ2V0LmlzTGVhZik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxhenlsb2FkTXVsdGlwbGVDaGlsZCh0YXJnZXQ6IENhc2NhZGVySXRlbSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLmxhenlsb2FkQ2FjaGVbdGFyZ2V0LnZhbHVlXSkge1xyXG4gICAgICB0aGlzLmxhenlsb2FkQ2FjaGVbdGFyZ2V0LnZhbHVlXSA9IHRydWU7XHJcbiAgICAgIHRoaXMub3BlbkNvbHVtbih0YXJnZXQsIGluZGV4LCB0cnVlLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0Tm9kZVN0YXR1cyhvcHRpb246IENhc2NhZGVySXRlbVtdID0gdGhpcy5vcHRpb25zKTogdm9pZCB7XHJcbiAgICBvcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5oYWxmQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgIHRoaXMucmVzZXROb2RlU3RhdHVzKGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWcqOWkmumAieaooeW8j+S4i++8jOabtOaWsOiKgueCueagkeeahGNoZWNrZWTnirbmgIFcclxuICB1cGRhdGVPcHRpb25DaGVja2VkU3RhdHVzKHRhcmdldFZhbHVlOiBzdHJpbmcgfCBudW1iZXIsIGNoZWNrZWQ6IGJvb2xlYW4sIHVwd2FyZCA9IHRydWUsIGRvd253YXJkID0gdHJ1ZSwgaXNFbWl0ID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgbGV0IHRhcmdldE5vZGUgPSB0aGlzLm9wdGlvbnMuZmluZCgodCkgPT4gdC52YWx1ZSA9PT0gdGFyZ2V0VmFsdWUpO1xyXG4gICAgLy8g5b2T5Li75LiL5ouJ5YiX6KGo5YyF5ZCr5LqG55uu5qCH77yM5Y2z55uu5qCH5peg54i26IqC54K5XHJcbiAgICBpZiAodGFyZ2V0Tm9kZSkge1xyXG4gICAgICB0YXJnZXROb2RlLmNoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgICB0YXJnZXROb2RlLmhhbGZDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIGlmICh0YXJnZXROb2RlLmNoaWxkcmVuICYmIGRvd253YXJkKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbkNoZWNrZWQodGFyZ2V0Tm9kZSwgY2hlY2tlZCwgaXNFbWl0KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5b2T5a2Y5Zyo54i26IqC54K55pe277yM6ZyA6KaB5qOA5p+l5ZCM57qn6IqC54K55p2l56Gu5a6a54i26IqC54K554q25oCBXHJcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmdldFBhcmVudE5vZGUodGFyZ2V0VmFsdWUpO1xyXG4gICAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5maW5kKCh0KSA9PiB0LnZhbHVlID09PSB0YXJnZXRWYWx1ZSk7XHJcblxyXG4gICAgICB0YXJnZXROb2RlLmNoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgICB0YXJnZXROb2RlLmhhbGZDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIGlmICh1cHdhcmQpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudENoZWNrZWQocGFyZW50Tm9kZSwgaXNFbWl0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGFyZ2V0Tm9kZS5jaGlsZHJlbiAmJiBkb3dud2FyZCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5DaGVja2VkKHRhcmdldE5vZGUsIGNoZWNrZWQsIGlzRW1pdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWtkOiKgueCueaMieeItuiKgueCueeKtuaAgeabtOaWsFxyXG4gIHVwZGF0ZUNoaWxkcmVuQ2hlY2tlZChub2RlOiBDYXNjYWRlckl0ZW0sIGNoZWNrZWQ6IGJvb2xlYW4sIGlzRW1pdDogYm9vbGVhbikge1xyXG4gICAgbGV0IGhhc0Rpc2FibGUgPSBmYWxzZTtcclxuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgaWYgKCFjaGlsZC5kaXNhYmxlZCkge1xyXG4gICAgICAgIGNoaWxkLmNoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgICAgIGNoaWxkLmhhbGZDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2FuU2VsZWN0UGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGFnTGlzdC5uZXh0KHtcclxuICAgICAgICAgICAgICBpc0FkZDogY2hlY2tlZCxcclxuICAgICAgICAgICAgICBvcHRpb246IGNoaWxkLFxyXG4gICAgICAgICAgICAgIGlzRW1pdCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuQ2hlY2tlZChjaGlsZCwgY2hlY2tlZCwgaXNFbWl0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVUYWdMaXN0Lm5leHQoe1xyXG4gICAgICAgICAgICBpc0FkZDogY2hlY2tlZCxcclxuICAgICAgICAgICAgb3B0aW9uOiBjaGlsZCxcclxuICAgICAgICAgICAgaXNFbWl0LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGhhc0Rpc2FibGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoaGFzRGlzYWJsZSAmJiAhdGhpcy5jYW5TZWxlY3RQYXJlbnQpIHtcclxuICAgICAgdGhpcy51cGRhdGVQYXJlbnRDaGVja2VkKG5vZGUsIGlzRW1pdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDniLboioLngrnmjInmiYDmnInlrZDoioLngrnnirbmgIHmm7TmlrBcclxuICB1cGRhdGVQYXJlbnRDaGVja2VkKG5vZGU6IENhc2NhZGVySXRlbSwgaXNFbWl0OiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBjaGVja2VkQ2hpbGQgPSBub2RlLmNoaWxkcmVuLmZpbmQoKHQpID0+IHQuY2hlY2tlZCk7XHJcbiAgICBjb25zdCBoYWxmY2hlY2tlZENoaWxkID0gbm9kZS5jaGlsZHJlbi5maW5kKCh0KSA9PiB0LmhhbGZDaGVja2VkKTtcclxuICAgIGNvbnN0IHVuY2hlY2tlZENoaWxkID0gbm9kZS5jaGlsZHJlbi5maW5kKCh0KSA9PiAhdC5oYWxmQ2hlY2tlZCAmJiAhdC5jaGVja2VkKTtcclxuXHJcbiAgICBpZiAoaGFsZmNoZWNrZWRDaGlsZCB8fCAoY2hlY2tlZENoaWxkICYmIHVuY2hlY2tlZENoaWxkKSkge1xyXG4gICAgICBub2RlLmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgbm9kZS5oYWxmQ2hlY2tlZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKCFjaGVja2VkQ2hpbGQgJiYgIWhhbGZjaGVja2VkQ2hpbGQpIHtcclxuICAgICAgbm9kZS5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIG5vZGUuaGFsZkNoZWNrZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgIG5vZGUuaGFsZkNoZWNrZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jYW5TZWxlY3RQYXJlbnQpIHtcclxuICAgICAgdGhpcy51cGRhdGVUYWdMaXN0Lm5leHQoe1xyXG4gICAgICAgIGlzQWRkOiBub2RlLmNoZWNrZWQsXHJcbiAgICAgICAgb3B0aW9uOiBub2RlLFxyXG4gICAgICAgIGlzRW1pdCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5q2k6IqC54K56Z2e5qC56IqC54K577yM5YiZ57un57ut5om+5a6D55qE54i26IqC54K56L+b6KGM5pu05pawXHJcbiAgICBpZiAoIW5vZGUuaXNSb290KSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFyZW50Q2hlY2tlZCh0aGlzLmdldFBhcmVudE5vZGUobm9kZS52YWx1ZSksIGlzRW1pdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bniLboioLngrlcclxuICBnZXRQYXJlbnROb2RlKGNoaWxkVmFsdWU6IHN0cmluZyB8IG51bWJlcik6IENhc2NhZGVySXRlbSB7XHJcbiAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLm9wdGlvbnNdO1xyXG4gICAgbGV0IGN1cjogQ2FzY2FkZXJJdGVtO1xyXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xyXG4gICAgICBjdXIgPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgICBpZiAoY3VyLmNoaWxkcmVuICYmIGN1ci5jaGlsZHJlbi5maW5kKCh0KSA9PiB0LnZhbHVlID09PSBjaGlsZFZhbHVlKSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jaGlsZHJlbikge1xyXG4gICAgICAgIHF1ZXVlLnB1c2goLi4uY3VyLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cjtcclxuICB9XHJcblxyXG4gIGdldE11bHRpcGxlVmFsdWUodmFsdWUsIG9wdGlvbjogQ2FzY2FkZXJJdGVtW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzTm9SZWxhdGlvbiA9ICF0aGlzLmNoZWNrYm94UmVsYXRpb24uZG93bndhcmQgfHwgIXRoaXMuY2hlY2tib3hSZWxhdGlvbi51cHdhcmQ7XHJcbiAgICBvcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBfdmFsdWUgPSBbLi4udmFsdWVdO1xyXG4gICAgICBfdmFsdWUucHVzaChpdGVtLnZhbHVlKTtcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggJiYgKGl0ZW0uY2hlY2tlZCB8fCBpdGVtLmhhbGZDaGVja2VkKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0TXVsdGlwbGVWYWx1ZShfdmFsdWUsIGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgICAgIGlmIChpc05vUmVsYXRpb24pIHtcclxuICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZS5wdXNoKF92YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZS5wdXNoKF92YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNOb1JlbGF0aW9uICYmIGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuZ2V0TXVsdGlwbGVWYWx1ZShfdmFsdWUsIGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsb3NlQWxsRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsb3NlTWlhbkRyb3Bkb3duLm5leHQoKTtcclxuICB9XHJcblxyXG4gIC8vIOaQnOe0ouWKn+iDvVxyXG4gIHNlYXJjaEJ5U3RyaW5nKHN0cjogc3RyaW5nLCBjdXJyZW50bGFiZWw/OiBzdHJpbmcsIGN1cnJlbnRWYWx1ZTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9IFtdLCBsaXN0ID0gdGhpcy5vcHRpb25zKTogdm9pZCB7XHJcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgbGFiZWwgPSBjdXJyZW50bGFiZWwgPyBjdXJyZW50bGFiZWwgKyAnIC8gJyArIGl0ZW0ubGFiZWwgOiBpdGVtLmxhYmVsO1xyXG4gICAgICBjb25zdCB2YWx1ZUxpc3QgPSBbLi4uY3VycmVudFZhbHVlLCBpdGVtLnZhbHVlXTtcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaEJ5U3RyaW5nKHN0ciwgbGFiZWwsIHZhbHVlTGlzdCwgaXRlbS5jaGlsZHJlbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCFpdGVtLmRpc2FibGVkICYmIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzdHIudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdExpc3QucHVzaCh7XHJcbiAgICAgICAgICAgIGxhYmVsLFxyXG4gICAgICAgICAgICB2YWx1ZUxpc3QsXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IGl0ZW0uY2hlY2tlZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xvc2VNaWFuRHJvcGRvd24uY29tcGxldGUoKTtcclxuICAgIHRoaXMuY3VycmVudFZhbHVlQ2hhbmdlLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVRhZ0xpc3QuY29tcGxldGUoKTtcclxuICAgIHRoaXMucmVzZXRTdGF0dXMuY29tcGxldGUoKTtcclxuICAgIHRoaXMub3BlbkRyYXdlci5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=