ng-cw-v12
Version:
Angular UI Component Library
144 lines • 26.8 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class MagicCardDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
/** 渐变大小,单位px */
this.ncGradientSize = 200;
/** 内部渐变颜色,可以是单色或颜色数组 */
this.ncGradientColor = '#D9D9D955';
/** 内部渐变透明度 */
this.ncGradientOpacity = 0.8;
/** 边框颜色,可以是单色或颜色数组 */
this.ncBorderColor = ["#9E7AFF", "#FE8BBB"];
/** 卡片背景颜色 */
this.ncCardBackground = 'white';
this.mouseX = -200;
this.mouseY = -200;
this.handleMouseEnter = () => {
this.renderer.setStyle(this.borderElement, 'opacity', '1');
this.renderer.setStyle(this.gradientElement, 'opacity', this.ncGradientOpacity.toString());
};
this.handleMouseMove = (e) => {
const rect = this.el.nativeElement.getBoundingClientRect();
this.mouseX = e.clientX - rect.left;
this.mouseY = e.clientY - rect.top;
this.updateGradients();
};
this.handleMouseLeave = () => {
this.mouseX = -this.ncGradientSize;
this.mouseY = -this.ncGradientSize;
this.updateGradients();
this.renderer.setStyle(this.borderElement, 'opacity', '0');
this.renderer.setStyle(this.gradientElement, 'opacity', '0');
};
}
ngOnInit() {
this.setupMagicCard();
this.addEventListeners();
this.initializeMousePosition();
}
setupMagicCard() {
const element = this.el.nativeElement;
const computedStyle = getComputedStyle(element);
// 设置主容器样式
const elementPosition = computedStyle.position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(element, 'position', 'relative');
}
this.renderer.addClass(element, 'nc-magic-card');
// 获取容器的边框宽度
const borderTopWidth = parseFloat(computedStyle.borderTopWidth) || 0;
const borderRightWidth = parseFloat(computedStyle.borderRightWidth) || 0;
const borderBottomWidth = parseFloat(computedStyle.borderBottomWidth) || 0;
const borderLeftWidth = parseFloat(computedStyle.borderLeftWidth) || 0;
// 如果没有边框,默认使用1px
const maxBorderWidth = Math.max(borderTopWidth, borderRightWidth, borderBottomWidth, borderLeftWidth);
const borderWidth = maxBorderWidth > 0 ? maxBorderWidth : 1;
// 创建边框元素 - 根据实际边框宽度向外扩展
this.borderElement = this.renderer.createElement('div');
this.renderer.addClass(this.borderElement, 'nc-magic-card-border');
this.renderer.setStyle(this.borderElement, 'pointer-events', 'none');
this.renderer.setStyle(this.borderElement, 'position', 'absolute');
this.renderer.setStyle(this.borderElement, 'inset', `-${borderWidth}px`); // 根据边框宽度动态设置
this.renderer.setStyle(this.borderElement, 'border-radius', 'inherit');
this.renderer.setStyle(this.borderElement, 'transition', 'opacity 300ms ease');
this.renderer.setStyle(this.borderElement, 'opacity', '0');
this.renderer.setStyle(this.borderElement, 'z-index', '1');
// 创建背景元素 - 隐藏边框层的内部区域
this.backgroundElement = this.renderer.createElement('div');
this.renderer.addClass(this.backgroundElement, 'nc-magic-card-background');
this.renderer.setStyle(this.backgroundElement, 'pointer-events', 'none');
this.renderer.setStyle(this.backgroundElement, 'position', 'absolute');
this.renderer.setStyle(this.backgroundElement, 'inset', '0');
this.renderer.setStyle(this.backgroundElement, 'border-radius', 'inherit');
this.renderer.setStyle(this.backgroundElement, 'background-color', this.ncCardBackground);
this.renderer.setStyle(this.backgroundElement, 'z-index', '2');
// 创建渐变元素
this.gradientElement = this.renderer.createElement('div');
this.renderer.addClass(this.gradientElement, 'nc-magic-card-gradient');
this.renderer.setStyle(this.gradientElement, 'pointer-events', 'none');
this.renderer.setStyle(this.gradientElement, 'position', 'absolute');
this.renderer.setStyle(this.gradientElement, 'inset', '0');
this.renderer.setStyle(this.gradientElement, 'border-radius', 'inherit');
this.renderer.setStyle(this.gradientElement, 'transition', 'opacity 300ms ease');
this.renderer.setStyle(this.gradientElement, 'opacity', '0');
this.renderer.setStyle(this.gradientElement, 'z-index', '4');
// 原始内容位于背景层之上,渐变层之下
const children = Array.from(element.children);
children.forEach((child) => {
const childPosition = getComputedStyle(child).position;
if (!childPosition || childPosition === 'static') {
this.renderer.setStyle(child, 'position', 'relative');
}
this.renderer.setStyle(child, 'z-index', '3');
});
// 添加效果层到原始元素
this.renderer.appendChild(element, this.borderElement);
this.renderer.appendChild(element, this.backgroundElement);
this.renderer.appendChild(element, this.gradientElement);
}
addEventListeners() {
const element = this.el.nativeElement;
this.renderer.listen(element, 'mousemove', this.handleMouseMove);
this.renderer.listen(element, 'mouseleave', this.handleMouseLeave);
this.renderer.listen(element, 'mouseenter', this.handleMouseEnter);
}
initializeMousePosition() {
this.mouseX = -this.ncGradientSize;
this.mouseY = -this.ncGradientSize;
this.updateGradients();
}
updateGradients() {
if (this.borderElement && this.gradientElement) {
// 更新边框渐变
const borderColors = Array.isArray(this.ncBorderColor) ? this.ncBorderColor.join(',') : this.ncBorderColor;
const borderGradient = `radial-gradient(${this.ncGradientSize}px circle at ${this.mouseX}px ${this.mouseY}px, ${borderColors}, transparent)`;
this.renderer.setStyle(this.borderElement, 'background', borderGradient);
// 更新内部渐变
const innerColors = Array.isArray(this.ncGradientColor) ? this.ncGradientColor.join(',') : this.ncGradientColor;
const innerGradient = `radial-gradient(${this.ncGradientSize}px circle at ${this.mouseX}px ${this.mouseY}px, ${innerColors}, transparent 100%)`;
this.renderer.setStyle(this.gradientElement, 'background', innerGradient);
}
}
}
MagicCardDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MagicCardDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
MagicCardDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: MagicCardDirective, selector: "[ncMagicCard]", inputs: { ncGradientSize: "ncGradientSize", ncGradientColor: "ncGradientColor", ncGradientOpacity: "ncGradientOpacity", ncBorderColor: "ncBorderColor", ncCardBackground: "ncCardBackground" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MagicCardDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncMagicCard]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncGradientSize: [{
type: Input
}], ncGradientColor: [{
type: Input
}], ncGradientOpacity: [{
type: Input
}], ncBorderColor: [{
type: Input
}], ncCardBackground: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFnaWMtY2FyZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL21hZ2ljLWNhcmQvbWFnaWMtY2FyZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtoRixNQUFNLE9BQU8sa0JBQWtCO0lBc0M3QixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFyQy9ELGdCQUFnQjtRQUNQLG1CQUFjLEdBQVcsR0FBRyxDQUFDO1FBQ3RDLHdCQUF3QjtRQUNmLG9CQUFlLEdBQXNCLFdBQVcsQ0FBQztRQUMxRCxjQUFjO1FBQ0wsc0JBQWlCLEdBQVcsR0FBRyxDQUFDO1FBQ3pDLHNCQUFzQjtRQUNiLGtCQUFhLEdBQXNCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLGFBQWE7UUFDSixxQkFBZ0IsR0FBVyxPQUFPLENBQUM7UUFFcEMsV0FBTSxHQUFXLENBQUMsR0FBRyxDQUFDO1FBQ3RCLFdBQU0sR0FBVyxDQUFDLEdBQUcsQ0FBQztRQUt0QixxQkFBZ0IsR0FBRyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0YsQ0FBQyxDQUFDO1FBRU0sb0JBQWUsR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxF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TUFBTSxPQUFPLFdBQVcscUJBQXFCLENBQUM7WUFDaEosSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDM0U7SUFDSCxDQUFDOzsrR0E3SVUsa0JBQWtCO21HQUFsQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtpQkFDMUI7eUhBR1UsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuY01hZ2ljQ2FyZF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYWdpY0NhcmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8qKiDmuJDlj5jlpKflsI/vvIzljZXkvY1weCAqL1xyXG4gIEBJbnB1dCgpIG5jR3JhZGllbnRTaXplOiBudW1iZXIgPSAyMDA7XHJcbiAgLyoqIOWGhemDqOa4kOWPmOminOiJsu+8jOWPr+S7peaYr+WNleiJsuaIluminOiJsuaVsOe7hCAqL1xyXG4gIEBJbnB1dCgpIG5jR3JhZGllbnRDb2xvcjogc3RyaW5nIHwgc3RyaW5nW10gPSAnI0Q5RDlEOTU1JztcclxuICAvKiog5YaF6YOo5riQ5Y+Y6YCP5piO5bqmICovXHJcbiAgQElucHV0KCkgbmNHcmFkaWVudE9wYWNpdHk6IG51bWJlciA9IDAuODtcclxuICAvKiog6L655qGG6aKc6Imy77yM5Y+v5Lul5piv5Y2V6Imy5oiW6aKc6Imy5pWw57uEICovXHJcbiAgQElucHV0KCkgbmNCb3JkZXJDb2xvcjogc3RyaW5nIHwgc3RyaW5nW10gPSBbXCIjOUU3QUZGXCIsIFwiI0ZFOEJCQlwiXTtcclxuICAvKiog5Y2h54mH6IOM5pmv6aKc6ImyICovXHJcbiAgQElucHV0KCkgbmNDYXJkQmFja2dyb3VuZDogc3RyaW5nID0gJ3doaXRlJztcclxuXHJcbiAgcHJpdmF0ZSBtb3VzZVg6IG51bWJlciA9IC0yMDA7XHJcbiAgcHJpdmF0ZSBtb3VzZVk6IG51bWJlciA9IC0yMDA7XHJcbiAgcHJpdmF0ZSBib3JkZXJFbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBiYWNrZ3JvdW5kRWxlbWVudCE6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgZ3JhZGllbnRFbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlTW91c2VFbnRlciA9ICgpID0+IHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJFbGVtZW50LCAnb3BhY2l0eScsICcxJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAnb3BhY2l0eScsIHRoaXMubmNHcmFkaWVudE9wYWNpdHkudG9TdHJpbmcoKSk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMubW91c2VYID0gZS5jbGllbnRYIC0gcmVjdC5sZWZ0O1xyXG4gICAgdGhpcy5tb3VzZVkgPSBlLmNsaWVudFkgLSByZWN0LnRvcDtcclxuICAgIHRoaXMudXBkYXRlR3JhZGllbnRzKCk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZUxlYXZlID0gKCkgPT4ge1xyXG4gICAgdGhpcy5tb3VzZVggPSAtdGhpcy5uY0dyYWRpZW50U2l6ZTtcclxuICAgIHRoaXMubW91c2VZID0gLXRoaXMubmNHcmFkaWVudFNpemU7XHJcbiAgICB0aGlzLnVwZGF0ZUdyYWRpZW50cygpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckVsZW1lbnQsICdvcGFjaXR5JywgJzAnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ncmFkaWVudEVsZW1lbnQsICdvcGFjaXR5JywgJzAnKTtcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuc2V0dXBNYWdpY0NhcmQoKTtcclxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZU1vdXNlUG9zaXRpb24oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBNYWdpY0NhcmQoKSB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG5cclxuICAgIC8vIOiuvue9ruS4u+WuueWZqOagt+W8j1xyXG4gICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gY29tcHV0ZWRTdHlsZS5wb3NpdGlvbjtcclxuICAgIGlmICghZWxlbWVudFBvc2l0aW9uIHx8IGVsZW1lbnRQb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ25jLW1hZ2ljLWNhcmQnKTtcclxuXHJcbiAgICAvLyDojrflj5blrrnlmajnmoTovrnmoYblrr3luqZcclxuICAgIGNvbnN0IGJvcmRlclRvcFdpZHRoID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoKSB8fCAwO1xyXG4gICAgY29uc3QgYm9yZGVyUmlnaHRXaWR0aCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJSaWdodFdpZHRoKSB8fCAwO1xyXG4gICAgY29uc3QgYm9yZGVyQm90dG9tV2lkdGggPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgpIHx8IDA7XHJcbiAgICBjb25zdCBib3JkZXJMZWZ0V2lkdGggPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoKSB8fCAwO1xyXG5cclxuICAgIC8vIOWmguaenOayoeaciei+ueahhu+8jOm7mOiupOS9v+eUqDFweFxyXG4gICAgY29uc3QgbWF4Qm9yZGVyV2lkdGggPSBNYXRoLm1heChib3JkZXJUb3BXaWR0aCwgYm9yZGVyUmlnaHRXaWR0aCwgYm9yZGVyQm90dG9tV2lkdGgsIGJvcmRlckxlZnRXaWR0aCk7XHJcbiAgICBjb25zdCBib3JkZXJXaWR0aCA9IG1heEJvcmRlcldpZHRoID4gMCA/IG1heEJvcmRlcldpZHRoIDogMTtcclxuXHJcbiAgICAvLyDliJvlu7rovrnmoYblhYPntKAgLSDmoLnmja7lrp7pmYXovrnmoYblrr3luqblkJHlpJbmianlsZVcclxuICAgIHRoaXMuYm9yZGVyRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYm9yZGVyRWxlbWVudCwgJ25jLW1hZ2ljLWNhcmQtYm9yZGVyJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyRWxlbWVudCwgJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJFbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJFbGVtZW50LCAnaW5zZXQnLCBgLSR7Ym9yZGVyV2lkdGh9cHhgKTsgLy8g5qC55o2u6L655qGG5a695bqm5Yqo5oCB6K6+572uXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyRWxlbWVudCwgJ2JvcmRlci1yYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckVsZW1lbnQsICd0cmFuc2l0aW9uJywgJ29wYWNpdHkgMzAwbXMgZWFzZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckVsZW1lbnQsICdvcGFjaXR5JywgJzAnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJFbGVtZW50LCAnei1pbmRleCcsICcxJyk7XHJcblxyXG4gICAgLy8g5Yib5bu66IOM5pmv5YWD57SgIC0g6ZqQ6JeP6L655qGG5bGC55qE5YaF6YOo5Yy65Z+fXHJcbiAgICB0aGlzLmJhY2tncm91bmRFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5iYWNrZ3JvdW5kRWxlbWVudCwgJ25jLW1hZ2ljLWNhcmQtYmFja2dyb3VuZCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tncm91bmRFbGVtZW50LCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tncm91bmRFbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iYWNrZ3JvdW5kRWxlbWVudCwgJ2luc2V0JywgJzAnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iYWNrZ3JvdW5kRWxlbWVudCwgJ2JvcmRlci1yYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tncm91bmRFbGVtZW50LCAnYmFja2dyb3VuZC1jb2xvcicsIHRoaXMubmNDYXJkQmFja2dyb3VuZCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2dyb3VuZEVsZW1lbnQsICd6LWluZGV4JywgJzInKTtcclxuXHJcbiAgICAvLyDliJvlu7rmuJDlj5jlhYPntKBcclxuICAgIHRoaXMuZ3JhZGllbnRFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5ncmFkaWVudEVsZW1lbnQsICduYy1tYWdpYy1jYXJkLWdyYWRpZW50Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdyYWRpZW50RWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAnaW5zZXQnLCAnMCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdyYWRpZW50RWxlbWVudCwgJ2JvcmRlci1yYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdyYWRpZW50RWxlbWVudCwgJ3RyYW5zaXRpb24nLCAnb3BhY2l0eSAzMDBtcyBlYXNlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAnb3BhY2l0eScsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAnei1pbmRleCcsICc0Jyk7XHJcblxyXG4gICAgLy8g5Y6f5aeL5YaF5a655L2N5LqO6IOM5pmv5bGC5LmL5LiK77yM5riQ5Y+Y5bGC5LmL5LiLXHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWxlbWVudC5jaGlsZHJlbik7XHJcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNoaWxkUG9zaXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKGNoaWxkKS5wb3NpdGlvbjtcclxuICAgICAgaWYgKCFjaGlsZFBvc2l0aW9uIHx8IGNoaWxkUG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjaGlsZCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjaGlsZCwgJ3otaW5kZXgnLCAnMycpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5re75Yqg5pWI5p6c5bGC5Yiw5Y6f5aeL5YWD57SgXHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGVsZW1lbnQsIHRoaXMuYm9yZGVyRWxlbWVudCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGVsZW1lbnQsIHRoaXMuYmFja2dyb3VuZEVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChlbGVtZW50LCB0aGlzLmdyYWRpZW50RWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAnbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAnbW91c2VlbnRlcicsIHRoaXMuaGFuZGxlTW91c2VFbnRlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVNb3VzZVBvc2l0aW9uKCkge1xyXG4gICAgdGhpcy5tb3VzZVggPSAtdGhpcy5uY0dyYWRpZW50U2l6ZTtcclxuICAgIHRoaXMubW91c2VZID0gLXRoaXMubmNHcmFkaWVudFNpemU7XHJcbiAgICB0aGlzLnVwZGF0ZUdyYWRpZW50cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVHcmFkaWVudHMoKSB7XHJcbiAgICBpZiAodGhpcy5ib3JkZXJFbGVtZW50ICYmIHRoaXMuZ3JhZGllbnRFbGVtZW50KSB7XHJcbiAgICAgIC8vIOabtOaWsOi+ueahhua4kOWPmFxyXG4gICAgICBjb25zdCBib3JkZXJDb2xvcnMgPSBBcnJheS5pc0FycmF5KHRoaXMubmNCb3JkZXJDb2xvcikgPyB0aGlzLm5jQm9yZGVyQ29sb3Iuam9pbignLCcpIDogdGhpcy5uY0JvcmRlckNvbG9yO1xyXG4gICAgICBjb25zdCBib3JkZXJHcmFkaWVudCA9IGByYWRpYWwtZ3JhZGllbnQoJHt0aGlzLm5jR3JhZGllbnRTaXplfXB4IGNpcmNsZSBhdCAke3RoaXMubW91c2VYfXB4ICR7dGhpcy5tb3VzZVl9cHgsICR7Ym9yZGVyQ29sb3JzfSwgdHJhbnNwYXJlbnQpYDtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckVsZW1lbnQsICdiYWNrZ3JvdW5kJywgYm9yZGVyR3JhZGllbnQpO1xyXG5cclxuICAgICAgLy8g5pu05paw5YaF6YOo5riQ5Y+YXHJcbiAgICAgIGNvbnN0IGlubmVyQ29sb3JzID0gQXJyYXkuaXNBcnJheSh0aGlzLm5jR3JhZGllbnRDb2xvcikgPyB0aGlzLm5jR3JhZGllbnRDb2xvci5qb2luKCcsJykgOiB0aGlzLm5jR3JhZGllbnRDb2xvcjtcclxuICAgICAgY29uc3QgaW5uZXJHcmFkaWVudCA9IGByYWRpYWwtZ3JhZGllbnQoJHt0aGlzLm5jR3JhZGllbnRTaXplfXB4IGNpcmNsZSBhdCAke3RoaXMubW91c2VYfXB4ICR7dGhpcy5tb3VzZVl9cHgsICR7aW5uZXJDb2xvcnN9LCB0cmFuc3BhcmVudCAxMDAlKWA7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ncmFkaWVudEVsZW1lbnQsICdiYWNrZ3JvdW5kJywgaW5uZXJHcmFkaWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19