ng-cw-v12
Version:
Angular UI component library
166 lines • 30.9 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class SpinDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.ncType = 'dot'; // 加载样式类型:圆形或点状
this.ncTip = '';
this.ncSize = 'default';
this.ncMaskColor = 'rgba(0, 0, 0, 0.1)';
this.ncTipColor = '#1890ff';
this.ncTrackColor = '#f3f3f3'; // 轨道颜色
this.ncIndicatorColor = '#1890ff'; // 指示器颜色
// 为每个实例生成唯一的动画名称
this.animationName = `ncSpin_${Math.random().toString(36).substring(2, 11)}`;
}
set ncLoading(value) {
setTimeout(() => {
if (value) {
this.createSpinContainer();
}
else {
this.removeSpinContainer();
}
});
}
ngOnInit() { }
createSpinContainer() {
const elementPosition = this.el.nativeElement.style.position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
}
// 创建一个div,用于包裹加载指示器和文字
this.spinContainer = this.renderer.createElement('div');
this.renderer.addClass(this.spinContainer, 'spin-container');
this.renderer.setStyle(this.spinContainer, 'position', 'absolute');
this.renderer.setStyle(this.spinContainer, 'inset', '0');
this.renderer.setStyle(this.spinContainer, 'borderRadius', 'inherit');
this.renderer.setStyle(this.spinContainer, 'zIndex', '10001');
this.renderer.setStyle(this.spinContainer, 'background-color', this.ncMaskColor);
this.renderer.setStyle(this.spinContainer, 'display', 'flex');
this.renderer.setStyle(this.spinContainer, 'flex-direction', 'column');
this.renderer.setStyle(this.spinContainer, 'justify-content', 'center');
this.renderer.setStyle(this.spinContainer, 'align-items', 'center');
// 根据类型创建不同的加载指示器
if (this.ncType === 'circle') {
this.createCircleSpinner();
}
else if (this.ncType === 'dot') {
this.createDotSpinner();
}
// 创建一个div,用于显示文字
const loadingText = this.renderer.createElement('div');
this.renderer.addClass(loadingText, 'spin-text');
this.renderer.setStyle(loadingText, 'color', this.ncTipColor);
this.renderer.setStyle(loadingText, 'margin-top', `${this.ncSize === 'small' ? '5px' : this.ncSize === 'default' ? '10px' : '15px'}`);
this.renderer.setStyle(loadingText, 'font-size', `${this.ncSize === 'small' ? '12px' : this.ncSize === 'default' ? '16px' : '20px'}`);
this.renderer.setStyle(loadingText, 'letter-spacing', `${this.ncSize === 'small' ? '0.5px' : this.ncSize === 'default' ? '1px' : '2px'}`);
this.renderer.appendChild(loadingText, this.renderer.createText(this.ncTip));
// 如果存在文字,则添加到容器中
if (this.ncTip) {
this.renderer.appendChild(this.spinContainer, loadingText);
}
// 将容器添加到元素中
this.renderer.appendChild(this.el.nativeElement, this.spinContainer);
}
createCircleSpinner() {
const spinner = this.renderer.createElement('div');
this.renderer.addClass(spinner, 'spin-spinner');
this.renderer.setStyle(spinner, 'border', `${this.ncSize === 'small' ? '2px' : this.ncSize === 'default' ? '4px' : '6px'} solid ${this.ncTrackColor}`);
this.renderer.setStyle(spinner, 'border-top', `${this.ncSize === 'small' ? '2px' : this.ncSize === 'default' ? '4px' : '6px'} solid ${this.ncIndicatorColor}`);
this.renderer.setStyle(spinner, 'border-radius', '50%');
this.renderer.setStyle(spinner, 'width', `${this.ncSize === 'small' ? '20px' : this.ncSize === 'default' ? '40px' : '60px'}`);
this.renderer.setStyle(spinner, 'height', `${this.ncSize === 'small' ? '20px' : this.ncSize === 'default' ? '40px' : '60px'}`);
this.renderer.setStyle(spinner, 'animation', `${this.animationName} 1s linear infinite`);
const keyframes = `
${this.animationName} {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`;
this.keyframesStyle = this.renderer.createElement('style');
this.renderer.appendChild(this.keyframesStyle, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.keyframesStyle);
this.renderer.appendChild(this.spinContainer, spinner);
}
createDotSpinner() {
const dotSize = this.ncSize === 'small' ? 6 : this.ncSize === 'default' ? 10 : 14;
const containerSize = this.ncSize === 'small' ? 20 : this.ncSize === 'default' ? 40 : 60;
const dotContainer = this.renderer.createElement('div');
this.renderer.addClass(dotContainer, 'dot-spinner-container');
this.renderer.setStyle(dotContainer, 'position', 'relative');
this.renderer.setStyle(dotContainer, 'width', `${containerSize}px`);
this.renderer.setStyle(dotContainer, 'height', `${containerSize}px`);
this.renderer.setStyle(dotContainer, 'animation', `${this.animationName}_rotate 1.2s infinite linear`);
// 创建4个点
for (let i = 0; i < 4; i++) {
const dot = this.renderer.createElement('div');
this.renderer.addClass(dot, 'dot-spinner-item');
this.renderer.setStyle(dot, 'position', 'absolute');
this.renderer.setStyle(dot, 'width', `${dotSize}px`);
this.renderer.setStyle(dot, 'height', `${dotSize}px`);
this.renderer.setStyle(dot, 'background-color', this.ncIndicatorColor);
this.renderer.setStyle(dot, 'border-radius', '50%');
this.renderer.setStyle(dot, 'opacity', '0.3');
this.renderer.setStyle(dot, 'animation', `${this.animationName}_move 1s infinite linear alternate`);
this.renderer.setStyle(dot, 'animation-delay', `${i * 0.4}s`);
// 设置点的位置
const angle = i * 90; // 每个点相差90度
const radian = (angle * Math.PI) / 180;
const radius = containerSize / 2 - dotSize / 2;
const x = radius * Math.cos(radian);
const y = radius * Math.sin(radian);
this.renderer.setStyle(dot, 'top', `${containerSize / 2 - dotSize / 2 + y}px`);
this.renderer.setStyle(dot, 'left', `${containerSize / 2 - dotSize / 2 + x}px`);
this.renderer.appendChild(dotContainer, dot);
}
const keyframes = `
${this.animationName}_rotate {
to { transform: rotate(360deg); }
}
${this.animationName}_move {
to { opacity: 1; }
}
`;
this.keyframesStyle = this.renderer.createElement('style');
this.renderer.appendChild(this.keyframesStyle, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.keyframesStyle);
this.renderer.appendChild(this.spinContainer, dotContainer);
}
removeSpinContainer() {
if (this.spinContainer) {
this.renderer.removeChild(this.el.nativeElement, this.spinContainer);
this.spinContainer = null;
}
if (this.keyframesStyle) {
this.renderer.removeChild(this.el.nativeElement, this.keyframesStyle);
this.keyframesStyle = null;
}
}
}
SpinDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SpinDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
SpinDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: SpinDirective, selector: "[ncSpin]", inputs: { ncLoading: "ncLoading", ncType: "ncType", ncTip: "ncTip", ncSize: "ncSize", ncMaskColor: "ncMaskColor", ncTipColor: "ncTipColor", ncTrackColor: "ncTrackColor", ncIndicatorColor: "ncIndicatorColor" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SpinDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncSpin]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncLoading: [{
type: Input
}], ncType: [{
type: Input
}], ncTip: [{
type: Input
}], ncSize: [{
type: Input
}], ncMaskColor: [{
type: Input
}], ncTipColor: [{
type: Input
}], ncTrackColor: [{
type: Input
}], ncIndicatorColor: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NwaW4vc3Bpbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtoRixNQUFNLE9BQU8sYUFBYTtJQXFCekIsWUFBb0IsRUFBYyxFQUFVLFFBQW1CO1FBQTNDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBWHRELFdBQU0sR0FBcUIsS0FBSyxDQUFDLENBQUMsZUFBZTtRQUNqRCxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLFdBQU0sR0FBa0MsU0FBUyxDQUFDO1FBQ2xELGdCQUFXLEdBQVcsb0JBQW9CLENBQUM7UUFDM0MsZUFBVSxHQUFXLFNBQVMsQ0FBQztRQUMvQixpQkFBWSxHQUFXLFNBQVMsQ0FBQyxDQUFBLE9BQU87UUFDeEMscUJBQWdCLEdBQVcsU0FBUyxDQUFDLENBQUEsUUFBUTtRQU1yRCxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlFLENBQUM7SUF2QkQsSUFBYSxTQUFTLENBQUMsS0FBYztRQUNwQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxLQUFLLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDM0I7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDM0I7UUFDRixDQUFDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFpQkQsUUFBUSxLQUFLLENBQUM7SUFFTixtQkFBbUI7UUFDMUIsTUFBTSxlQUFl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QUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcblx0c2VsZWN0b3I6ICdbbmNTcGluXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwaW5EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cdEBJbnB1dCgpIHNldCBuY0xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRpZiAodmFsdWUpIHtcclxuXHRcdFx0XHR0aGlzLmNyZWF0ZVNwaW5Db250YWluZXIoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnJlbW92ZVNwaW5Db250YWluZXIoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHR9XHJcblx0QElucHV0KCkgbmNUeXBlOiAnY2lyY2xlJyB8ICdkb3QnID0gJ2RvdCc7IC8vIOWKoOi9veagt+W8j+exu+Wei++8muWchuW9ouaIlueCueeKtlxyXG5cdEBJbnB1dCgpIG5jVGlwOiBzdHJpbmcgPSAnJztcclxuXHRASW5wdXQoKSBuY1NpemU6ICdzbWFsbCcgfCAnZGVmYXVsdCcgfCAnbGFyZ2UnID0gJ2RlZmF1bHQnO1xyXG5cdEBJbnB1dCgpIG5jTWFza0NvbG9yOiBzdHJpbmcgPSAncmdiYSgwLCAwLCAwLCAwLjEpJztcclxuXHRASW5wdXQoKSBuY1RpcENvbG9yOiBzdHJpbmcgPSAnIzE4OTBmZic7XHJcblx0QElucHV0KCkgbmNUcmFja0NvbG9yOiBzdHJpbmcgPSAnI2YzZjNmMyc7Ly8g6L2o6YGT6aKc6ImyXHJcblx0QElucHV0KCkgbmNJbmRpY2F0b3JDb2xvcjogc3RyaW5nID0gJyMxODkwZmYnOy8vIOaMh+ekuuWZqOminOiJslxyXG5cdHByaXZhdGUgc3BpbkNvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgYW5pbWF0aW9uTmFtZTogc3RyaW5nO1xyXG5cdHByaXZhdGUga2V5ZnJhbWVzU3R5bGUhOiBIVE1MRWxlbWVudDtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcblx0XHQvLyDkuLrmr4/kuKrlrp7kvovnlJ/miJDllK/kuIDnmoTliqjnlLvlkI3np7BcclxuXHRcdHRoaXMuYW5pbWF0aW9uTmFtZSA9IGBuY1NwaW5fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTEpfWA7XHJcblx0fVxyXG5cclxuXHRuZ09uSW5pdCgpIHsgfVxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZVNwaW5Db250YWluZXIoKSB7XHJcblx0XHRjb25zdCBlbGVtZW50UG9zaXRpb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb247XHJcblx0XHRpZiAoIWVsZW1lbnRQb3NpdGlvbiB8fCBlbGVtZW50UG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDliJvlu7rkuIDkuKpkaXbvvIznlKjkuo7ljIXoo7nliqDovb3mjIfnpLrlmajlkozmloflrZdcclxuXHRcdHRoaXMuc3BpbkNvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuc3BpbkNvbnRhaW5lciwgJ3NwaW4tY29udGFpbmVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ2luc2V0JywgJzAnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnYm9yZGVyUmFkaXVzJywgJ2luaGVyaXQnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnekluZGV4JywgJzEwMDAxJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ2JhY2tncm91bmQtY29sb3InLCB0aGlzLm5jTWFza0NvbG9yKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnZGlzcGxheScsICdmbGV4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ2ZsZXgtZGlyZWN0aW9uJywgJ2NvbHVtbicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xyXG5cclxuXHRcdC8vIOagueaNruexu+Wei+WIm+W7uuS4jeWQjOeahOWKoOi9veaMh+ekuuWZqFxyXG5cdFx0aWYgKHRoaXMubmNUeXBlID09PSAnY2lyY2xlJykge1xyXG5cdFx0XHR0aGlzLmNyZWF0ZUNpcmNsZVNwaW5uZXIoKTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5uY1R5cGUgPT09ICdkb3QnKSB7XHJcblx0XHRcdHRoaXMuY3JlYXRlRG90U3Bpbm5lcigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOWIm+W7uuS4gOS4qmRpdu+8jOeUqOS6juaYvuekuuaWh+Wtl1xyXG5cdFx0Y29uc3QgbG9hZGluZ1RleHQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyhsb2FkaW5nVGV4dCwgJ3NwaW4tdGV4dCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShsb2FkaW5nVGV4dCwgJ2NvbG9yJywgdGhpcy5uY1RpcENvbG9yKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobG9hZGluZ1RleHQsICdtYXJnaW4tdG9wJywgYCR7dGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAnNXB4JyA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAnMTBweCcgOiAnMTVweCd9YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGxvYWRpbmdUZXh0LCAnZm9udC1zaXplJywgYCR7dGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAnMTJweCcgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gJzE2cHgnIDogJzIwcHgnfWApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShsb2FkaW5nVGV4dCwgJ2xldHRlci1zcGFjaW5nJywgYCR7dGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAnMC41cHgnIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/ICcxcHgnIDogJzJweCd9YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGxvYWRpbmdUZXh0LCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQodGhpcy5uY1RpcCkpO1xyXG5cclxuXHRcdC8vIOWmguaenOWtmOWcqOaWh+Wtl++8jOWImea3u+WKoOWIsOWuueWZqOS4rVxyXG5cdFx0aWYgKHRoaXMubmNUaXApIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnNwaW5Db250YWluZXIsIGxvYWRpbmdUZXh0KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDlsIblrrnlmajmt7vliqDliLDlhYPntKDkuK1cclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnNwaW5Db250YWluZXIpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVDaXJjbGVTcGlubmVyKCkge1xyXG5cdFx0Y29uc3Qgc3Bpbm5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHNwaW5uZXIsICdzcGluLXNwaW5uZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3Bpbm5lciwgJ2JvcmRlcicsIGAke3RoaXMubmNTaXplID09PSAnc21hbGwnID8gJzJweCcgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gJzRweCcgOiAnNnB4J30gc29saWQgJHt0aGlzLm5jVHJhY2tDb2xvcn1gKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3Bpbm5lciwgJ2JvcmRlci10b3AnLCBgJHt0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/ICcycHgnIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/ICc0cHgnIDogJzZweCd9IHNvbGlkICR7dGhpcy5uY0luZGljYXRvckNvbG9yfWApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShzcGlubmVyLCAnYm9yZGVyLXJhZGl1cycsICc1MCUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3Bpbm5lciwgJ3dpZHRoJywgYCR7dGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAnMjBweCcgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gJzQwcHgnIDogJzYwcHgnfWApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShzcGlubmVyLCAnaGVpZ2h0JywgYCR7dGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAnMjBweCcgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gJzQwcHgnIDogJzYwcHgnfWApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShzcGlubmVyLCAnYW5pbWF0aW9uJywgYCR7dGhpcy5hbmltYXRpb25OYW1lfSAxcyBsaW5lYXIgaW5maW5pdGVgKTtcclxuXHJcblx0XHRjb25zdCBrZXlmcmFtZXMgPSBgXHJcbiAgICAgICAgICAgIEBrZXlmcmFtZXMgJHt0aGlzLmFuaW1hdGlvbk5hbWV9IHtcclxuICAgICAgICAgICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cclxuICAgICAgICAgICAgICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBgO1xyXG5cdFx0dGhpcy5rZXlmcmFtZXNTdHlsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5rZXlmcmFtZXNTdHlsZSwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGtleWZyYW1lcykpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMua2V5ZnJhbWVzU3R5bGUpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zcGluQ29udGFpbmVyLCBzcGlubmVyKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY3JlYXRlRG90U3Bpbm5lcigpIHtcclxuXHRcdGNvbnN0IGRvdFNpemUgPSB0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/IDYgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gMTAgOiAxNDtcclxuXHRcdGNvbnN0IGNvbnRhaW5lclNpemUgPSB0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/IDIwIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/IDQwIDogNjA7XHJcblxyXG5cdFx0Y29uc3QgZG90Q29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZG90Q29udGFpbmVyLCAnZG90LXNwaW5uZXItY29udGFpbmVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdENvbnRhaW5lciwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdENvbnRhaW5lciwgJ3dpZHRoJywgYCR7Y29udGFpbmVyU2l6ZX1weGApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3RDb250YWluZXIsICdoZWlnaHQnLCBgJHtjb250YWluZXJTaXplfXB4YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdENvbnRhaW5lciwgJ2FuaW1hdGlvbicsIGAke3RoaXMuYW5pbWF0aW9uTmFtZX1fcm90YXRlIDEuMnMgaW5maW5pdGUgbGluZWFyYCk7XHJcblxyXG5cdFx0Ly8g5Yib5bu6NOS4queCuVxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcclxuXHRcdFx0Y29uc3QgZG90ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkb3QsICdkb3Qtc3Bpbm5lci1pdGVtJyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICd3aWR0aCcsIGAke2RvdFNpemV9cHhgKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdoZWlnaHQnLCBgJHtkb3RTaXplfXB4YCk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnYmFja2dyb3VuZC1jb2xvcicsIHRoaXMubmNJbmRpY2F0b3JDb2xvcik7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnYm9yZGVyLXJhZGl1cycsICc1MCUnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdvcGFjaXR5JywgJzAuMycpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ2FuaW1hdGlvbicsIGAke3RoaXMuYW5pbWF0aW9uTmFtZX1fbW92ZSAxcyBpbmZpbml0ZSBsaW5lYXIgYWx0ZXJuYXRlYCk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnYW5pbWF0aW9uLWRlbGF5JywgYCR7aSAqIDAuNH1zYCk7XHJcblxyXG5cdFx0XHQvLyDorr7nva7ngrnnmoTkvY3nva5cclxuXHRcdFx0Y29uc3QgYW5nbGUgPSBpICogOTA7IC8vIOavj+S4queCueebuOW3rjkw5bqmXHJcblx0XHRcdGNvbnN0IHJhZGlhbiA9IChhbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xyXG5cdFx0XHRjb25zdCByYWRpdXMgPSBjb250YWluZXJTaXplIC8gMiAtIGRvdFNpemUgLyAyO1xyXG5cdFx0XHRjb25zdCB4ID0gcmFkaXVzICogTWF0aC5jb3MocmFkaWFuKTtcclxuXHRcdFx0Y29uc3QgeSA9IHJhZGl1cyAqIE1hdGguc2luKHJhZGlhbik7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ3RvcCcsIGAke2NvbnRhaW5lclNpemUgLyAyIC0gZG90U2l6ZSAvIDIgKyB5fXB4YCk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnbGVmdCcsIGAke2NvbnRhaW5lclNpemUgLyAyIC0gZG90U2l6ZSAvIDIgKyB4fXB4YCk7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvdENvbnRhaW5lciwgZG90KTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Y29uc3Qga2V5ZnJhbWVzID0gYFxyXG5cdFx0XHRAa2V5ZnJhbWVzICR7dGhpcy5hbmltYXRpb25OYW1lfV9yb3RhdGUge1xyXG5cdFx0XHRcdHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxyXG5cdFx0XHR9XHJcblx0XHRcdEBrZXlmcmFtZXMgJHt0aGlzLmFuaW1hdGlvbk5hbWV9X21vdmUge1xyXG5cdFx0XHRcdHRvIHsgb3BhY2l0eTogMTsgfVxyXG5cdFx0XHR9XHJcblx0XHRgO1xyXG5cclxuXHRcdHRoaXMua2V5ZnJhbWVzU3R5bGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMua2V5ZnJhbWVzU3R5bGUsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChrZXlmcmFtZXMpKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmtleWZyYW1lc1N0eWxlKTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuc3BpbkNvbnRhaW5lciwgZG90Q29udGFpbmVyKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVtb3ZlU3BpbkNvbnRhaW5lcigpIHtcclxuXHRcdGlmICh0aGlzLnNwaW5Db250YWluZXIpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuc3BpbkNvbnRhaW5lcik7XHJcblx0XHRcdHRoaXMuc3BpbkNvbnRhaW5lciA9IG51bGwhO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMua2V5ZnJhbWVzU3R5bGUpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMua2V5ZnJhbWVzU3R5bGUpO1xyXG5cdFx0XHR0aGlzLmtleWZyYW1lc1N0eWxlID0gbnVsbCE7XHJcblx0XHR9XHJcblx0fVxyXG59Il19