ng-cw-v12
Version:
Angular UI component library
130 lines • 19.9 kB
JavaScript
import { Component, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class SparklesTextComponent {
constructor() {
/** 展示的文本内容 */
this._text = '';
/** 闪烁点的数量 */
this.ncCount = 10;
/** 闪烁点的颜色数组 */
this.ncColors = ['#9E7AFF', '#FE8BBB', '#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'];
/** 闪烁循环时间(秒) */
this.ncDuration = 0.8;
/** 闪烁点的最大尺寸 */
this.ncSize = 21;
this.sparkles = [];
}
set ncText(value) {
this._text = value;
this.cleanup();
setTimeout(() => {
this.initializeSparkles();
this.startAnimation();
});
}
get ncText() {
return this._text;
}
ngOnInit() { }
ngOnDestroy() {
this.cleanup();
}
initializeSparkles() {
this.sparkles = Array.from({ length: this.ncCount }, () => this.generateSparkle());
}
generateSparkle() {
const x = `${Math.random() * 100}%`;
const y = `${Math.random() * 100}%`;
const color = this.ncColors[Math.floor(Math.random() * this.ncColors.length)];
const delay = Math.random() * 2;
const scale = Math.random() * 1 + 0.3;
const lifespan = Math.random() * 10 + 5;
const id = `${x}-${y}-${Date.now()}-${Math.random()}`;
const opacity = 0;
const rotation = 75;
const scaleValue = 0;
return { id, x, y, color, delay, scale, lifespan, opacity, rotation, scaleValue };
}
startAnimation() {
// 更新闪烁点生命周期
this.intervalId = window.setInterval(() => {
this.sparkles = this.sparkles.map(sparkle => {
if (sparkle.lifespan <= 0) {
return this.generateSparkle();
}
else {
return Object.assign(Object.assign({}, sparkle), { lifespan: sparkle.lifespan - 0.1 });
}
});
}, 100);
// 动画循环 - 模拟Framer Motion的关键帧动画
const animate = () => {
this.sparkles = this.sparkles.map(sparkle => {
const time = (Date.now() * 0.001 + sparkle.delay) % this.ncDuration; // 使用可配置的循环时间
const progress = time / this.ncDuration;
// 模拟关键帧动画 [0, 1, 0]
let opacity;
let scaleValue;
let rotation;
if (progress <= 0.5) {
// 前半段:0 -> 1
const t = progress * 2;
opacity = t;
scaleValue = t * sparkle.scale;
rotation = 75 + (120 - 75) * t;
}
else {
// 后半段:1 -> 0
const t = (progress - 0.5) * 2;
opacity = 1 - t;
scaleValue = (1 - t) * sparkle.scale;
rotation = 120 + (150 - 120) * t;
}
return Object.assign(Object.assign({}, sparkle), { opacity, rotation, scaleValue });
});
this.animationFrameId = requestAnimationFrame(animate);
};
animate();
}
cleanup() {
if (this.intervalId) {
clearInterval(this.intervalId);
}
if (this.animationFrameId) {
cancelAnimationFrame(this.animationFrameId);
}
}
getSparkleStyle(sparkle) {
return {
left: sparkle.x,
top: sparkle.y,
opacity: sparkle.opacity,
transform: `scale(${sparkle.scaleValue}) rotate(${sparkle.rotation}deg)`
};
}
trackBySparkleId(index, sparkle) {
return sparkle.id;
}
}
SparklesTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SparklesTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
SparklesTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SparklesTextComponent, selector: "nc-sparkles-text", inputs: { ncText: "ncText", ncCount: "ncCount", ncColors: "ncColors", ncDuration: "ncDuration", ncSize: "ncSize" }, ngImport: i0, template: "<div class=\"sparkles-text\">\r\n <span class=\"sparkles-container\">\r\n <!-- \u95EA\u70C1\u70B9 -->\r\n <svg *ngFor=\"let sparkle of sparkles; trackBy: trackBySparkleId\" [ngStyle]=\"getSparkleStyle(sparkle)\"\r\n class=\"sparkle-svg\" [attr.width]=\"ncSize\" [attr.height]=\"ncSize\" viewBox=\"0 0 21 21\">\r\n <path\r\n d=\"M9.82531 0.843845C10.0553 0.215178 10.9446 0.215178 11.1746 0.843845L11.8618 2.72026C12.4006 4.19229 12.3916 6.39157 13.5 7.5C14.6084 8.60843 16.8077 8.59935 18.2797 9.13822L20.1561 9.82534C20.7858 10.0553 20.7858 10.9447 20.1561 11.1747L18.2797 11.8618C16.8077 12.4007 14.6084 12.3916 13.5 13.5C12.3916 14.6084 12.4006 16.8077 11.8618 18.2798L11.1746 20.1562C10.9446 20.7858 10.0553 20.7858 9.82531 20.1562L9.13819 18.2798C8.59932 16.8077 8.60843 14.6084 7.5 13.5C6.39157 12.3916 4.19225 12.4007 2.72023 11.8618L0.843814 11.1747C0.215148 10.9447 0.215148 10.0553 0.843814 9.82534L2.72023 9.13822C4.19225 8.59935 6.39157 8.60843 7.5 7.5C8.60843 6.39157 8.59932 4.19229 9.13819 2.72026L9.82531 0.843845Z\"\r\n [attr.fill]=\"sparkle.color\" />\r\n </svg>\r\n <!-- \u6587\u672C\u5185\u5BB9 -->\r\n <span class=\"sparkles-content\">{{ncText}}</span>\r\n </span>\r\n</div>", styles: [".sparkles-text{position:relative;display:inline-block}.sparkles-text .sparkles-container{position:relative;display:inline-block}.sparkles-text .sparkles-container .sparkle-svg{position:absolute;pointer-events:none;z-index:20}.sparkles-text .sparkles-container .sparkles-content{position:relative;z-index:10}\n"], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SparklesTextComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-sparkles-text',
templateUrl: './sparkles-text.component.html',
styleUrls: ['./sparkles-text.component.less']
}]
}], ctorParameters: function () { return []; }, propDecorators: { ncText: [{
type: Input
}], ncCount: [{
type: Input
}], ncColors: [{
type: Input
}], ncDuration: [{
type: Input
}], ncSize: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcmtsZXMtdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NwYXJrbGVzLXRleHQvc3BhcmtsZXMtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NwYXJrbGVzLXRleHQvc3BhcmtsZXMtdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQzs7O0FBb0JwRSxNQUFNLE9BQU8scUJBQXFCO0lBNEJoQztRQTNCQSxjQUFjO1FBQ04sVUFBSyxHQUFXLEVBQUUsQ0FBQztRQWEzQixhQUFhO1FBQ0osWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUM5QixlQUFlO1FBQ04sYUFBUSxHQUFhLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRyxnQkFBZ0I7UUFDUCxlQUFVLEdBQVcsR0FBRyxDQUFDO1FBQ2xDLGVBQWU7UUFDTixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBRTdCLGFBQVEsR0FBYyxFQUFFLENBQUM7SUFJVCxDQUFDO0lBekJqQixJQUNJLE1BQU0sQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFnQkQsUUFBUSxLQUFVLENB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QU8sQ0FBQyxVQUFVLFlBQVksT0FBTyxDQUFDLFFBQVEsTUFBTTtTQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWEsRUFBRSxPQUFnQjtRQUM5QyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7a0hBekhVLHFCQUFxQjtzR0FBckIscUJBQXFCLDRLQ3BCbEMsMHdDQVlNOzJGRFFPLHFCQUFxQjtrQkFMakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixXQUFXLEVBQUUsZ0NBQWdDO29CQUM3QyxTQUFTLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztpQkFDOUM7MEVBS0ssTUFBTTtzQkFEVCxLQUFLO2dCQWFHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmludGVyZmFjZSBTcGFya2xlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIHg6IHN0cmluZztcclxuICB5OiBzdHJpbmc7XHJcbiAgY29sb3I6IHN0cmluZztcclxuICBkZWxheTogbnVtYmVyO1xyXG4gIHNjYWxlOiBudW1iZXI7XHJcbiAgbGlmZXNwYW46IG51bWJlcjtcclxuICBvcGFjaXR5OiBudW1iZXI7XHJcbiAgcm90YXRpb246IG51bWJlcjtcclxuICBzY2FsZVZhbHVlOiBudW1iZXI7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmMtc3BhcmtsZXMtdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NwYXJrbGVzLXRleHQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NwYXJrbGVzLXRleHQuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3BhcmtsZXNUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiDlsZXnpLrnmoTmlofmnKzlhoXlrrkgKi9cclxuICBwcml2YXRlIF90ZXh0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1RleHQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fdGV4dCA9IHZhbHVlO1xyXG4gICAgdGhpcy5jbGVhbnVwKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplU3BhcmtsZXMoKTtcclxuICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBuY1RleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90ZXh0O1xyXG4gIH1cclxuICAvKiog6Zeq54OB54K555qE5pWw6YePICovXHJcbiAgQElucHV0KCkgbmNDb3VudDogbnVtYmVyID0gMTA7XHJcbiAgLyoqIOmXqueDgeeCueeahOminOiJsuaVsOe7hCAqL1xyXG4gIEBJbnB1dCgpIG5jQ29sb3JzOiBzdHJpbmdbXSA9IFsnIzlFN0FGRicsICcjRkU4QkJCJywgJyNGRjZCNkInLCAnIzRFQ0RDNCcsICcjNDVCN0QxJywgJyM5NkNFQjQnXTtcclxuICAvKiog6Zeq54OB5b6q546v5pe26Ze077yI56eS77yJICovXHJcbiAgQElucHV0KCkgbmNEdXJhdGlvbjogbnVtYmVyID0gMC44O1xyXG4gIC8qKiDpl6rng4HngrnnmoTmnIDlpKflsLrlr7ggKi9cclxuICBASW5wdXQoKSBuY1NpemU6IG51bWJlciA9IDIxO1xyXG5cclxuICBzcGFya2xlczogU3BhcmtsZVtdID0gW107XHJcbiAgcHJpdmF0ZSBpbnRlcnZhbElkPzogbnVtYmVyO1xyXG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZD86IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYW51cCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplU3BhcmtsZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNwYXJrbGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5uY0NvdW50IH0sICgpID0+IHRoaXMuZ2VuZXJhdGVTcGFya2xlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVNwYXJrbGUoKTogU3BhcmtsZSB7XHJcbiAgICBjb25zdCB4ID0gYCR7TWF0aC5yYW5kb20oKSAqIDEwMH0lYDtcclxuICAgIGNvbnN0IHkgPSBgJHtNYXRoLnJhbmRvbSgpICogMTAwfSVgO1xyXG4gICAgY29uc3QgY29sb3IgPSB0aGlzLm5jQ29sb3JzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMubmNDb2xvcnMubGVuZ3RoKV07XHJcbiAgICBjb25zdCBkZWxheSA9IE1hdGgucmFuZG9tKCkgKiAyO1xyXG4gICAgY29uc3Qgc2NhbGUgPSBNYXRoLnJhbmRvbSgpICogMSArIDAuMztcclxuICAgIGNvbnN0IGxpZmVzcGFuID0gTWF0aC5yYW5kb20oKSAqIDEwICsgNTtcclxuICAgIGNvbnN0IGlkID0gYCR7eH0tJHt5fS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gO1xyXG4gICAgY29uc3Qgb3BhY2l0eSA9IDA7XHJcbiAgICBjb25zdCByb3RhdGlvbiA9IDc1O1xyXG4gICAgY29uc3Qgc2NhbGVWYWx1ZSA9IDA7XHJcblxyXG4gICAgcmV0dXJuIHsgaWQsIHgsIHksIGNvbG9yLCBkZWxheSwgc2NhbGUsIGxpZmVzcGFuLCBvcGFjaXR5LCByb3RhdGlvbiwgc2NhbGVWYWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIOabtOaWsOmXqueDgeeCueeUn+WRveWRqOacn1xyXG4gICAgdGhpcy5pbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5zcGFya2xlcyA9IHRoaXMuc3BhcmtsZXMubWFwKHNwYXJrbGUgPT4ge1xyXG4gICAgICAgIGlmIChzcGFya2xlLmxpZmVzcGFuIDw9IDApIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU3BhcmtsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5zcGFya2xlLCBsaWZlc3Bhbjogc3BhcmtsZS5saWZlc3BhbiAtIDAuMSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LCAxMDApO1xyXG5cclxuICAgIC8vIOWKqOeUu+W+queOryAtIOaooeaLn0ZyYW1lciBNb3Rpb27nmoTlhbPplK7luKfliqjnlLtcclxuICAgIGNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3BhcmtsZXMgPSB0aGlzLnNwYXJrbGVzLm1hcChzcGFya2xlID0+IHtcclxuICAgICAgICBjb25zdCB0aW1lID0gKERhdGUubm93KCkgKiAwLjAwMSArIHNwYXJrbGUuZGVsYXkpICUgdGhpcy5uY0R1cmF0aW9uOyAvLyDkvb/nlKjlj6/phY3nva7nmoTlvqrnjq/ml7bpl7RcclxuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWUgLyB0aGlzLm5jRHVyYXRpb247XHJcblxyXG4gICAgICAgIC8vIOaooeaLn+WFs+mUruW4p+WKqOeUuyBbMCwgMSwgMF1cclxuICAgICAgICBsZXQgb3BhY2l0eTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBzY2FsZVZhbHVlOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IHJvdGF0aW9uOiBudW1iZXI7XHJcblxyXG4gICAgICAgIGlmIChwcm9ncmVzcyA8PSAwLjUpIHtcclxuICAgICAgICAgIC8vIOWJjeWNiuaute+8mjAgLT4gMVxyXG4gICAgICAgICAgY29uc3QgdCA9IHByb2dyZXNzICogMjtcclxuICAgICAgICAgIG9wYWNpdHkgPSB0O1xyXG4gICAgICAgICAgc2NhbGVWYWx1ZSA9IHQgKiBzcGFya2xlLnNjYWxlO1xyXG4gICAgICAgICAgcm90YXRpb24gPSA3NSArICgxMjAgLSA3NSkgKiB0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlkI7ljYrmrrXvvJoxIC0+IDBcclxuICAgICAgICAgIGNvbnN0IHQgPSAocHJvZ3Jlc3MgLSAwLjUpICogMjtcclxuICAgICAgICAgIG9wYWNpdHkgPSAxIC0gdDtcclxuICAgICAgICAgIHNjYWxlVmFsdWUgPSAoMSAtIHQpICogc3BhcmtsZS5zY2FsZTtcclxuICAgICAgICAgIHJvdGF0aW9uID0gMTIwICsgKDE1MCAtIDEyMCkgKiB0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgLi4uc3BhcmtsZSwgb3BhY2l0eSwgcm90YXRpb24sIHNjYWxlVmFsdWUgfTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGFuaW1hdGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYW51cCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmludGVydmFsSWQpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3BhcmtsZVN0eWxlKHNwYXJrbGU6IFNwYXJrbGUpOiBhbnkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGVmdDogc3BhcmtsZS54LFxyXG4gICAgICB0b3A6IHNwYXJrbGUueSxcclxuICAgICAgb3BhY2l0eTogc3BhcmtsZS5vcGFjaXR5LFxyXG4gICAgICB0cmFuc2Zvcm06IGBzY2FsZSgke3NwYXJrbGUuc2NhbGVWYWx1ZX0pIHJvdGF0ZSgke3NwYXJrbGUucm90YXRpb259ZGVnKWBcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0cmFja0J5U3BhcmtsZUlkKGluZGV4OiBudW1iZXIsIHNwYXJrbGU6IFNwYXJrbGUpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHNwYXJrbGUuaWQ7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzcGFya2xlcy10ZXh0XCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGVzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDwhLS0g6Zeq54OB54K5IC0tPlxyXG4gICAgICAgIDxzdmcgKm5nRm9yPVwibGV0IHNwYXJrbGUgb2Ygc3BhcmtsZXM7IHRyYWNrQnk6IHRyYWNrQnlTcGFya2xlSWRcIiBbbmdTdHlsZV09XCJnZXRTcGFya2xlU3R5bGUoc3BhcmtsZSlcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInNwYXJrbGUtc3ZnXCIgW2F0dHIud2lkdGhdPVwibmNTaXplXCIgW2F0dHIuaGVpZ2h0XT1cIm5jU2l6ZVwiIHZpZXdCb3g9XCIwIDAgMjEgMjFcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNOS44MjUzMSAwLjg0Mzg0NUMxMC4wNTUzIDAuMjE1MTc4IDEwLjk0NDYgMC4yMTUxNzggMTEuMTc0NiAwLjg0Mzg0NUwxMS44NjE4IDIuNzIwMjZDMTIuNDAwNiA0LjE5MjI5IDEyLjM5MTYgNi4zOTE1NyAxMy41IDcuNUMxNC42MDg0IDguNjA4NDMgMTYuODA3NyA4LjU5OTM1IDE4LjI3OTcgOS4xMzgyMkwyMC4xNTYxIDkuODI1MzRDMjAuNzg1OCAxMC4wNTUzIDIwLjc4NTggMTAuOTQ0NyAyMC4xNTYxIDExLjE3NDdMMTguMjc5NyAxMS44NjE4QzE2LjgwNzcgMTIuNDAwNyAxNC42MDg0IDEyLjM5MTYgMTMuNSAxMy41QzEyLjM5MTYgMTQuNjA4NCAxMi40MDA2IDE2LjgwNzcgMTEuODYxOCAxOC4yNzk4TDExLjE3NDYgMjAuMTU2MkMxMC45NDQ2IDIwLjc4NTggMTAuMDU1MyAyMC43ODU4IDkuODI1MzEgMjAuMTU2Mkw5LjEzODE5IDE4LjI3OThDOC41OTkzMiAxNi44MDc3IDguNjA4NDMgMTQuNjA4NCA3LjUgMTMuNUM2LjM5MTU3IDEyLjM5MTYgNC4xOTIyNSAxMi40MDA3IDIuNzIwMjMgMTEuODYxOEwwLjg0MzgxNCAxMS4xNzQ3QzAuMjE1MTQ4IDEwLjk0NDcgMC4yMTUxNDggMTAuMDU1MyAwLjg0MzgxNCA5LjgyNTM0TDIuNzIwMjMgOS4xMzgyMkM0LjE5MjI1IDguNTk5MzUgNi4zOTE1NyA4LjYwODQzIDcuNSA3LjVDOC42MDg0MyA2LjM5MTU3IDguNTk5MzIgNC4xOTIyOSA5LjEzODE5IDIuNzIwMjZMOS44MjUzMSAwLjg0Mzg0NVpcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJzcGFya2xlLmNvbG9yXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8IS0tIOaWh+acrOWGheWuuSAtLT5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGVzLWNvbnRlbnRcIj57e25jVGV4dH19PC9zcGFuPlxyXG4gICAgPC9zcGFuPlxyXG48L2Rpdj4iXX0=