UNPKG

ng-cw-v12

Version:

Angular UI component library

381 lines 63.9 kB
import { Directive, Input, HostListener } from '@angular/core'; import * as i0 from "@angular/core"; export class ImgPreviewDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; this.ncImgPreview = ''; // 可选的大图URL,如果不提供则使用原图 this.ncMinScale = 0.5; // 最小缩放比例 this.ncMaxScale = 5; // 最大缩放比例 this.ncScaleStep = 0.25; // 缩放步长 /** 滚轮缩放 */ this._wheelScale = false; this.previewContainer = null; this.previewImg = null; this.toolbar = null; this.isPreviewOpen = false; // 图片变换状态 this.rotation = 0; // 旋转角度 this.scale = 1; // 缩放比例 // 工具按钮引用 this.zoomInBtn = null; this.zoomOutBtn = null; // 事件监听器引用 this.wheelListener = null; this.keyListener = null; } set ncWheelScale(val) { this._wheelScale = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncWheelScale() { return this._wheelScale; } ngOnInit() { // 给图片添加预览样式 this.renderer.setStyle(this.el.nativeElement, 'cursor', 'pointer'); this.renderer.setStyle(this.el.nativeElement, 'transition', 'transform 0.2s ease'); } onImageClick(event) { event.preventDefault(); event.stopPropagation(); this.openPreview(); } onMouseEnter() { this.renderer.setStyle(this.el.nativeElement, 'transform', 'scale(1.05)'); } onMouseLeave() { this.renderer.setStyle(this.el.nativeElement, 'transform', 'scale(1)'); } openPreview() { if (this.isPreviewOpen) return; this.isPreviewOpen = true; // 重置变换状态 this.rotation = 0; this.scale = 1; // 创建预览容器 this.previewContainer = this.renderer.createElement('div'); this.renderer.addClass(this.previewContainer, 'nc-img-preview-overlay'); // 设置遮罩层样式 this.renderer.setStyle(this.previewContainer, 'position', 'fixed'); this.renderer.setStyle(this.previewContainer, 'top', '0'); this.renderer.setStyle(this.previewContainer, 'left', '0'); this.renderer.setStyle(this.previewContainer, 'width', '100vw'); this.renderer.setStyle(this.previewContainer, 'height', '100vh'); this.renderer.setStyle(this.previewContainer, 'background-color', 'rgba(0, 0, 0, 0.45)'); this.renderer.setStyle(this.previewContainer, 'z-index', '9999'); this.renderer.setStyle(this.previewContainer, 'display', 'flex'); this.renderer.setStyle(this.previewContainer, 'justify-content', 'center'); this.renderer.setStyle(this.previewContainer, 'align-items', 'center'); this.renderer.setStyle(this.previewContainer, 'cursor', 'pointer'); this.renderer.setStyle(this.previewContainer, 'opacity', '0'); this.renderer.setStyle(this.previewContainer, 'transition', 'opacity 0.3s ease'); this.renderer.setStyle(this.previewContainer, 'user-select', 'none'); this.renderer.setStyle(this.previewContainer, '-webkit-user-select', 'none'); this.renderer.setStyle(this.previewContainer, '-moz-user-select', 'none'); this.renderer.setStyle(this.previewContainer, '-ms-user-select', 'none'); this.renderer.setStyle(this.previewContainer, 'overflow', 'auto'); // 创建预览图片 this.previewImg = this.renderer.createElement('img'); this.renderer.addClass(this.previewImg, 'nc-img-preview-img'); const imgSrc = this.ncImgPreview || this.el.nativeElement.src; this.renderer.setAttribute(this.previewImg, 'src', imgSrc); this.renderer.setStyle(this.previewImg, 'max-width', '100%'); this.renderer.setStyle(this.previewImg, 'max-height', '100%'); this.renderer.setStyle(this.previewImg, 'object-fit', 'contain'); this.renderer.setStyle(this.previewImg, 'border-radius', '8px'); this.renderer.setStyle(this.previewImg, 'box-shadow', '0 4px 20px rgba(0, 0, 0, 0.3)'); this.renderer.setStyle(this.previewImg, 'transform', 'scale(0.8)'); this.renderer.setStyle(this.previewImg, 'transition', 'transform 0.3s ease'); this.renderer.setStyle(this.previewImg, 'cursor', 'default'); this.renderer.setStyle(this.previewImg, 'user-select', 'none'); this.renderer.setStyle(this.previewImg, '-webkit-user-select', 'none'); this.renderer.setStyle(this.previewImg, '-moz-user-select', 'none'); this.renderer.setStyle(this.previewImg, '-ms-user-select', 'none'); this.renderer.setStyle(this.previewImg, '-webkit-user-drag', 'none'); this.renderer.setStyle(this.previewImg, '-khtml-user-drag', 'none'); this.renderer.setStyle(this.previewImg, '-moz-user-drag', 'none'); this.renderer.setStyle(this.previewImg, '-o-user-drag', 'none'); this.renderer.setStyle(this.previewImg, 'user-drag', 'none'); this.renderer.setAttribute(this.previewImg, 'draggable', 'false'); // 创建工具条容器 this.toolbar = this.renderer.createElement('div'); this.renderer.addClass(this.toolbar, 'nc-img-preview-toolbar'); this.renderer.setStyle(this.toolbar, 'position', 'fixed'); this.renderer.setStyle(this.toolbar, 'top', '20px'); this.renderer.setStyle(this.toolbar, 'right', '20px'); this.renderer.setStyle(this.toolbar, 'display', 'flex'); this.renderer.setStyle(this.toolbar, 'gap', '8px'); this.renderer.setStyle(this.toolbar, 'background-color', 'rgba(0, 0, 0, 0.6)'); this.renderer.setStyle(this.toolbar, 'border-radius', '8px'); this.renderer.setStyle(this.toolbar, 'padding', '8px'); this.renderer.setStyle(this.toolbar, 'backdrop-filter', 'blur(10px)'); this.renderer.setStyle(this.toolbar, 'z-index', '10000'); this.renderer.setStyle(this.toolbar, 'user-select', 'none'); this.renderer.setStyle(this.toolbar, '-webkit-user-select', 'none'); this.renderer.setStyle(this.toolbar, '-moz-user-select', 'none'); this.renderer.setStyle(this.toolbar, '-ms-user-select', 'none'); // 创建工具按钮 const rotateLeftBtn = this.createToolButton('↺', '向左旋转'); const rotateRightBtn = this.createToolButton('↻', '向右旋转'); this.zoomInBtn = this.createToolButton('+', '放大'); this.zoomOutBtn = this.createToolButton('−', '缩小'); const closeBtn = this.createToolButton('×', '关闭'); // 添加按钮事件监听器 this.renderer.listen(rotateLeftBtn, 'click', (event) => { event.preventDefault(); event.stopPropagation(); this.rotateImage(-90); }); this.renderer.listen(rotateRightBtn, 'click', (event) => { event.preventDefault(); event.stopPropagation(); this.rotateImage(90); }); this.renderer.listen(this.zoomInBtn, 'click', (event) => { event.preventDefault(); event.stopPropagation(); this.scaleImage(this.ncScaleStep); }); this.renderer.listen(this.zoomOutBtn, 'click', (event) => { event.preventDefault(); event.stopPropagation(); this.scaleImage(-this.ncScaleStep); }); this.renderer.listen(closeBtn, 'click', (event) => { event.preventDefault(); event.stopPropagation(); this.closePreview(); }); // 组装工具条 this.renderer.appendChild(this.toolbar, rotateLeftBtn); this.renderer.appendChild(this.toolbar, rotateRightBtn); this.renderer.appendChild(this.toolbar, this.zoomOutBtn); this.renderer.appendChild(this.toolbar, this.zoomInBtn); this.renderer.appendChild(this.toolbar, closeBtn); // 组装预览容器 this.renderer.appendChild(this.previewContainer, this.previewImg); this.renderer.appendChild(document.body, this.previewContainer); this.renderer.appendChild(document.body, this.toolbar); // 添加事件监听器 this.renderer.listen(this.previewContainer, 'click', (event) => { if (event.target === this.previewContainer) { this.closePreview(); } }); // 添加鼠标滚轮事件监听器(如果启用了滚轮缩放) if (this.ncWheelScale) { this.wheelListener = this.renderer.listen(this.previewContainer, 'wheel', (event) => { event.preventDefault(); event.stopPropagation(); // 根据滚轮方向决定缩放方向 // deltaY > 0 表示向下滚动(缩小),deltaY < 0 表示向上滚动(放大) const delta = event.deltaY > 0 ? -this.ncScaleStep : this.ncScaleStep; this.scaleImage(delta); }); } // 添加键盘事件监听器 this.keyListener = this.renderer.listen('document', 'keydown', (event) => { if (event.key === 'Escape') { this.closePreview(); } }); // 禁止页面滚动和文本选择 this.renderer.setStyle(document.body, 'overflow', 'hidden'); this.renderer.setStyle(document.body, 'user-select', 'none'); this.renderer.setStyle(document.body, '-webkit-user-select', 'none'); this.renderer.setStyle(document.body, '-moz-user-select', 'none'); this.renderer.setStyle(document.body, '-ms-user-select', 'none'); // 动画效果 setTimeout(() => { if (this.previewContainer && this.previewImg) { this.renderer.setStyle(this.previewContainer, 'opacity', '1'); this.renderer.setStyle(this.previewImg, 'transform', 'scale(1)'); // 初始化按钮状态 this.updateZoomButtonsState(); } }, 10); } createToolButton(text, title) { const button = this.renderer.createElement('div'); this.renderer.addClass(button, 'nc-img-preview-toolbar-button'); this.renderer.setStyle(button, 'width', '36px'); this.renderer.setStyle(button, 'height', '36px'); this.renderer.setStyle(button, 'background-color', 'rgba(255, 255, 255, 0.1)'); this.renderer.setStyle(button, 'border-radius', '6px'); this.renderer.setStyle(button, 'display', 'flex'); this.renderer.setStyle(button, 'justify-content', 'center'); this.renderer.setStyle(button, 'align-items', 'center'); this.renderer.setStyle(button, 'cursor', 'pointer'); this.renderer.setStyle(button, 'transition', 'background-color 0.2s ease, transform 0.1s ease'); this.renderer.setStyle(button, 'font-size', '18px'); this.renderer.setStyle(button, 'color', 'white'); this.renderer.setStyle(button, 'font-weight', 'bold'); this.renderer.setStyle(button, 'user-select', 'none'); this.renderer.setAttribute(button, 'title', title); // 设置按钮内容 const buttonText = this.renderer.createText(text); this.renderer.appendChild(button, buttonText); // 添加悬停效果 this.renderer.listen(button, 'mouseenter', () => { this.renderer.setStyle(button, 'background-color', 'rgba(255, 255, 255, 0.2)'); this.renderer.setStyle(button, 'transform', 'scale(1.1)'); }); this.renderer.listen(button, 'mouseleave', () => { this.renderer.setStyle(button, 'background-color', 'rgba(255, 255, 255, 0.1)'); this.renderer.setStyle(button, 'transform', 'scale(1)'); }); // 添加点击效果 this.renderer.listen(button, 'mousedown', (event) => { event.preventDefault(); this.renderer.setStyle(button, 'transform', 'scale(0.95)'); }); this.renderer.listen(button, 'mouseup', (event) => { event.preventDefault(); this.renderer.setStyle(button, 'transform', 'scale(1.1)'); }); // 阻止文本选择开始 this.renderer.listen(button, 'selectstart', (event) => { event.preventDefault(); }); // 阻止拖拽开始 this.renderer.listen(button, 'dragstart', (event) => { event.preventDefault(); }); return button; } rotateImage(angle) { if (!this.previewImg) return; this.rotation += angle; this.updateImageTransform(); } scaleImage(delta) { if (!this.previewImg) return; const newScale = this.mathAdd(this.scale, delta); // 确保缩放比例在合理范围内,超出范围时设置为边界值 if (newScale < this.ncMinScale) { this.scale = this.ncMinScale; } else if (newScale > this.ncMaxScale) { this.scale = this.ncMaxScale; } else { this.scale = newScale; } this.updateImageTransform(); this.updateZoomButtonsState(); } updateImageTransform() { if (!this.previewImg) return; const transform = `scale3d(${this.scale}, ${this.scale}, 1) rotate(${this.rotation}deg)`; this.renderer.setStyle(this.previewImg, 'transform', transform); } updateZoomButtonsState() { if (!this.zoomInBtn || !this.zoomOutBtn) return; const isMinScale = this.scale <= this.ncMinScale; const isMaxScale = this.scale >= this.ncMaxScale; // 更新按钮状态 this.setButtonDisabled(this.zoomOutBtn, isMinScale); this.setButtonDisabled(this.zoomInBtn, isMaxScale); } setButtonDisabled(button, disabled) { if (disabled) { this.renderer.setStyle(button, 'opacity', '0.4'); this.renderer.setStyle(button, 'pointer-events', 'none'); } else { this.renderer.setStyle(button, 'opacity', '1'); this.renderer.setStyle(button, 'pointer-events', 'auto'); } } closePreview() { if (!this.isPreviewOpen || !this.previewContainer) return; // 清理事件监听器 if (this.keyListener) { this.keyListener(); this.keyListener = null; } if (this.wheelListener) { this.wheelListener(); this.wheelListener = null; } // 移除工具栏 if (this.toolbar) { this.renderer.removeChild(document.body, this.toolbar); this.toolbar = null; } // 添加关闭动画 this.renderer.setStyle(this.previewContainer, 'opacity', '0'); if (this.previewImg) { this.renderer.setStyle(this.previewImg, 'transform', 'scale(0.8)'); } // 延迟移除元素以完成动画 setTimeout(() => { if (this.previewContainer) { this.renderer.removeChild(document.body, this.previewContainer); this.previewContainer = null; this.previewImg = null; this.zoomInBtn = null; this.zoomOutBtn = null; } this.isPreviewOpen = false; // 恢复页面滚动和文本选择 this.renderer.removeStyle(document.body, 'overflow'); this.renderer.removeStyle(document.body, 'user-select'); this.renderer.removeStyle(document.body, '-webkit-user-select'); this.renderer.removeStyle(document.body, '-moz-user-select'); this.renderer.removeStyle(document.body, '-ms-user-select'); }, 300); } mathAdd(value1, value2) { // 将浮点数转换为字符串 let aStr = value1.toString(); let bStr = value2.toString(); // 找到小数点后的位置 let aDecimals = (aStr.split('.')[1] || '').length; let bDecimals = (bStr.split('.')[1] || '').length; // 找到最大的小数位数 let maxDecimals = Math.max(aDecimals, bDecimals); // 将浮点数转换为整数 let aInt = Math.round(value1 * Math.pow(10, maxDecimals)); let bInt = Math.round(value2 * Math.pow(10, maxDecimals)); // 进行整数加法 let resultInt = aInt + bInt; // 将结果转换回浮点数 return resultInt / Math.pow(10, maxDecimals); } } ImgPreviewDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImgPreviewDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); ImgPreviewDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: ImgPreviewDirective, selector: "[ncImgPreview]", inputs: { ncImgPreview: "ncImgPreview", ncMinScale: "ncMinScale", ncMaxScale: "ncMaxScale", ncScaleStep: "ncScaleStep", ncWheelScale: "ncWheelScale" }, host: { listeners: { "click": "onImageClick($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, exportAs: ["ncImgPreview"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImgPreviewDirective, decorators: [{ type: Directive, args: [{ selector: '[ncImgPreview]', exportAs: 'ncImgPreview' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncImgPreview: [{ type: Input }], ncMinScale: [{ type: Input }], ncMaxScale: [{ type: Input }], ncScaleStep: [{ type: Input }], ncWheelScale: [{ type: Input }], onImageClick: [{ type: HostListener, args: ['click', ['$event']] }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1nLXByZXZpZXcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9pbWctcHJldmlldy9pbWctcHJldmlldy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNOUYsTUFBTSxPQUFPLG1CQUFtQjtJQWdDL0IsWUFBb0IsRUFBYyxFQUFVLFFBQW1CO1FBQTNDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBL0J0RCxpQkFBWSxHQUFXLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtRQUNqRCxlQUFVLEdBQVcsR0FBRyxDQUFDLENBQUMsU0FBUztRQUNuQyxlQUFVLEdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNqQyxnQkFBVyxHQUFXLElBQUksQ0FBQyxDQUFDLE9BQU87UUFDNUMsV0FBVztRQUNILGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBUzdCLHFCQUFnQixHQUF1QixJQUFJLENBQUM7UUFDNUMsZUFBVSxHQUF1QixJQUFJLENBQUM7UUFDdEMsWUFBTyxHQUF1QixJQUFJLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFOUIsU0FBUztRQUNELGFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPO1FBQ3JCLFVBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPO1FBRTFCLFNBQVM7UUFDRCxjQUFTLEdBQXVCLElBQUksQ0FBQztRQUNyQyxlQUFVLEdBQXVCLElBQUksQ0FBQztRQUU5QyxVQUFVO1FBQ0Ysa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBQzFDLGdCQUFXLEdBQXdCLElBQUksQ0FBQztJQUVtQixDQUFDO0lBekJwRSxJQUNJLFlBQVksQ0FBQyxHQUFxQjtRQUNyQyxJQUFJLENBQUMsV0FB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QUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFMUQsU0FBUztRQUNULElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7UUFFNUIsWUFBWTtRQUNaLE9BQU8sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O2dIQXBaVyxtQkFBbUI7b0dBQW5CLG1CQUFtQjsyRkFBbkIsbUJBQW1CO2tCQUovQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFFBQVEsRUFBRSxjQUFjO2lCQUN4Qjt5SEFFUyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlGLFlBQVk7c0JBRGYsS0FBSztnQkFrQ04sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRakMsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVk7Z0JBTTFCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBPbkluaXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcblx0c2VsZWN0b3I6ICdbbmNJbWdQcmV2aWV3XScsXHJcblx0ZXhwb3J0QXM6ICduY0ltZ1ByZXZpZXcnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbWdQcmV2aWV3RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHRASW5wdXQoKSBuY0ltZ1ByZXZpZXc6IHN0cmluZyA9ICcnOyAvLyDlj6/pgInnmoTlpKflm75VUkzvvIzlpoLmnpzkuI3mj5DkvpvliJnkvb/nlKjljp/lm75cclxuXHRASW5wdXQoKSBuY01pblNjYWxlOiBudW1iZXIgPSAwLjU7IC8vIOacgOWwj+e8qeaUvuavlOS+i1xyXG5cdEBJbnB1dCgpIG5jTWF4U2NhbGU6IG51bWJlciA9IDU7IC8vIOacgOWkp+e8qeaUvuavlOS+i1xyXG5cdEBJbnB1dCgpIG5jU2NhbGVTdGVwOiBudW1iZXIgPSAwLjI1OyAvLyDnvKnmlL7mraXplb9cclxuXHQvKiog5rua6L2u57yp5pS+ICovXHJcblx0cHJpdmF0ZSBfd2hlZWxTY2FsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpXHJcblx0c2V0IG5jV2hlZWxTY2FsZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuXHRcdHRoaXMuX3doZWVsU2NhbGUgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcblx0fVxyXG5cdGdldCBuY1doZWVsU2NhbGUoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5fd2hlZWxTY2FsZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcHJldmlld0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHByZXZpZXdJbWc6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSB0b29sYmFyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgaXNQcmV2aWV3T3BlbiA9IGZhbHNlO1xyXG5cclxuXHQvLyDlm77niYflj5jmjaLnirbmgIFcclxuXHRwcml2YXRlIHJvdGF0aW9uID0gMDsgLy8g5peL6L2s6KeS5bqmXHJcblx0cHJpdmF0ZSBzY2FsZSA9IDE7IC8vIOe8qeaUvuavlOS+i1xyXG5cclxuXHQvLyDlt6XlhbfmjInpkq7lvJXnlKhcclxuXHRwcml2YXRlIHpvb21JbkJ0bjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHpvb21PdXRCdG46IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdC8vIOS6i+S7tuebkeWQrOWZqOW8leeUqFxyXG5cdHByaXZhdGUgd2hlZWxMaXN0ZW5lcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSBrZXlMaXN0ZW5lcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0Ly8g57uZ5Zu+54mH5re75Yqg6aKE6KeI5qC35byPXHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2N1cnNvcicsICdwb2ludGVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtIDAuMnMgZWFzZScpO1xyXG5cdH1cclxuXHJcblx0QEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxyXG5cdG9uSW1hZ2VDbGljayhldmVudDogRXZlbnQpIHtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdHRoaXMub3BlblByZXZpZXcoKTtcclxuXHR9XHJcblxyXG5cdEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxyXG5cdG9uTW91c2VFbnRlcigpIHtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgJ3NjYWxlKDEuMDUpJyk7XHJcblx0fVxyXG5cclxuXHRASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcclxuXHRvbk1vdXNlTGVhdmUoKSB7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsICdzY2FsZSgxKScpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBvcGVuUHJldmlldygpIHtcclxuXHRcdGlmICh0aGlzLmlzUHJldmlld09wZW4pIHJldHVybjtcclxuXHJcblx0XHR0aGlzLmlzUHJldmlld09wZW4gPSB0cnVlO1xyXG5cclxuXHRcdC8vIOmHjee9ruWPmOaNoueKtuaAgVxyXG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XHJcblx0XHR0aGlzLnNjYWxlID0gMTtcclxuXHJcblx0XHQvLyDliJvlu7rpooTop4jlrrnlmahcclxuXHRcdHRoaXMucHJldmlld0NvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ25jLWltZy1wcmV2aWV3LW92ZXJsYXknKTtcclxuXHJcblx0XHQvLyDorr7nva7pga7nvanlsYLmoLflvI9cclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAncG9zaXRpb24nLCAnZml4ZWQnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAndG9wJywgJzAnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnbGVmdCcsICcwJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ3dpZHRoJywgJzEwMHZ3Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2hlaWdodCcsICcxMDB2aCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ3JnYmEoMCwgMCwgMCwgMC40NSknKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnei1pbmRleCcsICc5OTk5Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2Rpc3BsYXknLCAnZmxleCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdjdXJzb3InLCAncG9pbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdvcGFjaXR5JywgJzAnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuM3MgZWFzZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICd1c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJy13ZWJraXQtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICctbW96LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnLW1zLXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnb3ZlcmZsb3cnLCAnYXV0bycpO1xyXG5cclxuXHRcdC8vIOWIm+W7uumihOiniOWbvueJh1xyXG5cdFx0dGhpcy5wcmV2aWV3SW1nID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wcmV2aWV3SW1nLCAnbmMtaW1nLXByZXZpZXctaW1nJyk7XHJcblx0XHRjb25zdCBpbWdTcmMgPSB0aGlzLm5jSW1nUHJldmlldyB8fCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3JjO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5wcmV2aWV3SW1nLCAnc3JjJywgaW1nU3JjKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnbWF4LXdpZHRoJywgJzEwMCUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnbWF4LWhlaWdodCcsICcxMDAlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ29iamVjdC1maXQnLCAnY29udGFpbicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICdib3JkZXItcmFkaXVzJywgJzhweCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICdib3gtc2hhZG93JywgJzAgNHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjMpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ3RyYW5zZm9ybScsICdzY2FsZSgwLjgpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtIDAuM3MgZWFzZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICdjdXJzb3InLCAnZGVmYXVsdCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd1c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJy13ZWJraXQtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICctbW96LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLW1zLXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLXdlYmtpdC11c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICcta2h0bWwtdXNlci1kcmFnJywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLW1vei11c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICctby11c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd1c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5wcmV2aWV3SW1nLCAnZHJhZ2dhYmxlJywgJ2ZhbHNlJyk7XHJcblxyXG5cdFx0Ly8g5Yib5bu65bel5YW35p2h5a655ZmoXHJcblx0XHR0aGlzLnRvb2xiYXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRvb2xiYXIsICduYy1pbWctcHJldmlldy10b29sYmFyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3RvcCcsICcyMHB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3JpZ2h0JywgJzIwcHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnZGlzcGxheScsICdmbGV4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ2dhcCcsICc4cHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnYmFja2dyb3VuZC1jb2xvcicsICdyZ2JhKDAsIDAsIDAsIDAuNiknKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnYm9yZGVyLXJhZGl1cycsICc4cHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAncGFkZGluZycsICc4cHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnYmFja2Ryb3AtZmlsdGVyJywgJ2JsdXIoMTBweCknKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnei1pbmRleCcsICcxMDAwMCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICd1c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJy13ZWJraXQtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICctbW96LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnLW1zLXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHJcblx0XHQvLyDliJvlu7rlt6XlhbfmjInpkq5cclxuXHRcdGNvbnN0IHJvdGF0ZUxlZnRCdG4gPSB0aGlzLmNyZWF0ZVRvb2xCdXR0b24oJ+KGuicsICflkJHlt6bml4vovawnKTtcclxuXHRcdGNvbnN0IHJvdGF0ZVJpZ2h0QnRuID0gdGhpcy5jcmVhdGVUb29sQnV0dG9uKCfihrsnLCAn5ZCR5Y+z5peL6L2sJyk7XHJcblx0XHR0aGlzLnpvb21JbkJ0biA9IHRoaXMuY3JlYXRlVG9vbEJ1dHRvbignKycsICfmlL7lpKcnKTtcclxuXHRcdHRoaXMuem9vbU91dEJ0biA9IHRoaXMuY3JlYXRlVG9vbEJ1dHRvbign4oiSJywgJ+e8qeWwjycpO1xyXG5cdFx0Y29uc3QgY2xvc2VCdG4gPSB0aGlzLmNyZWF0ZVRvb2xCdXR0b24oJ8OXJywgJ+WFs+mXrScpO1xyXG5cclxuXHRcdC8vIOa3u+WKoOaMiemS