ng-cw-v12
Version:
Angular UI Component Library
160 lines • 24.4 kB
JavaScript
import { Component, Input, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
export class AuroraTextComponent {
constructor(ngZone) {
this.ngZone = ngZone;
/** 文本内容 */
this.ncText = '';
/** 渐变颜色数组 */
this.ncColors = ["#FF0080", "#7928CA", "#0070F3", "#38bdf8", "#a855f7", "#2dd4bf"];
/** 动画速度,值越大,动画速度越快 */
this.ncSpeed = 1;
this.dimensions = { width: 0, height: 0 };
this.isReady = false;
this.textStyle = {};
this.maskId = `aurora-mask-${Math.random().toString(36).substring(2, 11)}`;
}
ngAfterViewInit() {
this.start();
}
ngOnChanges(changes) {
if (changes['ncText'] && !changes['ncText'].firstChange) {
this.start();
}
}
ngOnDestroy() {
this.clear();
}
start() {
setTimeout(() => {
this.clear();
this.computeTextStyles();
this.updateDimensions();
this.ngZone.runOutsideAngular(() => {
this.startAnimation();
});
});
}
clear() {
if (this.animationFrameId) {
cancelAnimationFrame(this.animationFrameId);
}
}
computeTextStyles() {
var _a;
if ((_a = this.textContentRef) === null || _a === void 0 ? void 0 : _a.nativeElement) {
const computedStyle = getComputedStyle(this.textContentRef.nativeElement);
this.textStyle = this.extractTextStyles(computedStyle);
}
}
updateDimensions() {
var _a;
if ((_a = this.svgTextRef) === null || _a === void 0 ? void 0 : _a.nativeElement) {
try {
const bbox = this.svgTextRef.nativeElement.getBBox();
this.dimensions = {
width: Math.max(1, bbox.width),
height: Math.max(1, bbox.height)
};
this.isReady = true;
}
catch (e) {
console.error('获取 SVG 元素尺寸时出错:', e);
}
}
}
startAnimation() {
var _a;
const canvas = (_a = this.canvasRef) === null || _a === void 0 ? void 0 : _a.nativeElement;
if (!canvas)
return;
const ctx = canvas.getContext('2d');
if (!ctx)
return;
let time = 0;
const baseSpeed = 0.008;
const animate = () => {
if (!ctx || !canvas)
return;
if (canvas.width !== this.dimensions.width ||
canvas.height !== this.dimensions.height) {
canvas.width = this.dimensions.width;
canvas.height = this.dimensions.height;
}
ctx.clearRect(0, 0, canvas.width, canvas.height);
time += baseSpeed * this.ncSpeed;
this.ncColors.forEach((color, i) => {
const x = canvas.width *
(0.5 +
Math.cos(time * 0.8 + i * 1.3) * 0.4 +
Math.sin(time * 0.5 + i * 0.7) * 0.2);
const y = canvas.height *
(0.5 +
Math.sin(time * 0.7 + i * 1.5) * 0.4 +
Math.cos(time * 0.6 + i * 0.8) * 0.2);
const gradient = ctx.createRadialGradient(x, y, 0, x, y, canvas.width * 0.4);
gradient.addColorStop(0, `${color}99`);
gradient.addColorStop(0.5, `${color}33`);
gradient.addColorStop(1, "#00000000");
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, canvas.width, canvas.height);
});
this.animationFrameId = requestAnimationFrame(animate);
};
animate();
}
getStyleString() {
let styleStr = '';
for (const [key, value] of Object.entries(this.textStyle)) {
if (value) {
// 将驼峰命名转换为连字符命名
const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();
styleStr += `${cssKey}:${value};`;
}
}
return styleStr;
}
// 提取文本相关样式的辅助方法
extractTextStyles(computedStyle) {
return {
fontSize: computedStyle.fontSize,
fontFamily: computedStyle.fontFamily,
fontWeight: computedStyle.fontWeight,
fontStyle: computedStyle.fontStyle,
letterSpacing: computedStyle.letterSpacing,
lineHeight: computedStyle.lineHeight,
textTransform: computedStyle.textTransform,
fontVariant: computedStyle.fontVariant,
fontStretch: computedStyle.fontStretch,
fontFeatureSettings: computedStyle.fontFeatureSettings,
textDecoration: computedStyle.textDecoration,
textShadow: computedStyle.textShadow,
};
}
}
AuroraTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AuroraTextComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
AuroraTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AuroraTextComponent, selector: "nc-aurora-text", inputs: { ncText: "ncText", ncColors: "ncColors", ncSpeed: "ncSpeed" }, viewQueries: [{ propertyName: "textContentRef", first: true, predicate: ["textContent"], descendants: true }, { propertyName: "svgTextRef", first: true, predicate: ["svgText"], descendants: true }, { propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span class=\"aurora-text relative inline-block align-middle\" [style.width]=\"dimensions.width ? dimensions.width + 'px' : 'auto'\"\r\n [style.height]=\"dimensions.height ? dimensions.height + 'px' : 'auto'\">\r\n\r\n <!-- \u9690\u85CF\u7684\u6587\u672C\u7528\u4E8ESEO -->\r\n <span class=\"sr-only\">\r\n {{ncText}}\r\n </span>\r\n\r\n <!-- \u89C6\u89C9\u5360\u4F4D\u7B26 -->\r\n <span #textContent style=\"opacity: 0;display: inline-block; white-space: nowrap;\"\r\n [style.position]=\"isReady ? 'absolute' : 'relative'\" aria-hidden=\"true\">\r\n {{ncText}}\r\n </span>\r\n\r\n <div class=\"absolute inset-0\" [style.opacity]=\"isReady ? 1 : 0\" style=\"transition: opacity 0.2s ease-in;\"\r\n aria-hidden=\"true\">\r\n\r\n <svg [attr.width]=\"dimensions.width\" [attr.height]=\"dimensions.height\" class=\"absolute inset-0\">\r\n <defs>\r\n <clipPath [attr.id]=\"maskId\">\r\n <text #svgText x=\"50%\" y=\"50%\" dominant-baseline=\"middle\" text-anchor=\"middle\"\r\n [attr.style]=\"getStyleString()\">{{ncText}}</text>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <canvas #canvas [style.clip-path]=\"'url(#' + maskId + ')'\" [style.-webkit-clip-path]=\"'url(#' + maskId + ')'\"\r\n class=\"h-full w-full\">\r\n </canvas>\r\n </div>\r\n</span>", styles: [":host{display:inline-block}.relative{position:relative}.absolute{position:absolute}.inset-0{top:0;right:0;bottom:0;left:0}.inline-block{display:inline-block}.align-middle{vertical-align:middle}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.h-full{height:100%}.w-full{width:100%}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AuroraTextComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-aurora-text',
templateUrl: './aurora-text.component.html',
styleUrls: ['./aurora-text.component.less']
}]
}], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { ncText: [{
type: Input
}], ncColors: [{
type: Input
}], ncSpeed: [{
type: Input
}], textContentRef: [{
type: ViewChild,
args: ['textContent']
}], svgTextRef: [{
type: ViewChild,
args: ['svgText']
}], canvasRef: [{
type: ViewChild,
args: ['canvas']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVyb3JhLXRleHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9hdXJvcmEtdGV4dC9hdXJvcmEtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1cm9yYS10ZXh0L2F1cm9yYS10ZXh0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFjLFNBQVMsRUFBOEQsTUFBTSxlQUFlLENBQUM7O0FBT3BJLE1BQU0sT0FBTyxtQkFBbUI7SUFtQjlCLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBbEJsQyxXQUFXO1FBQ0YsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUM3QixhQUFhO1FBQ0osYUFBUSxHQUFhLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRyxzQkFBc0I7UUFDYixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBTTdCLGVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsY0FBUyxHQUFpQyxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFXLGVBQWUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFJeEMsQ0FBQztJQUV2QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8s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RSxhQUFhLENBQUMsY0FBYztZQUM1QyxVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVU7U0FDckMsQ0FBQztJQUNKLENBQUM7O2dIQWhLVSxtQkFBbUI7b0dBQW5CLG1CQUFtQixnYkNQaEMsZzZDQThCTzsyRkR2Qk0sbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFdBQVcsRUFBRSw4QkFBOEI7b0JBQzNDLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2lCQUM1Qzs2RkFHVSxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRW9CLGNBQWM7c0JBQXZDLFNBQVM7dUJBQUMsYUFBYTtnQkFDRixVQUFVO3NCQUEvQixTQUFTO3VCQUFDLFNBQVM7Z0JBQ0MsU0FBUztzQkFBN0IsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLWF1cm9yYS10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXVyb3JhLXRleHQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2F1cm9yYS10ZXh0LmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1cm9yYVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgLyoqIOaWh+acrOWGheWuuSAqL1xyXG4gIEBJbnB1dCgpIG5jVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgLyoqIOa4kOWPmOminOiJsuaVsOe7hCAqL1xyXG4gIEBJbnB1dCgpIG5jQ29sb3JzOiBzdHJpbmdbXSA9IFtcIiNGRjAwODBcIiwgXCIjNzkyOENBXCIsIFwiIzAwNzBGM1wiLCBcIiMzOGJkZjhcIiwgXCIjYTg1NWY3XCIsIFwiIzJkZDRiZlwiXTtcclxuICAvKiog5Yqo55S76YCf5bqm77yM5YC86LaK5aSn77yM5Yqo55S76YCf5bqm6LaK5b+rICovXHJcbiAgQElucHV0KCkgbmNTcGVlZDogbnVtYmVyID0gMTtcclxuXHJcbiAgQFZpZXdDaGlsZCgndGV4dENvbnRlbnQnKSB0ZXh0Q29udGVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdzdmdUZXh0Jykgc3ZnVGV4dFJlZiE6IEVsZW1lbnRSZWY8U1ZHVGV4dEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycpIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG5cclxuICBkaW1lbnNpb25zID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XHJcbiAgaXNSZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRleHRTdHlsZTogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPiA9IHt9O1xyXG4gIG1hc2tJZDogc3RyaW5nID0gYGF1cm9yYS1tYXNrLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDExKX1gO1xyXG5cclxuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ/OiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXJ0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snbmNUZXh0J10gJiYgIWNoYW5nZXNbJ25jVGV4dCddLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuc3RhcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydCgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY29tcHV0ZVRleHRTdHlsZXMoKTtcclxuICAgICAgdGhpcy51cGRhdGVEaW1lbnNpb25zKCk7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVUZXh0U3R5bGVzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnRSZWY/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy50ZXh0Q29udGVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgdGhpcy50ZXh0U3R5bGUgPSB0aGlzLmV4dHJhY3RUZXh0U3R5bGVzKGNvbXB1dGVkU3R5bGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVEaW1lbnNpb25zKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3ZnVGV4dFJlZj8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGJib3ggPSB0aGlzLnN2Z1RleHRSZWYubmF0aXZlRWxlbWVudC5nZXRCQm94KCk7XHJcbiAgICAgICAgdGhpcy5kaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgd2lkdGg6IE1hdGgubWF4KDEsIGJib3gud2lkdGgpLFxyXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heCgxLCBiYm94LmhlaWdodClcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaXNSZWFkeSA9IHRydWU7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCfojrflj5YgU1ZHIOWFg+e0oOWwuuWvuOaXtuWHuumUmTonLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzUmVmPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFjYW52YXMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIGlmICghY3R4KSByZXR1cm47XHJcblxyXG4gICAgbGV0IHRpbWUgPSAwO1xyXG4gICAgY29uc3QgYmFzZVNwZWVkID0gMC4wMDg7XHJcblxyXG4gICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcclxuICAgICAgaWYgKCFjdHggfHwgIWNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gdGhpcy5kaW1lbnNpb25zLndpZHRoIHx8XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCAhPT0gdGhpcy5kaW1lbnNpb25zLmhlaWdodCkge1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy53aWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5kaW1lbnNpb25zLmhlaWdodDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG5cclxuICAgICAgdGltZSArPSBiYXNlU3BlZWQgKiB0aGlzLm5jU3BlZWQ7XHJcblxyXG4gICAgICB0aGlzLm5jQ29sb3JzLmZvckVhY2goKGNvbG9yLCBpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgeCA9XHJcbiAgICAgICAgICBjYW52YXMud2lkdGggKlxyXG4gICAgICAgICAgKDAuNSArXHJcbiAgICAgICAgICAgIE1hdGguY29zKHRpbWUgKiAwLjggKyBpICogMS4zKSAqIDAuNCArXHJcbiAgICAgICAgICAgIE1hdGguc2luKHRpbWUgKiAwLjUgKyBpICogMC43KSAqIDAuMik7XHJcbiAgICAgICAgY29uc3QgeSA9XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ICpcclxuICAgICAgICAgICgwLjUgK1xyXG4gICAgICAgICAgICBNYXRoLnNpbih0aW1lICogMC43ICsgaSAqIDEuNSkgKiAwLjQgK1xyXG4gICAgICAgICAgICBNYXRoLmNvcyh0aW1lICogMC42ICsgaSAqIDAuOCkgKiAwLjIpO1xyXG5cclxuICAgICAgICBjb25zdCBncmFkaWVudCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudChcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgY2FudmFzLndpZHRoICogMC40LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGdyYWRpZW50LmFkZENvbG9yU3RvcCgwLCBgJHtjb2xvcn05OWApO1xyXG4gICAgICAgIGdyYWRpZW50LmFkZENvbG9yU3RvcCgwLjUsIGAke2NvbG9yfTMzYCk7XHJcbiAgICAgICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDEsIFwiIzAwMDAwMDAwXCIpO1xyXG5cclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gZ3JhZGllbnQ7XHJcbiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBhbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRTdHlsZVN0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IHN0eWxlU3RyID0gJyc7XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRleHRTdHlsZSkpIHtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgLy8g5bCG6am85bOw5ZG95ZCN6L2s5o2i5Li66L+e5a2X56ym5ZG95ZCNXHJcbiAgICAgICAgY29uc3QgY3NzS2V5ID0ga2V5LnJlcGxhY2UoLyhbQS1aXSkvZywgJy0kMScpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgc3R5bGVTdHIgKz0gYCR7Y3NzS2V5fToke3ZhbHVlfTtgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3R5bGVTdHI7XHJcbiAgfVxyXG5cclxuICAvLyDmj5Dlj5bmlofmnKznm7jlhbPmoLflvI/nmoTovoXliqnmlrnms5VcclxuICBwcml2YXRlIGV4dHJhY3RUZXh0U3R5bGVzKGNvbXB1dGVkU3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZvbnRTaXplOiBjb21wdXRlZFN0eWxlLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiBjb21wdXRlZFN0eWxlLmZvbnRGYW1pbHksXHJcbiAgICAgIGZvbnRXZWlnaHQ6IGNvbXB1dGVkU3R5bGUuZm9udFdlaWdodCxcclxuICAgICAgZm9udFN0eWxlOiBjb21wdXRlZFN0eWxlLmZvbnRTdHlsZSxcclxuICAgICAgbGV0dGVyU3BhY2luZzogY29tcHV0ZWRTdHlsZS5sZXR0ZXJTcGFjaW5nLFxyXG4gICAgICBsaW5lSGVpZ2h0OiBjb21wdXRlZFN0eWxlLmxpbmVIZWlnaHQsXHJcbiAgICAgIHRleHRUcmFuc2Zvcm06IGNvbXB1dGVkU3R5bGUudGV4dFRyYW5zZm9ybSxcclxuICAgICAgZm9udFZhcmlhbnQ6IGNvbXB1dGVkU3R5bGUuZm9udFZhcmlhbnQsXHJcbiAgICAgIGZvbnRTdHJldGNoOiBjb21wdXRlZFN0eWxlLmZvbnRTdHJldGNoLFxyXG4gICAgICBmb250RmVhdHVyZVNldHRpbmdzOiBjb21wdXRlZFN0eWxlLmZvbnRGZWF0dXJlU2V0dGluZ3MsXHJcbiAgICAgIHRleHREZWNvcmF0aW9uOiBjb21wdXRlZFN0eWxlLnRleHREZWNvcmF0aW9uLFxyXG4gICAgICB0ZXh0U2hhZG93OiBjb21wdXRlZFN0eWxlLnRleHRTaGFkb3csXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCI8c3BhbiBjbGFzcz1cImF1cm9yYS10ZXh0IHJlbGF0aXZlIGlubGluZS1ibG9jayBhbGlnbi1taWRkbGVcIiBbc3R5bGUud2lkdGhdPVwiZGltZW5zaW9ucy53aWR0aCA/IGRpbWVuc2lvbnMud2lkdGggKyAncHgnIDogJ2F1dG8nXCJcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiZGltZW5zaW9ucy5oZWlnaHQgPyBkaW1lbnNpb25zLmhlaWdodCArICdweCcgOiAnYXV0bydcIj5cclxuXHJcbiAgICA8IS0tIOmakOiXj+eahOaWh+acrOeUqOS6jlNFTyAtLT5cclxuICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPlxyXG4gICAgICAgIHt7bmNUZXh0fX1cclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8IS0tIOinhuinieWNoOS9jeespiAtLT5cclxuICAgIDxzcGFuICN0ZXh0Q29udGVudCBzdHlsZT1cIm9wYWNpdHk6IDA7ZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiXHJcbiAgICAgICAgW3N0eWxlLnBvc2l0aW9uXT1cImlzUmVhZHkgPyAnYWJzb2x1dGUnIDogJ3JlbGF0aXZlJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgIHt7bmNUZXh0fX1cclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQtMFwiIFtzdHlsZS5vcGFjaXR5XT1cImlzUmVhZHkgPyAxIDogMFwiIHN0eWxlPVwidHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UtaW47XCJcclxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuXHJcbiAgICAgICAgPHN2ZyBbYXR0ci53aWR0aF09XCJkaW1lbnNpb25zLndpZHRoXCIgW2F0dHIuaGVpZ2h0XT1cImRpbWVuc2lvbnMuaGVpZ2h0XCIgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC0wXCI+XHJcbiAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIFthdHRyLmlkXT1cIm1hc2tJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0ICNzdmdUZXh0IHg9XCI1MCVcIiB5PVwiNTAlXCIgZG9taW5hbnQtYmFzZWxpbmU9XCJtaWRkbGVcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cImdldFN0eWxlU3RyaW5nKClcIj57e25jVGV4dH19PC90ZXh0PlxyXG4gICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICA8Y2FudmFzICNjYW52YXMgW3N0eWxlLmNsaXAtcGF0aF09XCIndXJsKCMnICsgbWFza0lkICsgJyknXCIgW3N0eWxlLi13ZWJraXQtY2xpcC1wYXRoXT1cIid1cmwoIycgKyBtYXNrSWQgKyAnKSdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbCB3LWZ1bGxcIj5cclxuICAgICAgICA8L2NhbnZhcz5cclxuICAgIDwvZGl2PlxyXG48L3NwYW4+Il19