UNPKG

ng-cw-v12

Version:

Angular UI Component Library

167 lines 24.5 kB
import { Directive, Input, Output, EventEmitter } from '@angular/core'; import * as i0 from "@angular/core"; export class BorderBeamDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; /** 光条大小 单位px */ this.ncSize = 50; /** 动画时长,ms */ this.ncDuration = 6000; /** 停止动画时间,ms,0表示不停止 */ this.ncStopTime = 0; /** 光条颜色,可以是单色或颜色数组 */ this.ncBeamColor = ["#ffaa40", "#9c40ff"]; /** 是否反向动画 */ this._reverse = false; /** 初始偏移位置 (0-100) 单位% */ this.ncInitialOffset = 0; /** 边框宽度 单位px */ this.ncBorderWidth = 1; /** 是否启用动画 */ this._enabled = true; /** 双向绑定输出事件 */ this.ncEnabledChange = new EventEmitter(); this.isInitialized = false; // 为每个实例生成唯一的动画名称 this.animationName = `ncBorderBeam_${Math.random().toString(36).substring(2, 11)}`; } set ncReverse(val) { this._reverse = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncReverse() { return this._reverse; } set ncEnabled(val) { this._enabled = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncEnabled() { return this._enabled; } ngOnInit() { this.createBorderBeamContainer(); this.isInitialized = true; if (this.ncEnabled) { this.startAnimation(); } } ngOnChanges(changes) { if (this.isInitialized && changes['ncEnabled']) { if (this.ncEnabled) { this.startAnimation(); } else { this.stopAnimation(); } } } ngOnDestroy() { if (this.stopTimer) { clearTimeout(this.stopTimer); } } createBorderBeamContainer() { // 创建边框容器 this.borderContainer = this.renderer.createElement('div'); this.renderer.addClass(this.borderContainer, 'border-beam-container'); // 设置边框容器样式 this.renderer.setStyle(this.borderContainer, 'position', 'absolute'); this.renderer.setStyle(this.borderContainer, 'inset', '0'); this.renderer.setStyle(this.borderContainer, 'borderRadius', 'inherit'); this.renderer.setStyle(this.borderContainer, 'pointerEvents', 'none'); this.renderer.setStyle(this.borderContainer, 'border', `${this.ncBorderWidth}px solid transparent`); this.renderer.setStyle(this.borderContainer, 'maskClip', 'padding-box, border-box'); this.renderer.setStyle(this.borderContainer, 'maskComposite', 'intersect'); this.renderer.setStyle(this.borderContainer, 'maskImage', 'linear-gradient(transparent, transparent), linear-gradient(#000, #000)'); // 创建光条元素 this.beamElement = this.renderer.createElement('div'); this.renderer.addClass(this.beamElement, 'border-beam'); // 设置光条样式 this.renderer.setStyle(this.beamElement, 'position', 'absolute'); this.renderer.setStyle(this.beamElement, 'width', `${this.ncSize}px`); this.renderer.setStyle(this.beamElement, 'aspectRatio', '1'); // 获取shine颜色 const beamColors = Array.isArray(this.ncBeamColor) ? this.ncBeamColor.join(',') : this.ncBeamColor; this.renderer.setStyle(this.beamElement, 'background', `linear-gradient(to left, ${beamColors}, transparent)`); this.renderer.setStyle(this.beamElement, 'offsetPath', `rect(0 auto auto 0 round ${this.ncSize}px)`); // 初始状态下隐藏光条 this.renderer.setStyle(this.beamElement, 'opacity', '0'); const elementPosition = getComputedStyle(this.el.nativeElement).position; if (!elementPosition || elementPosition === 'static') { this.renderer.setStyle(this.el.nativeElement, 'position', 'relative'); } // 添加关键帧动画样式 this.styleElement = this.renderer.createElement('style'); const startOffset = this.ncReverse ? `${100 - this.ncInitialOffset}%` : `${this.ncInitialOffset}%`; const endOffset = this.ncReverse ? `${-this.ncInitialOffset}%` : `${100 + this.ncInitialOffset}%`; const keyframes = ` @keyframes ${this.animationName} { 0% { offset-distance: ${startOffset}; } 100% { offset-distance: ${endOffset}; } } `; this.renderer.appendChild(this.styleElement, this.renderer.createText(keyframes)); this.renderer.appendChild(this.el.nativeElement, this.styleElement); // 将光条添加到边框容器中 this.renderer.appendChild(this.borderContainer, this.beamElement); // 将边框容器添加到宿主元素中 this.renderer.appendChild(this.el.nativeElement, this.borderContainer); } startAnimation() { if (!this.beamElement) return; // 显示光条元素 this.renderer.setStyle(this.beamElement, 'opacity', '1'); this.renderer.setStyle(this.beamElement, 'animation', `${this.animationName} ${this.ncDuration}ms linear infinite`); // 如果设置了停止时间,则在指定时间后标记需要停止 if (this.ncStopTime > 0) { this.stopTimer = setTimeout(() => { this.stopAnimation(); // 当因为 ncStopTime 停止动画时,更新 ncEnabled 值并发出事件 this.ncEnabled = false; this.ncEnabledChange.emit(false); }, this.ncStopTime); } } stopAnimation() { if (!this.beamElement) return; if (this.stopTimer) { clearTimeout(this.stopTimer); this.stopTimer = null; } this.renderer.setStyle(this.beamElement, 'animation', 'none'); this.renderer.setStyle(this.beamElement, 'opacity', '0'); } } BorderBeamDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: BorderBeamDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); BorderBeamDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: BorderBeamDirective, selector: "[ncBorderBeam]", inputs: { ncSize: "ncSize", ncDuration: "ncDuration", ncStopTime: "ncStopTime", ncBeamColor: "ncBeamColor", ncReverse: "ncReverse", ncInitialOffset: "ncInitialOffset", ncBorderWidth: "ncBorderWidth", ncEnabled: "ncEnabled" }, outputs: { ncEnabledChange: "ncEnabledChange" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: BorderBeamDirective, decorators: [{ type: Directive, args: [{ selector: '[ncBorderBeam]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncSize: [{ type: Input }], ncDuration: [{ type: Input }], ncStopTime: [{ type: Input }], ncBeamColor: [{ type: Input }], ncReverse: [{ type: Input }], ncInitialOffset: [{ type: Input }], ncBorderWidth: [{ type: Input }], ncEnabled: [{ type: Input }], ncEnabledChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9yZGVyLWJlYW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9ib3JkZXItYmVhbS9ib3JkZXItYmVhbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOztBQUszSSxNQUFNLE9BQU8sbUJBQW1CO0lBeUM5QixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUF4Qy9ELGdCQUFnQjtRQUNQLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDN0IsY0FBYztRQUNMLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDbkMsdUJBQXVCO1FBQ2QsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUNoQyxzQkFBc0I7UUFDYixnQkFBVyxHQUFzQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRSxhQUFhO1FBQ0wsYUFBUSxHQUFZLEtBQUssQ0FBQztRQVFsQyx5QkFBeUI7UUFDaEIsb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDckMsZ0JBQWdCO1FBQ1Asa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDbkMsYUFBYTtRQUNMLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFRakMsZUFBZTtRQUNMLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQU9oRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUc1QixpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDckYsQ0FBQztJQWpDRCxJQUNJ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LENBQUM7SUFDM0QsQ0FBQzs7Z0hBOUpVLG1CQUFtQjtvR0FBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtpQkFDM0I7eUhBR1UsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFRRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBSUYsU0FBUztzQkFEWixLQUFLO2dCQVFJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuY0JvcmRlckJlYW1dJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQm9yZGVyQmVhbURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIC8qKiDlhYnmnaHlpKflsI8g5Y2V5L2NcHggKi9cclxuICBASW5wdXQoKSBuY1NpemU6IG51bWJlciA9IDUwO1xyXG4gIC8qKiDliqjnlLvml7bplb/vvIxtcyAqL1xyXG4gIEBJbnB1dCgpIG5jRHVyYXRpb246IG51bWJlciA9IDYwMDA7XHJcbiAgLyoqIOWBnOatouWKqOeUu+aXtumXtO+8jG1z77yMMOihqOekuuS4jeWBnOatoiAqL1xyXG4gIEBJbnB1dCgpIG5jU3RvcFRpbWU6IG51bWJlciA9IDA7XHJcbiAgLyoqIOWFieadoeminOiJsu+8jOWPr+S7peaYr+WNleiJsuaIluminOiJsuaVsOe7hCAqL1xyXG4gIEBJbnB1dCgpIG5jQmVhbUNvbG9yOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtcIiNmZmFhNDBcIiwgXCIjOWM0MGZmXCJdO1xyXG4gIC8qKiDmmK/lkKblj43lkJHliqjnlLsgKi9cclxuICBwcml2YXRlIF9yZXZlcnNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNSZXZlcnNlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fcmV2ZXJzZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jUmV2ZXJzZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXZlcnNlO1xyXG4gIH1cclxuICAvKiog5Yid5aeL5YGP56e75L2N572uICgwLTEwMCkg5Y2V5L2NJSAqL1xyXG4gIEBJbnB1dCgpIG5jSW5pdGlhbE9mZnNldDogbnVtYmVyID0gMDtcclxuICAvKiog6L655qGG5a695bqmIOWNleS9jXB4ICovXHJcbiAgQElucHV0KCkgbmNCb3JkZXJXaWR0aDogbnVtYmVyID0gMTtcclxuICAvKiog5piv5ZCm5ZCv55So5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfZW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNFbmFibGVkKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fZW5hYmxlZCA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xyXG4gIH1cclxuICAvKiog5Y+M5ZCR57uR5a6a6L6T5Ye65LqL5Lu2ICovXHJcbiAgQE91dHB1dCgpIG5jRW5hYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBib3JkZXJDb250YWluZXIhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIGJlYW1FbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbmltYXRpb25OYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBzdG9wVGltZXI6IGFueTtcclxuICBwcml2YXRlIHN0eWxlRWxlbWVudCE6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgIC8vIOS4uuavj+S4quWunuS+i+eUn+aIkOWUr+S4gOeahOWKqOeUu+WQjeensFxyXG4gICAgdGhpcy5hbmltYXRpb25OYW1lID0gYG5jQm9yZGVyQmVhbV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVCb3JkZXJCZWFtQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgY2hhbmdlc1snbmNFbmFibGVkJ10pIHtcclxuICAgICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVCb3JkZXJCZWFtQ29udGFpbmVyKCkge1xyXG4gICAgLy8g5Yib5bu66L655qGG5a655ZmoXHJcbiAgICB0aGlzLmJvcmRlckNvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnYm9yZGVyLWJlYW0tY29udGFpbmVyJyk7XHJcblxyXG4gICAgLy8g6K6+572u6L655qGG5a655Zmo5qC35byPXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdpbnNldCcsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnYm9yZGVyUmFkaXVzJywgJ2luaGVyaXQnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdwb2ludGVyRXZlbnRzJywgJ25vbmUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdib3JkZXInLCBgJHt0aGlzLm5jQm9yZGVyV2lkdGh9cHggc29saWQgdHJhbnNwYXJlbnRgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdtYXNrQ2xpcCcsICdwYWRkaW5nLWJveCwgYm9yZGVyLWJveCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckNvbnRhaW5lciwgJ21hc2tDb21wb3NpdGUnLCAnaW50ZXJzZWN0Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnbWFza0ltYWdlJywgJ2xpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCwgdHJhbnNwYXJlbnQpLCBsaW5lYXItZ3JhZGllbnQoIzAwMCwgIzAwMCknKTtcclxuXHJcbiAgICAvLyDliJvlu7rlhYnmnaHlhYPntKBcclxuICAgIHRoaXMuYmVhbUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJlYW1FbGVtZW50LCAnYm9yZGVyLWJlYW0nKTtcclxuXHJcbiAgICAvLyDorr7nva7lhYnmnaHmoLflvI9cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICd3aWR0aCcsIGAke3RoaXMubmNTaXplfXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdhc3BlY3RSYXRpbycsICcxJyk7XHJcbiAgICAvLyDojrflj5ZzaGluZeminOiJslxyXG4gICAgY29uc3QgYmVhbUNvbG9ycyA9IEFycmF5LmlzQXJyYXkodGhpcy5uY0JlYW1Db2xvcikgPyB0aGlzLm5jQmVhbUNvbG9yLmpvaW4oJywnKSA6IHRoaXMubmNCZWFtQ29sb3I7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdiYWNrZ3JvdW5kJywgYGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCAke2JlYW1Db2xvcnN9LCB0cmFuc3BhcmVudClgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ29mZnNldFBhdGgnLCBgcmVjdCgwIGF1dG8gYXV0byAwIHJvdW5kICR7dGhpcy5uY1NpemV9cHgpYCk7XHJcbiAgICAvLyDliJ3lp4vnirbmgIHkuIvpmpDol4/lhYnmnaFcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ29wYWNpdHknLCAnMCcpO1xyXG5cclxuICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50KS5wb3NpdGlvbjtcclxuICAgIGlmICghZWxlbWVudFBvc2l0aW9uIHx8IGVsZW1lbnRQb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOa3u+WKoOWFs+mUruW4p+WKqOeUu+agt+W8j1xyXG4gICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHRoaXMubmNSZXZlcnNlID8gYCR7MTAwIC0gdGhpcy5uY0luaXRpYWxPZmZzZXR9JWAgOiBgJHt0aGlzLm5jSW5pdGlhbE9mZnNldH0lYDtcclxuICAgIGNvbnN0IGVuZE9mZnNldCA9IHRoaXMubmNSZXZlcnNlID8gYCR7LXRoaXMubmNJbml0aWFsT2Zmc2V0fSVgIDogYCR7MTAwICsgdGhpcy5uY0luaXRpYWxPZmZzZXR9JWA7XHJcblxyXG4gICAgY29uc3Qga2V5ZnJhbWVzID0gYFxyXG4gICAgICBAa2V5ZnJhbWVzICR7dGhpcy5hbmltYXRpb25OYW1lfSB7XHJcbiAgICAgICAgMCUge1xyXG4gICAgICAgICAgb2Zmc2V0LWRpc3RhbmNlOiAke3N0YXJ0T2Zmc2V0fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgMTAwJSB7XHJcbiAgICAgICAgICBvZmZzZXQtZGlzdGFuY2U6ICR7ZW5kT2Zmc2V0fTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGA7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50LCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoa2V5ZnJhbWVzKSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5zdHlsZUVsZW1lbnQpO1xyXG5cclxuICAgIC8vIOWwhuWFieadoea3u+WKoOWIsOi+ueahhuWuueWZqOS4rVxyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmJvcmRlckNvbnRhaW5lciwgdGhpcy5iZWFtRWxlbWVudCk7XHJcbiAgICAvLyDlsIbovrnmoYblrrnlmajmt7vliqDliLDlrr/kuLvlhYPntKDkuK1cclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmJvcmRlckNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLmJlYW1FbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8g5pi+56S65YWJ5p2h5YWD57SgXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdvcGFjaXR5JywgJzEnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ2FuaW1hdGlvbicsXHJcbiAgICAgIGAke3RoaXMuYW5pbWF0aW9uTmFtZX0gJHt0aGlzLm5jRHVyYXRpb259bXMgbGluZWFyIGluZmluaXRlYCk7XHJcblxyXG4gICAgLy8g5aaC5p6c6K6+572u5LqG5YGc5q2i5pe26Ze077yM5YiZ5Zyo5oyH5a6a5pe26Ze05ZCO5qCH6K6w6ZyA6KaB5YGc5q2iXHJcbiAgICBpZiAodGhpcy5uY1N0b3BUaW1lID4gMCkge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xyXG4gICAgICAgIC8vIOW9k+WboOS4uiBuY1N0b3BUaW1lIOWBnOatouWKqOeUu+aXtu+8jOabtOaWsCBuY0VuYWJsZWQg5YC85bm25Y+R5Ye65LqL5Lu2XHJcbiAgICAgICAgdGhpcy5uY0VuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5jRW5hYmxlZENoYW5nZS5lbWl0KGZhbHNlKTtcclxuICAgICAgfSwgdGhpcy5uY1N0b3BUaW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcEFuaW1hdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5iZWFtRWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJlYW1FbGVtZW50LCAnYW5pbWF0aW9uJywgJ25vbmUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ29wYWNpdHknLCAnMCcpO1xyXG4gIH1cclxufSJdfQ==