UNPKG

ng-cw-v12

Version:

Angular UI Component Library

117 lines 18.5 kB
import { Component, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class CarouselListComponent { constructor(eleRef, cdr) { this.eleRef = eleRef; this.cdr = cdr; /** 滚动时间,多少秒滚动一格 */ this.ncTime = 1; //多少秒滚动一格 /** 显示多少行 */ this.ncRow = 1; //显示多少行 this.liCount = 0; //计算 this.liHeight = 0; //计算 // 将事件处理函数定义为类的属性 this.handleMouseEnter = () => { const ul = this.eleRef.nativeElement.querySelector('ul'); if (!ul) return; ul.style.animationPlayState = 'paused'; Array.from(ul.getElementsByTagName('li')).forEach(li => { li.style.animationPlayState = 'paused'; }); }; this.handleMouseLeave = () => { const ul = this.eleRef.nativeElement.querySelector('ul'); if (!ul) return; ul.style.animationPlayState = 'running'; Array.from(ul.getElementsByTagName('li')).forEach(li => { li.style.animationPlayState = 'running'; }); }; } ngAfterViewInit() { this.initializeCarousel(); this.setupMutationObserver(); } initializeCarousel() { let ul = this.eleRef.nativeElement.querySelector('ul'); if (!ul) return; const liElements = Array.from(ul.getElementsByTagName('li')).filter(li => !li.classList.contains('cloned')); if (liElements.length === 0) return; this.liCount = liElements.length; this.liHeight = liElements[0].offsetHeight; this.ncRow = this.ncRow <= this.liCount ? this.ncRow : this.liCount; // 清除之前可能添加的克隆元素 const clonedElements = ul.querySelectorAll('.cloned'); clonedElements.forEach(el => el.remove()); // 添加新的克隆元素 let copy = liElements.slice(0, this.ncRow).map((li) => { const clonedLi = li.cloneNode(true); clonedLi.classList.add('cloned'); return clonedLi; }); copy.forEach(li => ul.appendChild(li)); // 重置动画 ul.style.animation = 'none'; ul.offsetHeight; // 触发重排 ul.style.animation = `move calc(${this.ncTime} * ${this.liCount} * 1s) steps(${this.liCount}) infinite`; // 重置所有 li 的动画 const allLis = ul.getElementsByTagName('li'); Array.from(allLis).forEach(li => { li.style.animation = 'none'; li.offsetHeight; // 触发重排 li.style.animation = `liMove calc(${this.ncTime} * 1s) infinite`; }); // 先移除旧的事件监听器,再添加新的 ul.removeEventListener('mouseenter', this.handleMouseEnter); ul.removeEventListener('mouseleave', this.handleMouseLeave); ul.addEventListener('mouseenter', this.handleMouseEnter); ul.addEventListener('mouseleave', this.handleMouseLeave); //在操作完 DOM 后调用 detectChanges() 确保变更被正确检测,防止下面的错误,用setTimeout的话该组件存在闪烁的问题 //ERROR RuntimeError: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '0'. Current value: '5'.. Find more at https://angular.io/errors/NG0100 this.cdr.detectChanges(); } setupMutationObserver() { const ul = this.eleRef.nativeElement.querySelector('ul'); if (!ul) return; this.observer = new MutationObserver(() => { // console.log('数据发生变化'); this.initializeCarousel(); }); this.observer.observe(ul, { // childList: true,//该项开启后非常卡顿,initializeCarousel会一直执行 subtree: true, characterData: true }); } ngOnDestroy() { if (this.observer) { this.observer.disconnect(); } // 使用类属性中定义的事件处理函数来移除监听器 const ul = this.eleRef.nativeElement.querySelector('ul'); if (ul) { ul.removeEventListener('mouseenter', this.handleMouseEnter); ul.removeEventListener('mouseleave', this.handleMouseLeave); } } } CarouselListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CarouselListComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); CarouselListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: CarouselListComponent, selector: "nc-carousel-list", inputs: { ncTime: "ncTime", ncRow: "ncRow" }, ngImport: i0, template: "<div class=\"carousel\" style=\"--liCount: {{liCount}};--liHeight: {{liHeight}};--speed: {{ncTime}};--row: {{ncRow}};\">\r\n <ng-content></ng-content>\r\n</div>", styles: ["::ng-deep .carousel{height:calc(var(--liHeight) * 1px * var(--row));overflow:hidden}::ng-deep .carousel ul{margin:0;padding:0}::ng-deep .carousel ul li{list-style:none;cursor:pointer}@keyframes move{0%{transform:translate(0)}to{transform:translateY(calc(var(--liCount) * var(--liHeight) * -1px))}}@keyframes liMove{0%{transform:translate(0)}80%,to{transform:translateY(calc(var(--liHeight) * -1px))}}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CarouselListComponent, decorators: [{ type: Component, args: [{ selector: 'nc-carousel-list', templateUrl: './carousel-list.component.html', styleUrls: ['./carousel-list.component.less'] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { ncTime: [{ type: Input }], ncRow: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2Nhcm91c2VsLWxpc3QvY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2Nhcm91c2VsLWxpc3QvY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7O0FBTzFHLE1BQU0sT0FBTyxxQkFBcUI7SUE2QmhDLFlBQ1UsTUFBa0IsRUFDbEIsR0FBc0I7UUFEdEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTlCaEMsbUJBQW1CO1FBQ1YsV0FBTSxHQUFXLENBQUMsQ0FBQyxDQUFBLFNBQVM7UUFDckMsWUFBWTtRQUNILFVBQUssR0FBVyxDQUFDLENBQUMsQ0FBQSxPQUFPO1FBRWxDLFlBQU8sR0FBVyxDQUFDLENBQUMsQ0FBQSxJQUFJO1FBQ3hCLGFBQVEsR0FBVyxDQUFDLENBQUMsQ0FBQSxJQUFJO1FBR3pCLGlCQUFpQjtRQUNULHFCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUM5QixNQUFNLEVBQUUsR0FBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxFQUFFO2dCQUFFLE9BQU87WUFDaEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3JELEVBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtC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QUFDLEVBQUUsRUFBRTtZQUN4QixzREFBc0Q7WUFDdEQsT0FBTyxFQUFFLElBQUk7WUFDYixhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQzVCO1FBQ0Qsd0JBQXdCO1FBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLEVBQUUsRUFBRTtZQUNOLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUQsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUM3RDtJQUNILENBQUM7O2tIQWpIVSxxQkFBcUI7c0dBQXJCLHFCQUFxQixzR0NQbEMscUtBRU07MkZES08scUJBQXFCO2tCQUxqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFdBQVcsRUFBRSxnQ0FBZ0M7b0JBQzdDLFNBQVMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM5QztpSUFHVSxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1jYXJvdXNlbC1saXN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiDmu5rliqjml7bpl7TvvIzlpJrlsJHnp5Lmu5rliqjkuIDmoLwgKi9cclxuICBASW5wdXQoKSBuY1RpbWU6IG51bWJlciA9IDE7Ly/lpJrlsJHnp5Lmu5rliqjkuIDmoLxcclxuICAvKiog5pi+56S65aSa5bCR6KGMICovXHJcbiAgQElucHV0KCkgbmNSb3c6IG51bWJlciA9IDE7Ly/mmL7npLrlpJrlsJHooYxcclxuXHJcbiAgbGlDb3VudDogbnVtYmVyID0gMDsvL+iuoeeul1xyXG4gIGxpSGVpZ2h0OiBudW1iZXIgPSAwOy8v6K6h566XXHJcbiAgcHJpdmF0ZSBvYnNlcnZlciE6IE11dGF0aW9uT2JzZXJ2ZXI7XHJcblxyXG4gIC8vIOWwhuS6i+S7tuWkhOeQhuWHveaVsOWumuS5ieS4uuexu+eahOWxnuaAp1xyXG4gIHByaXZhdGUgaGFuZGxlTW91c2VFbnRlciA9ICgpID0+IHtcclxuICAgIGNvbnN0IHVsOiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgIGlmICghdWwpIHJldHVybjtcclxuICAgIHVsLnN0eWxlLmFuaW1hdGlvblBsYXlTdGF0ZSA9ICdwYXVzZWQnO1xyXG4gICAgQXJyYXkuZnJvbSh1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKSkuZm9yRWFjaChsaSA9PiB7XHJcbiAgICAgIGxpLnN0eWxlLmFuaW1hdGlvblBsYXlTdGF0ZSA9ICdwYXVzZWQnO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZUxlYXZlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdWw6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG4gICAgaWYgKCF1bCkgcmV0dXJuO1xyXG4gICAgdWwuc3R5bGUuYW5pbWF0aW9uUGxheVN0YXRlID0gJ3J1bm5pbmcnO1xyXG4gICAgQXJyYXkuZnJvbSh1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKSkuZm9yRWFjaChsaSA9PiB7XHJcbiAgICAgIGxpLnN0eWxlLmFuaW1hdGlvblBsYXlTdGF0ZSA9ICdydW5uaW5nJztcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVDYXJvdXNlbCgpO1xyXG4gICAgdGhpcy5zZXR1cE11dGF0aW9uT2JzZXJ2ZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhcm91c2VsKCk6IHZvaWQge1xyXG4gICAgbGV0IHVsOiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgIGlmICghdWwpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBsaUVsZW1lbnRzID0gQXJyYXkuZnJvbSh1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKSkuZmlsdGVyKGxpID0+ICFsaS5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb25lZCcpKTtcclxuICAgIGlmIChsaUVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubGlDb3VudCA9IGxpRWxlbWVudHMubGVuZ3RoO1xyXG4gICAgdGhpcy5saUhlaWdodCA9IGxpRWxlbWVudHNbMF0ub2Zmc2V0SGVpZ2h0O1xyXG4gICAgdGhpcy5uY1JvdyA9IHRoaXMubmNSb3cgPD0gdGhpcy5saUNvdW50ID8gdGhpcy5uY1JvdyA6IHRoaXMubGlDb3VudDtcclxuXHJcbiAgICAvLyDmuIXpmaTkuYvliY3lj6/og73mt7vliqDnmoTlhYvpmoblhYPntKBcclxuICAgIGNvbnN0IGNsb25lZEVsZW1lbnRzID0gdWwucXVlcnlTZWxlY3RvckFsbCgnLmNsb25lZCcpO1xyXG4gICAgY2xvbmVkRWxlbWVudHMuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XHJcblxyXG4gICAgLy8g5re75Yqg5paw55qE5YWL6ZqG5YWD57SgXHJcbiAgICBsZXQgY29weSA9IGxpRWxlbWVudHMuc2xpY2UoMCwgdGhpcy5uY1JvdykubWFwKChsaSkgPT4ge1xyXG4gICAgICBjb25zdCBjbG9uZWRMaSA9IGxpLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY2xvbmVkTGkuY2xhc3NMaXN0LmFkZCgnY2xvbmVkJyk7XHJcbiAgICAgIHJldHVybiBjbG9uZWRMaTtcclxuICAgIH0pO1xyXG4gICAgY29weS5mb3JFYWNoKGxpID0+IHVsLmFwcGVuZENoaWxkKGxpKSk7XHJcblxyXG4gICAgLy8g6YeN572u5Yqo55S7XHJcbiAgICB1bC5zdHlsZS5hbmltYXRpb24gPSAnbm9uZSc7XHJcbiAgICB1bC5vZmZzZXRIZWlnaHQ7IC8vIOinpuWPkemHjeaOklxyXG4gICAgdWwuc3R5bGUuYW5pbWF0aW9uID0gYG1vdmUgY2FsYygke3RoaXMubmNUaW1lfSAqICR7dGhpcy5saUNvdW50fSAqIDFzKSBzdGVwcygke3RoaXMubGlDb3VudH0pIGluZmluaXRlYDtcclxuXHJcbiAgICAvLyDph43nva7miYDmnIkgbGkg55qE5Yqo55S7XHJcbiAgICBjb25zdCBhbGxMaXMgPSB1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKTtcclxuICAgIEFycmF5LmZyb20oYWxsTGlzKS5mb3JFYWNoKGxpID0+IHtcclxuICAgICAgbGkuc3R5bGUuYW5pbWF0aW9uID0gJ25vbmUnO1xyXG4gICAgICBsaS5vZmZzZXRIZWlnaHQ7IC8vIOinpuWPkemHjeaOklxyXG4gICAgICBsaS5zdHlsZS5hbmltYXRpb24gPSBgbGlNb3ZlIGNhbGMoJHt0aGlzLm5jVGltZX0gKiAxcykgaW5maW5pdGVgO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5YWI56e76Zmk5pen55qE5LqL5Lu255uR5ZCs5Zmo77yM5YaN5re75Yqg5paw55qEXHJcbiAgICB1bC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVNb3VzZUVudGVyKTtcclxuICAgIHVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmhhbmRsZU1vdXNlTGVhdmUpO1xyXG5cclxuICAgIHVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xyXG4gICAgdWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcblxyXG4gICAgLy/lnKjmk43kvZzlrowgRE9NIOWQjuiwg+eUqCBkZXRlY3RDaGFuZ2VzKCkg56Gu5L+d5Y+Y5pu06KKr5q2j56Gu5qOA5rWL77yM6Ziy5q2i5LiL6Z2i55qE6ZSZ6K+v77yM55Soc2V0VGltZW91dOeahOivneivpee7hOS7tuWtmOWcqOmXqueDgeeahOmXrumimFxyXG4gICAgLy9FUlJPUiBSdW50aW1lRXJyb3I6IE5HMDEwMDogRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcjogRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZC4gUHJldmlvdXMgdmFsdWU6ICcwJy4gQ3VycmVudCB2YWx1ZTogJzUnLi4gRmluZCBtb3JlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9lcnJvcnMvTkcwMTAwXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVsID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG4gICAgaWYgKCF1bCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCfmlbDmja7lj5HnlJ/lj5jljJYnKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplQ2Fyb3VzZWwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh1bCwge1xyXG4gICAgICAvLyBjaGlsZExpc3Q6IHRydWUsLy/or6XpobnlvIDlkK/lkI7pnZ7luLjljaHpob/vvIxpbml0aWFsaXplQ2Fyb3VzZWzkvJrkuIDnm7TmiafooYxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG4gICAgLy8g5L2/55So57G75bGe5oCn5Lit5a6a5LmJ55qE5LqL5Lu25aSE55CG5Ye95pWw5p2l56e76Zmk55uR5ZCs5ZmoXHJcbiAgICBjb25zdCB1bCA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgIGlmICh1bCkge1xyXG4gICAgICB1bC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVNb3VzZUVudGVyKTtcclxuICAgICAgdWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJvdXNlbFwiIHN0eWxlPVwiLS1saUNvdW50OiB7e2xpQ291bnR9fTstLWxpSGVpZ2h0OiB7e2xpSGVpZ2h0fX07LS1zcGVlZDoge3tuY1RpbWV9fTstLXJvdzoge3tuY1Jvd319O1wiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L2Rpdj4iXX0=