UNPKG

ng-devui

Version:

DevUI components based on Angular

256 lines 42 kB
import { DOCUMENT } from '@angular/common'; import { Inject, Injectable, NgZone } from '@angular/core'; import { Subject, Subscription } from 'rxjs'; import { Utils } from '../shared/utils'; import { DragDropTouch } from '../touch-support/dragdrop-touch'; import * as i0 from "@angular/core"; export class DragDropService { constructor(ngZone, doc) { this.ngZone = ngZone; this.doc = doc; this.dropTargets = []; this.dropEvent = new Subject(); this.dragEndEvent = new Subject(); this.dragStartEvent = new Subject(); this.subscription = new Subscription(); this.dragEmptyImage = new Image(); this.dragItemParentName = ''; this.dragItemChildrenName = ''; this.intersectionObserver = null; /* 协同拖拽需要 */ this.dragElShowHideEvent = new Subject(); this.followMouse4CloneNode = (event) => { const { offsetLeft, offsetTop } = this.dragOffset; const { clientX, clientY } = event; requestAnimationFrame(() => { if (!this.dragCloneNode) { return; } this.dragCloneNode.style.left = clientX - offsetLeft + 'px'; this.dragCloneNode.style.top = clientY - offsetTop + 'px'; }); }; this.touchInstance = DragDropTouch.getInstance(); // service not support OnInit, only support OnDestroy, so write in constructor // safari的img必须要有src this.dragEmptyImage.src = 'data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg=='; this.document = this.doc; } newSubscription() { this.subscription.unsubscribe(); // eslint-disable-next-line no-return-assign return (this.subscription = new Subscription()); } enableDraggedCloneNodeFollowMouse() { if (!this.dragCloneNode) { this.dragItemContainer = this.draggedEl.parentElement; if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) { this.dragPreviewDirective.createPreview(); this.dragCloneNode = this.dragPreviewDirective.getPreviewElement(); this.dragItemContainer = this.document.body; } else { this.dragCloneNode = this.draggedEl.cloneNode(true); } this.dragCloneNode.style.margin = '0'; if (this.dragFollowOptions && this.dragFollowOptions.appendToBody) { this.dragItemContainer = this.document.body; this.copyStyle(this.draggedEl, this.dragCloneNode); } if (this.dragItemChildrenName !== '') { const parentElement = this.dragItemParentName === '' ? this.dragCloneNode : this.document.querySelector(this.dragItemParentName); const dragItemChildren = parentElement.querySelectorAll(this.dragItemChildrenName); this.interceptChildNode(parentElement, dragItemChildren); } // 拷贝canvas的内容 const originCanvasArr = this.draggedEl.querySelectorAll('canvas'); const targetCanvasArr = this.dragCloneNode.querySelectorAll('canvas'); [].forEach.call(targetCanvasArr, (canvas, index) => { canvas.getContext('2d').drawImage(originCanvasArr[index], 0, 0); }); this.ngZone.runOutsideAngular(() => { this.document.addEventListener('dragover', this.followMouse4CloneNode, { capture: true, passive: true }); }); this.dragCloneNode.style.width = this.dragOffset.width + 'px'; this.dragCloneNode.style.height = this.dragOffset.height + 'px'; if (!(this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate && this.dragPreviewDirective.dragPreviewOptions && this.dragPreviewDirective.dragPreviewOptions.skipBatchPreview)) { // 批量拖拽样式 if (this.batchDragging && this.batchDragData && this.batchDragData.length > 1) { // 创建一个节点容器 const node = this.document.createElement('div'); node.appendChild(this.dragCloneNode); node.classList.add('batch-dragged-node'); /* 计数样式定位 */ if (this.batchDragStyle && this.batchDragStyle.length && this.batchDragStyle.indexOf('badge') > -1) { const badge = this.document.createElement('div'); badge.innerText = String(this.batchDragData.length); badge.classList.add('batch-dragged-node-count'); node.style.position = 'relative'; const style = { position: 'absolute', right: '5px', top: '-12px', height: '24px', width: '24px', borderRadius: '12px', fontSize: '14px', lineHeight: '24px', textAlign: 'center', color: '#fff', background: ['#5170ff', 'var(--brand-1, #5170ff)'], }; Utils.addElStyles(badge, style); node.appendChild(badge); } /* 层叠感样式定位 */ if (this.batchDragStyle && this.batchDragStyle.length && this.batchDragStyle.indexOf('stack') > -1) { let stack = 2; if (this.batchDragData.length === 2) { stack = 1; } for (let i = 0; i < stack; i++) { const stackNode = this.dragCloneNode.cloneNode(false); const stackStyle = { position: 'absolute', left: -5 * (i + 1) + 'px', top: -5 * (i + 1) + 'px', zIndex: String(-(i + 1)), width: this.dragOffset.width + 'px', height: this.dragOffset.height + 'px', background: '#fff', border: ['1px solid #5170ff', '1px solid var(--brand-1, #5170ff)'], }; Utils.addElStyles(stackNode, stackStyle); node.appendChild(stackNode); } } this.dragCloneNode = node; } } this.dragCloneNode.classList.add('drag-clone-node'); if (!(this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate)) { this.dragCloneNode.style.width = this.dragOffset.width + 'px'; this.dragCloneNode.style.height = this.dragOffset.height + 'px'; } this.dragCloneNode.style.position = 'fixed'; this.dragCloneNode.style.zIndex = '1090'; this.dragCloneNode.style.pointerEvents = 'none'; this.dragCloneNode.style.top = this.dragOffset.top + 'px'; this.dragCloneNode.style.left = this.dragOffset.left + 'px'; this.dragCloneNode.style.willChange = 'left, top'; this.dragItemContainer.appendChild(this.dragCloneNode); this.ngZone.runOutsideAngular(() => { setTimeout(() => { if (this.draggedEl) { this.draggedEl.style.display = 'none'; this.dragElShowHideEvent.next(false); if (this.dragOriginPlaceholder) { this.dragOriginPlaceholder.style.display = 'block'; } } }); }); } } disableDraggedCloneNodeFollowMouse() { if (this.dragCloneNode) { this.document.removeEventListener('dragover', this.followMouse4CloneNode, { capture: true }); this.dragItemContainer.removeChild(this.dragCloneNode); this.draggedEl.style.display = ''; this.dragElShowHideEvent.next(true); } if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) { this.dragPreviewDirective.destroyPreview(); } this.dragCloneNode = undefined; this.dragItemContainer = undefined; if (this.intersectionObserver) { this.intersectionObserver.disconnect(); } } interceptChildNode(parentNode, childNodeList) { const interceptOptions = { root: parentNode, }; this.intersectionObserver = new IntersectionObserver(this.setChildNodeHide, interceptOptions); [].forEach.call(childNodeList, (childNode) => { this.intersectionObserver.observe(childNode); }); } setChildNodeHide(entries) { entries.forEach((element) => { const { isIntersecting, target: childNode } = element; if (isIntersecting) { childNode.style.display = 'block'; } else { childNode.style.display = 'none'; } }); } getBatchDragData(identity, order = 'draggedElFirst') { const result = this.batchDragData.map((dragData) => dragData.dragData); if (typeof order === 'function') { result.sort(order); } else if (order === 'draggedElFirst') { let dragData = this.dragData; if (identity) { const realDragData = this.batchDragData.filter((dd) => dd.identity === identity).pop().dragData; dragData = realDragData; } result.splice(result.indexOf(dragData), 1); result.splice(0, 0, dragData); } return result; } /** usage: * constructor(..., private dragDropService: DragDropService) {} * cleanBatchDragData() { this.dragDropService.cleanBatchDragData(); } */ cleanBatchDragData() { const batchDragData = this.batchDragData; if (this.batchDragData) { this.batchDragData .filter((dragData) => dragData.draggable) .map((dragData) => dragData.draggable) .forEach((draggable) => { draggable.batchDraggable.dragData = undefined; }); this.batchDragData = undefined; this.batchDragGroup = undefined; } return batchDragData; } copyStyle(source, target) { ['id', 'class', 'style', 'draggable'].forEach((att) => { target.removeAttribute(att); }); // copy style (without transitions) const computedStyle = getComputedStyle(source); for (let i = 0; i < computedStyle.length; i++) { const key = computedStyle[i]; if (key.indexOf('transition') < 0) { target.style[key] = computedStyle[key]; } } target.style.pointerEvents = 'none'; // and repeat for all children for (let i = 0; i < source.children.length; i++) { this.copyStyle(source.children[i], target.children[i]); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DragDropService, deps: [{ token: i0.NgZone }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DragDropService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DragDropService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i0.NgZone }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kZXZ1aS9kcmFnZHJvcC9zZXJ2aWNlcy9kcmFnLWRyb3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBSWhFLE1BQU0sT0FBTyxlQUFlO0lBbUQxQixZQUFvQixNQUFjLEVBQTRCLEdBQVE7UUFBbEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUE0QixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBdEN0RSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixjQUFTLEdBQWlCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ2xDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQWdCcEMsaUJBQVksR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxtQkFBYyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFJN0IsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQix5QkFBb0IsR0FBUSxJQUFJLENBQUM7UUFLakMsWUFBWTtRQUNaLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUF3TDdDLDBCQUFxQixHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxFQUFFLFVB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Q2hELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7K0dBdFNVLGVBQWUsd0NBbURrQixRQUFRO21IQW5EekMsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBb0Q0QixNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEcmFnUHJldmlld0RpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZHJhZy1wcmV2aWV3LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vc2hhcmVkL3V0aWxzJztcclxuaW1wb3J0IHsgRHJhZ0Ryb3BUb3VjaCB9IGZyb20gJy4uL3RvdWNoLXN1cHBvcnQvZHJhZ2Ryb3AtdG91Y2gnO1xyXG5pbXBvcnQgeyBEcmFnZ2FibGVEaXJlY3RpdmUgfSBmcm9tICcuLy4uL2RpcmVjdGl2ZXMvZHJhZ2dhYmxlLmRpcmVjdGl2ZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEcmFnRHJvcFNlcnZpY2Uge1xyXG4gIGRyYWdEYXRhOiBhbnk7XHJcbiAgZHJhZ2dlZEVsOiBhbnk7XHJcbiAgZHJhZ2dlZEVsSWRlbnRpdHk6IGFueTtcclxuICBiYXRjaERyYWdEYXRhOiBBcnJheTx7XHJcbiAgICBpZGVudGl0eT86IGFueTtcclxuICAgIGRyYWdnYWJsZTogRHJhZ2dhYmxlRGlyZWN0aXZlO1xyXG4gICAgZHJhZ0RhdGE6IGFueTtcclxuICB9PjtcclxuICBiYXRjaERyYWdHcm91cDogc3RyaW5nO1xyXG4gIGJhdGNoRHJhZ1N0eWxlOiBBcnJheTxzdHJpbmc+O1xyXG4gIGJhdGNoRHJhZ2dpbmc6IGJvb2xlYW47XHJcbiAgc2NvcGU6IHN0cmluZyB8IEFycmF5PHN0cmluZz47XHJcbiAgZHJvcFRhcmdldHMgPSBbXTtcclxuICBkcm9wRXZlbnQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgZHJhZ0VuZEV2ZW50ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIGRyYWdTdGFydEV2ZW50ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIGRyb3BPbkl0ZW06IGJvb2xlYW47XHJcbiAgZHJhZ0ZvbGxvdzogYm9vbGVhbjtcclxuICBkcmFnRm9sbG93T3B0aW9uczoge1xyXG4gICAgYXBwZW5kVG9Cb2R5PzogYm9vbGVhbjtcclxuICB9O1xyXG4gIGRyb3BPbk9yaWdpbjogYm9vbGVhbjtcclxuICBkcmFnZ2VkRWxGb2xsb3dpbmdNb3VzZTogYm9vbGVhbjtcclxuICBkcmFnT2Zmc2V0OiB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcclxuICAgIG9mZnNldFRvcDogbnVtYmVyO1xyXG4gICAgd2lkdGg/OiBudW1iZXI7XHJcbiAgICBoZWlnaHQ/OiBudW1iZXI7XHJcbiAgfTtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBkcmFnRW1wdHlJbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gIGRyYWdDbG9uZU5vZGU6IGFueTtcclxuICBkcmFnT3JpZ2luUGxhY2Vob2xkZXI6IGFueTtcclxuICBkcmFnSXRlbUNvbnRhaW5lcjogYW55O1xyXG4gIGRyYWdJdGVtUGFyZW50TmFtZSA9ICcnO1xyXG4gIGRyYWdJdGVtQ2hpbGRyZW5OYW1lID0gJyc7XHJcbiAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI6IGFueSA9IG51bGw7XHJcbiAgc3ViO1xyXG4gIGRyYWdPcmlnaW5QbGFjZWhvbGRlck5leHRTaWJsaW5nOiBhbnk7XHJcbiAgdG91Y2hJbnN0YW5jZTtcclxuXHJcbiAgLyog5Y2P5ZCM5ouW5ou96ZyA6KaBICovXHJcbiAgZHJhZ0VsU2hvd0hpZGVFdmVudCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgZHJhZ1N5bmNHcm91cERpcmVjdGl2ZXM7XHJcbiAgLyog6aKE6KeI5Yqf6IO9ICovXHJcbiAgZHJhZ1ByZXZpZXdEaXJlY3RpdmU6IERyYWdQcmV2aWV3RGlyZWN0aXZlO1xyXG4gIGRvY3VtZW50OiBEb2N1bWVudDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueSkge1xyXG4gICAgdGhpcy50b3VjaEluc3RhbmNlID0gRHJhZ0Ryb3BUb3VjaC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgLy8gc2VydmljZSBub3Qgc3VwcG9ydCBPbkluaXQsIG9ubHkgc3VwcG9ydCBPbkRlc3Ryb3ksIHNvIHdyaXRlIGluIGNvbnN0cnVjdG9yXHJcbiAgICAvLyBzYWZhcmnnmoRpbWflv4XpobvopoHmnIlzcmNcclxuICAgIHRoaXMuZHJhZ0VtcHR5SW1hZ2Uuc3JjID1cclxuICAgICAgJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFEVWxFUVZRSW1XTmdZR0JnQUFBQUJRQUJoNkZPMUFBQUFBQkpSVTVFcmtKZ2dnPT0nO1xyXG4gICAgdGhpcy5kb2N1bWVudCA9IHRoaXMuZG9jO1xyXG4gIH1cclxuICBuZXdTdWJzY3JpcHRpb24oKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJldHVybi1hc3NpZ25cclxuICAgIHJldHVybiAodGhpcy5zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCkpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlRHJhZ2dlZENsb25lTm9kZUZvbGxvd01vdXNlKCkge1xyXG4gICAgaWYgKCF0aGlzLmRyYWdDbG9uZU5vZGUpIHtcclxuICAgICAgdGhpcy5kcmFnSXRlbUNvbnRhaW5lciA9IHRoaXMuZHJhZ2dlZEVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgIGlmICh0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlICYmIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZHJhZ1ByZXZpZXdUZW1wbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuY3JlYXRlUHJldmlldygpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZSA9IHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZ2V0UHJldmlld0VsZW1lbnQoKTtcclxuICAgICAgICB0aGlzLmRyYWdJdGVtQ29udGFpbmVyID0gdGhpcy5kb2N1bWVudC5ib2R5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZSA9IHRoaXMuZHJhZ2dlZEVsLmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgaWYgKHRoaXMuZHJhZ0ZvbGxvd09wdGlvbnMgJiYgdGhpcy5kcmFnRm9sbG93T3B0aW9ucy5hcHBlbmRUb0JvZHkpIHtcclxuICAgICAgICB0aGlzLmRyYWdJdGVtQ29udGFpbmVyID0gdGhpcy5kb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIHRoaXMuY29weVN0eWxlKHRoaXMuZHJhZ2dlZEVsLCB0aGlzLmRyYWdDbG9uZU5vZGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5kcmFnSXRlbUNoaWxkcmVuTmFtZSAhPT0gJycpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5kcmFnSXRlbVBhcmVudE5hbWUgPT09ICcnID8gdGhpcy5kcmFnQ2xvbmVOb2RlIDogdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZHJhZ0l0ZW1QYXJlbnROYW1lKTtcclxuICAgICAgICBjb25zdCBkcmFnSXRlbUNoaWxkcmVuID0gcGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuZHJhZ0l0ZW1DaGlsZHJlbk5hbWUpO1xyXG4gICAgICAgIHRoaXMuaW50ZXJjZXB0Q2hpbGROb2RlKHBhcmVudEVsZW1lbnQsIGRyYWdJdGVtQ2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOaLt+i0nWNhbnZhc+eahOWGheWuuVxyXG4gICAgICBjb25zdCBvcmlnaW5DYW52YXNBcnIgPSB0aGlzLmRyYWdnZWRFbC5xdWVyeVNlbGVjdG9yQWxsKCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgdGFyZ2V0Q2FudmFzQXJyID0gdGhpcy5kcmFnQ2xvbmVOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NhbnZhcycpO1xyXG4gICAgICBbXS5mb3JFYWNoLmNhbGwodGFyZ2V0Q2FudmFzQXJyLCAoY2FudmFzLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShvcmlnaW5DYW52YXNBcnJbaW5kZXhdLCAwLCAwKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZm9sbG93TW91c2U0Q2xvbmVOb2RlLCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUud2lkdGggPSB0aGlzLmRyYWdPZmZzZXQud2lkdGggKyAncHgnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcmFnT2Zmc2V0LmhlaWdodCArICdweCc7XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIShcclxuICAgICAgICAgIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUgJiZcclxuICAgICAgICAgIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZHJhZ1ByZXZpZXdUZW1wbGF0ZSAmJlxyXG4gICAgICAgICAgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld09wdGlvbnMgJiZcclxuICAgICAgICAgIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZHJhZ1ByZXZpZXdPcHRpb25zLnNraXBCYXRjaFByZXZpZXdcclxuICAgICAgICApXHJcbiAgICAgICkge1xyXG4gICAgICAgIC8vIOaJuemHj+aLluaLveagt+W8j1xyXG4gICAgICAgIGlmICh0aGlzLmJhdGNoRHJhZ2dpbmcgJiYgdGhpcy5iYXRjaERyYWdEYXRhICYmIHRoaXMuYmF0Y2hEcmFnRGF0YS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAvLyDliJvlu7rkuIDkuKroioLngrnlrrnlmahcclxuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZU5vZGUpO1xyXG4gICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdiYXRjaC1kcmFnZ2VkLW5vZGUnKTtcclxuXHJcbiAgICAgICAgICAvKiDorqHmlbDmoLflvI/lrprkvY0gKi9cclxuICAgICAgICAgIGlmICh0aGlzLmJhdGNoRHJhZ1N0eWxlICYmIHRoaXMuYmF0Y2hEcmFnU3R5bGUubGVuZ3RoICYmIHRoaXMuYmF0Y2hEcmFnU3R5bGUuaW5kZXhPZignYmFkZ2UnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhZGdlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgYmFkZ2UuaW5uZXJUZXh0ID0gU3RyaW5nKHRoaXMuYmF0Y2hEcmFnRGF0YS5sZW5ndGgpO1xyXG4gICAgICAgICAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdiYXRjaC1kcmFnZ2VkLW5vZGUtY291bnQnKTtcclxuICAgICAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxyXG4gICAgICAgICAgICAgIHJpZ2h0OiAnNXB4JyxcclxuICAgICAgICAgICAgICB0b3A6ICctMTJweCcsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0OiAnMjRweCcsXHJcbiAgICAgICAgICAgICAgd2lkdGg6ICcyNHB4JyxcclxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcclxuICAgICAgICAgICAgICBmb250U2l6ZTogJzE0cHgnLFxyXG4gICAgICAgICAgICAgIGxpbmVIZWlnaHQ6ICcyNHB4JyxcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXHJcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDogWycjNTE3MGZmJywgJ3ZhcigtLWJyYW5kLTEsICM1MTcwZmYpJ10sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFV0aWxzLmFkZEVsU3R5bGVzKGJhZGdlLCBzdHlsZSk7XHJcbiAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8qIOWxguWPoOaEn+agt+W8j+WumuS9jSAqL1xyXG4gICAgICAgICAgaWYgKHRoaXMuYmF0Y2hEcmFnU3R5bGUgJiYgdGhpcy5iYXRjaERyYWdTdHlsZS5sZW5ndGggJiYgdGhpcy5iYXRjaERyYWdTdHlsZS5pbmRleE9mKCdzdGFjaycpID4gLTEpIHtcclxuICAgICAgICAgICAgbGV0IHN0YWNrID0gMjtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYmF0Y2hEcmFnRGF0YS5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgICBzdGFjayA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFjazsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3RhY2tOb2RlID0gdGhpcy5kcmFnQ2xvbmVOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3RhY2tTdHlsZSA9IHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxyXG4gICAgICAgICAgICAgICAgbGVmdDogLTUgKiAoaSArIDEpICsgJ3B4JyxcclxuICAgICAgICAgICAgICAgIHRvcDogLTUgKiAoaSArIDEpICsgJ3B4JyxcclxuICAgICAgICAgICAgICAgIHpJbmRleDogU3RyaW5nKC0oaSArIDEpKSxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmRyYWdPZmZzZXQud2lkdGggKyAncHgnLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmRyYWdPZmZzZXQuaGVpZ2h0ICsgJ3B4JyxcclxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJyxcclxuICAgICAgICAgICAgICAgIGJvcmRlcjogWycxcHggc29saWQgIzUxNzBmZicsICcxcHggc29saWQgdmFyKC0tYnJhbmQtMSwgIzUxNzBmZiknXSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIFV0aWxzLmFkZEVsU3R5bGVzKHN0YWNrTm9kZSwgc3RhY2tTdHlsZSk7XHJcbiAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdGFja05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUgPSBub2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLmNsYXNzTGlzdC5hZGQoJ2RyYWctY2xvbmUtbm9kZScpO1xyXG4gICAgICBpZiAoISh0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlICYmIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZHJhZ1ByZXZpZXdUZW1wbGF0ZSkpIHtcclxuICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUud2lkdGggPSB0aGlzLmRyYWdPZmZzZXQud2lkdGggKyAncHgnO1xyXG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS5oZWlnaHQgPSB0aGlzLmRyYWdPZmZzZXQuaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUuekluZGV4ID0gJzEwOTAnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnRvcCA9IHRoaXMuZHJhZ09mZnNldC50b3AgKyAncHgnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ09mZnNldC5sZWZ0ICsgJ3B4JztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLndpbGxDaGFuZ2UgPSAnbGVmdCwgdG9wJztcclxuICAgICAgdGhpcy5kcmFnSXRlbUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZU5vZGUpO1xyXG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kcmFnZ2VkRWwpIHtcclxuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgdGhpcy5kcmFnRWxTaG93SGlkZUV2ZW50Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcmFnT3JpZ2luUGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgICB0aGlzLmRyYWdPcmlnaW5QbGFjZWhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpc2FibGVEcmFnZ2VkQ2xvbmVOb2RlRm9sbG93TW91c2UoKSB7XHJcbiAgICBpZiAodGhpcy5kcmFnQ2xvbmVOb2RlKSB7XHJcbiAgICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmZvbGxvd01vdXNlNENsb25lTm9kZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xyXG4gICAgICB0aGlzLmRyYWdJdGVtQ29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuZHJhZ0Nsb25lTm9kZSk7XHJcbiAgICAgIHRoaXMuZHJhZ2dlZEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgICAgdGhpcy5kcmFnRWxTaG93SGlkZUV2ZW50Lm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZSAmJiB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRyYWdQcmV2aWV3VGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kZXN0cm95UHJldmlldygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kcmFnQ2xvbmVOb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5kcmFnSXRlbUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xyXG4gICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGludGVyY2VwdENoaWxkTm9kZShwYXJlbnROb2RlLCBjaGlsZE5vZGVMaXN0KSB7XHJcbiAgICBjb25zdCBpbnRlcmNlcHRPcHRpb25zID0ge1xyXG4gICAgICByb290OiBwYXJlbnROb2RlLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5zZXRDaGlsZE5vZGVIaWRlLCBpbnRlcmNlcHRPcHRpb25zKTtcclxuICAgIFtdLmZvckVhY2guY2FsbChjaGlsZE5vZGVMaXN0LCAoY2hpbGROb2RlKSA9PiB7XHJcbiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShjaGlsZE5vZGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRDaGlsZE5vZGVIaWRlKGVudHJpZXMpIHtcclxuICAgIGVudHJpZXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zdCB7IGlzSW50ZXJzZWN0aW5nLCB0YXJnZXQ6IGNoaWxkTm9kZSB9ID0gZWxlbWVudDtcclxuICAgICAgaWYgKGlzSW50ZXJzZWN0aW5nKSB7XHJcbiAgICAgICAgY2hpbGROb2RlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNoaWxkTm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvbGxvd01vdXNlNENsb25lTm9kZSA9IChldmVudCkgPT4ge1xyXG4gICAgY29uc3QgeyBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSA9IHRoaXMuZHJhZ09mZnNldDtcclxuICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gZXZlbnQ7XHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lTm9kZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUubGVmdCA9IGNsaWVudFggLSBvZmZzZXRMZWZ0ICsgJ3B4JztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnRvcCA9IGNsaWVudFkgLSBvZmZzZXRUb3AgKyAncHgnO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgZ2V0QmF0Y2hEcmFnRGF0YShpZGVudGl0eT8sIG9yZGVyOiAoKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIpIHwgJ3NlbGVjdCcgfCAnZHJhZ2dlZEVsRmlyc3QnID0gJ2RyYWdnZWRFbEZpcnN0Jykge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5iYXRjaERyYWdEYXRhLm1hcCgoZHJhZ0RhdGEpID0+IGRyYWdEYXRhLmRyYWdEYXRhKTtcclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmVzdWx0LnNvcnQoPChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyPm9yZGVyKTtcclxuICAgIH0gZWxzZSBpZiAob3JkZXIgPT09ICdkcmFnZ2VkRWxGaXJzdCcpIHtcclxuICAgICAgbGV0IGRyYWdEYXRhID0gdGhpcy5kcmFnRGF0YTtcclxuICAgICAgaWYgKGlkZW50aXR5KSB7XHJcbiAgICAgICAgY29uc3QgcmVhbERyYWdEYXRhID0gdGhpcy5iYXRjaERyYWdEYXRhLmZpbHRlcigoZGQpID0+IGRkLmlkZW50aXR5ID09PSBpZGVudGl0eSkucG9wKCkuZHJhZ0RhdGE7XHJcbiAgICAgICAgZHJhZ0RhdGEgPSByZWFsRHJhZ0RhdGE7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0LnNwbGljZShyZXN1bHQuaW5kZXhPZihkcmFnRGF0YSksIDEpO1xyXG4gICAgICByZXN1bHQuc3BsaWNlKDAsIDAsIGRyYWdEYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKiogdXNhZ2U6XHJcbiAgICogY29uc3RydWN0b3IoLi4uLCBwcml2YXRlIGRyYWdEcm9wU2VydmljZTogRHJhZ0Ryb3BTZXJ2aWNlKSB7fVxyXG4gICAqIGNsZWFuQmF0Y2hEcmFnRGF0YSgpIHsgdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2xlYW5CYXRjaERyYWdEYXRhKCk7IH1cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYW5CYXRjaERyYWdEYXRhKCkge1xyXG4gICAgY29uc3QgYmF0Y2hEcmFnRGF0YSA9IHRoaXMuYmF0Y2hEcmFnRGF0YTtcclxuICAgIGlmICh0aGlzLmJhdGNoRHJhZ0RhdGEpIHtcclxuICAgICAgdGhpcy5iYXRjaERyYWdEYXRhXHJcbiAgICAgICAgLmZpbHRlcigoZHJhZ0RhdGEpID0+IGRyYWdEYXRhLmRyYWdnYWJsZSlcclxuICAgICAgICAubWFwKChkcmFnRGF0YSkgPT4gZHJhZ0RhdGEuZHJhZ2dhYmxlKVxyXG4gICAgICAgIC5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcclxuICAgICAgICAgIGRyYWdnYWJsZS5iYXRjaERyYWdnYWJsZS5kcmFnRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgICAgdGhpcy5iYXRjaERyYWdEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmJhdGNoRHJhZ0dyb3VwID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhdGNoRHJhZ0RhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29weVN0eWxlKHNvdXJjZSwgdGFyZ2V0KSB7XHJcbiAgICBbJ2lkJywgJ2NsYXNzJywgJ3N0eWxlJywgJ2RyYWdnYWJsZSddLmZvckVhY2goKGF0dCkgPT4ge1xyXG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb3B5IHN0eWxlICh3aXRob3V0IHRyYW5zaXRpb25zKVxyXG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoc291cmNlKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcHV0ZWRTdHlsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBrZXkgPSBjb21wdXRlZFN0eWxlW2ldO1xyXG4gICAgICBpZiAoa2V5LmluZGV4T2YoJ3RyYW5zaXRpb24nKSA8IDApIHtcclxuICAgICAgICB0YXJnZXQuc3R5bGVba2V5XSA9IGNvbXB1dGVkU3R5bGVba2V5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGFyZ2V0LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XHJcbiAgICAvLyBhbmQgcmVwZWF0IGZvciBhbGwgY2hpbGRyZW5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuY29weVN0eWxlKHNvdXJjZS5jaGlsZHJlbltpXSwgdGFyZ2V0LmNoaWxkcmVuW2ldKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19