ng-cw-v12
Version:
Angular UI Component Library
296 lines • 42.9 kB
JavaScript
import { Component, ViewChild, Input, HostListener } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class LetterGlitchBackgroundComponent {
constructor(ngZone) {
this.ngZone = ngZone;
/** 闪烁颜色数组 */
this.ncGlitchColors = ['#2b4539', '#61dca3', '#61b3dc'];
/** 闪烁频率(毫秒)(1-100) */
this.ncGlitchSpeed = 50;
/** 是否显示中心暗角 */
this._centerVignette = false;
/** 是否显示边缘暗角 */
this._outerVignette = true;
/** 是否开启平滑过渡 */
this._smooth = true;
/** 字符集 */
this.ncCharacters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$&*()-_+=/[]{};:<>.,0123456789';
this.animationRef = null;
this.letters = [];
this.grid = { columns: 0, rows: 0 };
this.context = null;
this.lastGlitchTime = Date.now();
this.activeLetterIndices = new Set();
this.fontSize = 16;
this.charWidth = 10;
this.charHeight = 20;
this.animate = () => {
const now = Date.now();
if (now - this.lastGlitchTime >= this.ncGlitchSpeed) {
this.updateLetters();
if (!this.ncSmooth) {
this.drawLetters(this.activeLetterIndices);
this.activeLetterIndices.clear();
}
this.lastGlitchTime = now;
}
if (this.ncSmooth) {
this.handleSmoothTransitions();
}
this.animationRef = requestAnimationFrame(this.animate);
};
}
set ncCenterVignette(val) {
this._centerVignette = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncCenterVignette() {
return this._centerVignette;
}
set ncOuterVignette(val) {
this._outerVignette = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncOuterVignette() {
return this._outerVignette;
}
set ncSmooth(val) {
this._smooth = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncSmooth() {
return this._smooth;
}
ngOnInit() { }
ngAfterViewInit() {
this.ngZone.runOutsideAngular(() => {
this.initCanvas();
});
}
ngOnDestroy() {
if (this.animationRef !== null) {
cancelAnimationFrame(this.animationRef);
}
if (this.resizeTimeout) {
clearTimeout(this.resizeTimeout);
}
}
ngOnChanges(changes) {
// 处理参数变更,如果有需要可以通过此方法重建或直接影响下一帧渲染
if (changes['ncGlitchColors'] || changes['ncCharacters']) {
// 在下一次闪烁时自然会应用新参数
}
}
onResize() {
this.ngZone.runOutsideAngular(() => {
clearTimeout(this.resizeTimeout);
this.resizeTimeout = setTimeout(() => {
if (this.animationRef !== null) {
cancelAnimationFrame(this.animationRef);
}
this.resizeCanvas();
this.animate();
}, 100);
});
}
initCanvas() {
const canvas = this.canvasRef.nativeElement;
if (!canvas)
return;
this.context = canvas.getContext('2d');
this.resizeCanvas();
this.animate();
}
getRandomChar() {
const lettersAndSymbols = Array.from(this.ncCharacters);
return lettersAndSymbols[Math.floor(Math.random() * lettersAndSymbols.length)];
}
getRandomColor() {
return this.ncGlitchColors[Math.floor(Math.random() * this.ncGlitchColors.length)];
}
parseColor(color) {
if (color.startsWith('rgb')) {
const match = color.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
if (match) {
return {
r: parseInt(match[1], 10),
g: parseInt(match[2], 10),
b: parseInt(match[3], 10)
};
}
}
let hex = color;
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, (m, r, g, b) => {
return r + r + g + g + b + b;
});
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result
? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
}
: null;
}
interpolateColor(start, end, factor) {
const result = {
r: Math.round(start.r + (end.r - start.r) * factor),
g: Math.round(start.g + (end.g - start.g) * factor),
b: Math.round(start.b + (end.b - start.b) * factor)
};
return `rgb(${result.r}, ${result.g}, ${result.b})`;
}
calculateGrid(width, height) {
const columns = Math.ceil(width / this.charWidth);
const rows = Math.ceil(height / this.charHeight);
return { columns, rows };
}
initializeLetters(columns, rows) {
this.grid = { columns, rows };
const totalLetters = columns * rows;
this.letters = Array.from({ length: totalLetters }, () => {
const color = this.getRandomColor();
return {
char: this.getRandomChar(),
color: color,
originalColor: color,
targetColor: color,
colorProgress: 1
};
});
}
resizeCanvas() {
const canvas = this.canvasRef.nativeElement;
if (!canvas)
return;
const parent = canvas.parentElement;
if (!parent)
return;
const dpr = window.devicePixelRatio || 1;
const rect = parent.getBoundingClientRect();
canvas.width = rect.width * dpr;
canvas.height = rect.height * dpr;
canvas.style.width = `${rect.width}px`;
canvas.style.height = `${rect.height}px`;
if (this.context) {
this.context.setTransform(dpr, 0, 0, dpr, 0, 0);
}
const { columns, rows } = this.calculateGrid(rect.width, rect.height);
this.initializeLetters(columns, rows);
this.drawLetters();
}
drawLetters(indicesToDraw) {
if (!this.context || this.letters.length === 0)
return;
const ctx = this.context;
ctx.font = `${this.fontSize}px monospace`;
ctx.textBaseline = 'top';
if (!indicesToDraw) {
const { width, height } = this.canvasRef.nativeElement.getBoundingClientRect();
ctx.clearRect(0, 0, width, height);
this.letters.forEach((letter, index) => {
const x = (index % this.grid.columns) * this.charWidth;
const y = Math.floor(index / this.grid.columns) * this.charHeight;
ctx.fillStyle = letter.color;
ctx.fillText(letter.char, x, y);
});
return;
}
indicesToDraw.forEach(index => {
const letter = this.letters[index];
const x = (index % this.grid.columns) * this.charWidth;
const y = Math.floor(index / this.grid.columns) * this.charHeight;
ctx.clearRect(x, y, this.charWidth, this.charHeight);
ctx.fillStyle = letter.color;
ctx.fillText(letter.char, x, y);
});
}
updateLetters() {
if (!this.letters || this.letters.length === 0)
return;
const updateCount = Math.max(1, Math.floor(this.letters.length * 0.05));
for (let i = 0; i < updateCount; i++) {
const index = Math.floor(Math.random() * this.letters.length);
if (!this.letters[index])
continue;
this.letters[index].char = this.getRandomChar();
this.letters[index].targetColor = this.getRandomColor();
if (!this.ncSmooth) {
this.letters[index].color = this.letters[index].targetColor;
this.letters[index].originalColor = this.letters[index].targetColor;
this.letters[index].colorProgress = 1;
this.activeLetterIndices.add(index);
}
else {
this.letters[index].originalColor = this.letters[index].color;
this.letters[index].colorProgress = 0;
this.activeLetterIndices.add(index);
}
}
}
handleSmoothTransitions() {
let needsRedraw = false;
const itemsToDraw = new Set();
this.activeLetterIndices.forEach(index => {
const letter = this.letters[index];
if (letter.colorProgress < 1) {
letter.colorProgress += 0.015;
if (letter.colorProgress >= 1) {
letter.colorProgress = 1;
this.activeLetterIndices.delete(index);
}
const startRgb = this.parseColor(letter.originalColor);
const endRgb = this.parseColor(letter.targetColor);
if (startRgb && endRgb) {
letter.color = this.interpolateColor(startRgb, endRgb, letter.colorProgress);
needsRedraw = true;
itemsToDraw.add(index);
}
else {
letter.color = letter.targetColor;
letter.colorProgress = 1;
this.activeLetterIndices.delete(index);
needsRedraw = true;
itemsToDraw.add(index);
}
}
else {
this.activeLetterIndices.delete(index);
}
});
if (needsRedraw && itemsToDraw.size > 0) {
this.drawLetters(itemsToDraw);
}
}
}
LetterGlitchBackgroundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LetterGlitchBackgroundComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
LetterGlitchBackgroundComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LetterGlitchBackgroundComponent, selector: "nc-letter-glitch-background", inputs: { ncGlitchColors: "ncGlitchColors", ncGlitchSpeed: "ncGlitchSpeed", ncCenterVignette: "ncCenterVignette", ncOuterVignette: "ncOuterVignette", ncSmooth: "ncSmooth", ncCharacters: "ncCharacters" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #container class=\"nc-letter-glitch-container\">\r\n <canvas #canvas class=\"nc-letter-glitch-canvas\"></canvas>\r\n <div *ngIf=\"ncOuterVignette\" class=\"nc-outer-vignette\"></div>\r\n <div *ngIf=\"ncCenterVignette\" class=\"nc-center-vignette\"></div>\r\n</div>\r\n<div class=\"nc-content-wrapper\">\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [":host{display:block;position:relative;width:100%;height:100%;overflow:hidden}.nc-letter-glitch-container{position:absolute;inset:0;z-index:0;width:100%;height:100%;background-color:#000;overflow:hidden}.nc-letter-glitch-canvas{display:block;width:100%;height:100%}.nc-outer-vignette{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;background:radial-gradient(circle,rgba(0,0,0,0) 60%,#000000 100%)}.nc-center-vignette{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;background:radial-gradient(circle,rgba(0,0,0,.8) 0%,rgba(0,0,0,0) 60%)}.nc-content-wrapper{position:relative;z-index:1;width:100%;height:100%}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LetterGlitchBackgroundComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-letter-glitch-background',
templateUrl: './letter-glitch-background.component.html',
styleUrls: ['./letter-glitch-background.component.less']
}]
}], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { containerRef: [{
type: ViewChild,
args: ['container', { static: true }]
}], canvasRef: [{
type: ViewChild,
args: ['canvas', { static: true }]
}], ncGlitchColors: [{
type: Input
}], ncGlitchSpeed: [{
type: Input
}], ncCenterVignette: [{
type: Input
}], ncOuterVignette: [{
type: Input
}], ncSmooth: [{
type: Input
}], ncCharacters: [{
type: Input
}], onResize: [{
type: HostListener,
args: ['window:resize']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV0dGVyLWdsaXRjaC1iYWNrZ3JvdW5kLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvbGV0dGVyLWdsaXRjaC1iYWNrZ3JvdW5kL2xldHRlci1nbGl0Y2gtYmFja2dyb3VuZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2xldHRlci1nbGl0Y2gtYmFja2dyb3VuZC9sZXR0ZXItZ2xpdGNoLWJhY2tncm91bmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxTQUFTLEVBRVQsS0FBSyxFQUdMLFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQzs7O0FBZXZCLE1BQU0sT0FBTywrQkFBK0I7SUFzRDFDLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBbERsQyxhQUFhO1FBQ0osbUJBQWMsR0FBYSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEUsc0JBQXNCO1FBQ2Isa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFFcEMsZUFBZTtRQUNQLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBU3pDLGVBQWU7UUFDUCxtQkFBYyxHQUFZLElBQUksQ0FBQztRQVN2QyxlQUFlO1FBQ1AsWUFBTyxHQUFZLElBQUksQ0FBQztRQVNoQyxVQUFVO1FBQ0QsaUJBQVksR0FBVyw2REFBNkQsQ0FBQztRQUV0RixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixTQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMvQixZQUFPLEdBQW9DLElBQUksQ0FBQztRQUNoRCxtQkFBYyxHQUFXLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVwQyx3QkFB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VyxHQUFHLElBQUksQ0FBQztvQkFDbkIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDeEI7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQzs7NEhBN1JVLCtCQUErQjtnSEFBL0IsK0JBQStCLHlqQkMzQjVDLHVXQVFBOzJGRG1CYSwrQkFBK0I7a0JBTDNDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsV0FBVyxFQUFFLDJDQUEyQztvQkFDeEQsU0FBUyxFQUFFLENBQUMsMkNBQTJDLENBQUM7aUJBQ3pEOzZGQUUyQyxZQUFZO3NCQUFyRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0QsU0FBUztzQkFBL0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUc1QixjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQVdGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBV0YsUUFBUTtzQkFEWCxLQUFLO2dCQVNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBeUNOLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBOZ1pvbmVcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmludGVyZmFjZSBMZXR0ZXIge1xyXG4gIGNoYXI6IHN0cmluZztcclxuICBjb2xvcjogc3RyaW5nO1xyXG4gIG9yaWdpbmFsQ29sb3I6IHN0cmluZztcclxuICB0YXJnZXRDb2xvcjogc3RyaW5nO1xyXG4gIGNvbG9yUHJvZ3Jlc3M6IG51bWJlcjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1sZXR0ZXItZ2xpdGNoLWJhY2tncm91bmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sZXR0ZXItZ2xpdGNoLWJhY2tncm91bmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xldHRlci1nbGl0Y2gtYmFja2dyb3VuZC5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMZXR0ZXJHbGl0Y2hCYWNrZ3JvdW5kQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgY29udGFpbmVyUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnY2FudmFzJywgeyBzdGF0aWM6IHRydWUgfSkgY2FudmFzUmVmITogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XHJcblxyXG4gIC8qKiDpl6rng4HpopzoibLmlbDnu4QgKi9cclxuICBASW5wdXQoKSBuY0dsaXRjaENvbG9yczogc3RyaW5nW10gPSBbJyMyYjQ1MzknLCAnIzYxZGNhMycsICcjNjFiM2RjJ107XHJcbiAgLyoqIOmXqueDgemikeeOh++8iOavq+enku+8ie+8iDEtMTAw77yJICovXHJcbiAgQElucHV0KCkgbmNHbGl0Y2hTcGVlZDogbnVtYmVyID0gNTA7XHJcblxyXG4gIC8qKiDmmK/lkKbmmL7npLrkuK3lv4Pmmpfop5IgKi9cclxuICBwcml2YXRlIF9jZW50ZXJWaWduZXR0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jQ2VudGVyVmlnbmV0dGUodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jZW50ZXJWaWduZXR0ZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jQ2VudGVyVmlnbmV0dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2VudGVyVmlnbmV0dGU7XHJcbiAgfVxyXG5cclxuICAvKiog5piv5ZCm5pi+56S66L6557yY5pqX6KeSICovXHJcbiAgcHJpdmF0ZSBfb3V0ZXJWaWduZXR0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNPdXRlclZpZ25ldHRlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fb3V0ZXJWaWduZXR0ZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jT3V0ZXJWaWduZXR0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRlclZpZ25ldHRlO1xyXG4gIH1cclxuXHJcbiAgLyoqIOaYr+WQpuW8gOWQr+W5s+a7kei/h+a4oSAqL1xyXG4gIHByaXZhdGUgX3Ntb290aDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNTbW9vdGgodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9zbW9vdGggPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY1Ntb290aCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zbW9vdGg7XHJcbiAgfVxyXG5cclxuICAvKiog5a2X56ym6ZuGICovXHJcbiAgQElucHV0KCkgbmNDaGFyYWN0ZXJzOiBzdHJpbmcgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVohQCMkJiooKS1fKz0vW117fTs6PD4uLDAxMjM0NTY3ODknO1xyXG5cclxuICBwcml2YXRlIGFuaW1hdGlvblJlZjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsZXR0ZXJzOiBMZXR0ZXJbXSA9IFtdO1xyXG4gIHByaXZhdGUgZ3JpZCA9IHsgY29sdW1uczogMCwgcm93czogMCB9O1xyXG4gIHByaXZhdGUgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsYXN0R2xpdGNoVGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcclxuICBwcml2YXRlIHJlc2l6ZVRpbWVvdXQ6IGFueTtcclxuICBwcml2YXRlIGFjdGl2ZUxldHRlckluZGljZXM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpO1xyXG5cclxuICBwcml2YXRlIGZvbnRTaXplID0gMTY7XHJcbiAgcHJpdmF0ZSBjaGFyV2lkdGggPSAxMDtcclxuICBwcml2YXRlIGNoYXJIZWlnaHQgPSAyMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5pbml0Q2FudmFzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uUmVmICE9PSBudWxsKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uUmVmKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAvLyDlpITnkIblj4LmlbDlj5jmm7TvvIzlpoLmnpzmnInpnIDopoHlj6/ku6XpgJrov4fmraTmlrnms5Xph43lu7rmiJbnm7TmjqXlvbHlk43kuIvkuIDluKfmuLLmn5NcclxuICAgIGlmIChjaGFuZ2VzWyduY0dsaXRjaENvbG9ycyddIHx8IGNoYW5nZXNbJ25jQ2hhcmFjdGVycyddKSB7XHJcbiAgICAgIC8vIOWcqOS4i+S4gOasoemXqueDgeaXtuiHqueEtuS8muW6lOeUqOaWsOWPguaVsFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgb25SZXNpemUoKSB7XHJcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpO1xyXG4gICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25SZWYgIT09IG51bGwpIHtcclxuICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uUmVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTtcclxuICAgICAgICB0aGlzLmFuaW1hdGUoKTtcclxuICAgICAgfSwgMTAwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q2FudmFzKCkge1xyXG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghY2FudmFzKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5jb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICB0aGlzLnJlc2l6ZUNhbnZhcygpO1xyXG4gICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJhbmRvbUNoYXIoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxldHRlcnNBbmRTeW1ib2xzID0gQXJyYXkuZnJvbSh0aGlzLm5jQ2hhcmFjdGVycyk7XHJcbiAgICByZXR1cm4gbGV0dGVyc0FuZFN5bWJvbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGV0dGVyc0FuZFN5bWJvbHMubGVuZ3RoKV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJhbmRvbUNvbG9yKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uY0dsaXRjaENvbG9yc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLm5jR2xpdGNoQ29sb3JzLmxlbmd0aCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZUNvbG9yKGNvbG9yOiBzdHJpbmcpOiB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIgfSB8IG51bGwge1xyXG4gICAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XHJcbiAgICAgIGNvbnN0IG1hdGNoID0gY29sb3IubWF0Y2goL3JnYlxcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKylcXCkvKTtcclxuICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHI6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXHJcbiAgICAgICAgICBnOiBwYXJzZUludChtYXRjaFsyXSwgMTApLFxyXG4gICAgICAgICAgYjogcGFyc2VJbnQobWF0Y2hbM10sIDEwKVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgaGV4ID0gY29sb3I7XHJcbiAgICBjb25zdCBzaG9ydGhhbmRSZWdleCA9IC9eIz8oW2EtZlxcZF0pKFthLWZcXGRdKShbYS1mXFxkXSkkL2k7XHJcbiAgICBoZXggPSBoZXgucmVwbGFjZShzaG9ydGhhbmRSZWdleCwgKG0sIHIsIGcsIGIpID0+IHtcclxuICAgICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICA/IHtcclxuICAgICAgICByOiBwYXJzZUludChyZXN1bHRbMV0sIDE2KSxcclxuICAgICAgICBnOiBwYXJzZUludChyZXN1bHRbMl0sIDE2KSxcclxuICAgICAgICBiOiBwYXJzZUludChyZXN1bHRbM10sIDE2KVxyXG4gICAgICB9XHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZXJwb2xhdGVDb2xvcihzdGFydDogeyByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyIH0sIGVuZDogeyByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyIH0sIGZhY3RvcjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgICAgcjogTWF0aC5yb3VuZChzdGFydC5yICsgKGVuZC5yIC0gc3RhcnQucikgKiBmYWN0b3IpLFxyXG4gICAgICBnOiBNYXRoLnJvdW5kKHN0YXJ0LmcgKyAoZW5kLmcgLSBzdGFydC5nKSAqIGZhY3RvciksXHJcbiAgICAgIGI6IE1hdGgucm91bmQoc3RhcnQuYiArIChlbmQuYiAtIHN0YXJ0LmIpICogZmFjdG9yKVxyXG4gICAgfTtcclxuICAgIHJldHVybiBgcmdiKCR7cmVzdWx0LnJ9LCAke3Jlc3VsdC5nfSwgJHtyZXN1bHQuYn0pYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlR3JpZCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHsgY29sdW1uczogbnVtYmVyLCByb3dzOiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gTWF0aC5jZWlsKHdpZHRoIC8gdGhpcy5jaGFyV2lkdGgpO1xyXG4gICAgY29uc3Qgcm93cyA9IE1hdGguY2VpbChoZWlnaHQgLyB0aGlzLmNoYXJIZWlnaHQpO1xyXG4gICAgcmV0dXJuIHsgY29sdW1ucywgcm93cyB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplTGV0dGVycyhjb2x1bW5zOiBudW1iZXIsIHJvd3M6IG51bWJlcikge1xyXG4gICAgdGhpcy5ncmlkID0geyBjb2x1bW5zLCByb3dzIH07XHJcbiAgICBjb25zdCB0b3RhbExldHRlcnMgPSBjb2x1bW5zICogcm93cztcclxuICAgIHRoaXMubGV0dGVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRvdGFsTGV0dGVycyB9LCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5nZXRSYW5kb21Db2xvcigpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGNoYXI6IHRoaXMuZ2V0UmFuZG9tQ2hhcigpLFxyXG4gICAgICAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgICBvcmlnaW5hbENvbG9yOiBjb2xvcixcclxuICAgICAgICB0YXJnZXRDb2xvcjogY29sb3IsXHJcbiAgICAgICAgY29sb3JQcm9ncmVzczogMVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2l6ZUNhbnZhcygpIHtcclxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xyXG4gICAgY29uc3QgcGFyZW50ID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XHJcbiAgICBjb25zdCByZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIGNhbnZhcy53aWR0aCA9IHJlY3Qud2lkdGggKiBkcHI7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKiBkcHI7XHJcblxyXG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aH1weGA7XHJcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHR9cHhgO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbnRleHQpIHtcclxuICAgICAgdGhpcy5jb250ZXh0LnNldFRyYW5zZm9ybShkcHIsIDAsIDAsIGRwciwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBjb2x1bW5zLCByb3dzIH0gPSB0aGlzLmNhbGN1bGF0ZUdyaWQocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplTGV0dGVycyhjb2x1bW5zLCByb3dzKTtcclxuXHJcbiAgICB0aGlzLmRyYXdMZXR0ZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYXdMZXR0ZXJzKGluZGljZXNUb0RyYXc/OiBTZXQ8bnVtYmVyPikge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRleHQgfHwgdGhpcy5sZXR0ZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgY3R4ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgXHJcbiAgICBjdHguZm9udCA9IGAke3RoaXMuZm9udFNpemV9cHggbW9ub3NwYWNlYDtcclxuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcclxuXHJcbiAgICBpZiAoIWluZGljZXNUb0RyYXcpIHtcclxuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgdGhpcy5sZXR0ZXJzLmZvckVhY2goKGxldHRlciwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCB4ID0gKGluZGV4ICUgdGhpcy5ncmlkLmNvbHVtbnMpICogdGhpcy5jaGFyV2lkdGg7XHJcbiAgICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLmdyaWQuY29sdW1ucykgKiB0aGlzLmNoYXJIZWlnaHQ7XHJcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGxldHRlci5jb2xvcjtcclxuICAgICAgICBjdHguZmlsbFRleHQobGV0dGVyLmNoYXIsIHgsIHkpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGluZGljZXNUb0RyYXcuZm9yRWFjaChpbmRleCA9PiB7XHJcbiAgICAgIGNvbnN0IGxldHRlciA9IHRoaXMubGV0dGVyc1tpbmRleF07XHJcbiAgICAgIGNvbnN0IHggPSAoaW5kZXggJSB0aGlzLmdyaWQuY29sdW1ucykgKiB0aGlzLmNoYXJXaWR0aDtcclxuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLmdyaWQuY29sdW1ucykgKiB0aGlzLmNoYXJIZWlnaHQ7XHJcbiAgICAgIGN0eC5jbGVhclJlY3QoeCwgeSwgdGhpcy5jaGFyV2lkdGgsIHRoaXMuY2hhckhlaWdodCk7XHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBsZXR0ZXIuY29sb3I7XHJcbiAgICAgIGN0eC5maWxsVGV4dChsZXR0ZXIuY2hhciwgeCwgeSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTGV0dGVycygpIHtcclxuICAgIGlmICghdGhpcy5sZXR0ZXJzIHx8IHRoaXMubGV0dGVycy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVDb3VudCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5sZXR0ZXJzLmxlbmd0aCAqIDAuMDUpKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZUNvdW50OyBpKyspIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmxldHRlcnMubGVuZ3RoKTtcclxuICAgICAgaWYgKCF0aGlzLmxldHRlcnNbaW5kZXhdKSBjb250aW51ZTtcclxuXHJcbiAgICAgIHRoaXMubGV0dGVyc1tpbmRleF0uY2hhciA9IHRoaXMuZ2V0UmFuZG9tQ2hhcigpO1xyXG4gICAgICB0aGlzLmxldHRlcnNbaW5kZXhdLnRhcmdldENvbG9yID0gdGhpcy5nZXRSYW5kb21Db2xvcigpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLm5jU21vb3RoKSB7XHJcbiAgICAgICAgdGhpcy5sZXR0ZXJzW2luZGV4XS5jb2xvciA9IHRoaXMubGV0dGVyc1tpbmRleF0udGFyZ2V0Q29sb3I7XHJcbiAgICAgICAgdGhpcy5sZXR0ZXJzW2luZGV4XS5vcmlnaW5hbENvbG9yID0gdGhpcy5sZXR0ZXJzW2luZGV4XS50YXJnZXRDb2xvcjtcclxuICAgICAgICB0aGlzLmxldHRlcnNbaW5kZXhdLmNvbG9yUHJvZ3Jlc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTGV0dGVySW5kaWNlcy5hZGQoaW5kZXgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubGV0dGVyc1tpbmRleF0ub3JpZ2luYWxDb2xvciA9IHRoaXMubGV0dGVyc1tpbmRleF0uY29sb3I7XHJcbiAgICAgICAgdGhpcy5sZXR0ZXJzW2luZGV4XS5jb2xvclByb2dyZXNzID0gMDtcclxuICAgICAgICB0aGlzLmFjdGl2ZUxldHRlckluZGljZXMuYWRkKGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVTbW9vdGhUcmFuc2l0aW9ucygpIHtcclxuICAgIGxldCBuZWVkc1JlZHJhdyA9IGZhbHNlO1xyXG4gICAgY29uc3QgaXRlbXNUb0RyYXcgPSBuZXcgU2V0PG51bWJlcj4oKTtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZUxldHRlckluZGljZXMuZm9yRWFjaChpbmRleCA9PiB7XHJcbiAgICAgIGNvbnN0IGxldHRlciA9IHRoaXMubGV0dGVyc1tpbmRleF07XHJcbiAgICAgIGlmIChsZXR0ZXIuY29sb3JQcm9ncmVzcyA8IDEpIHtcclxuICAgICAgICBsZXR0ZXIuY29sb3JQcm9ncmVzcyArPSAwLjAxNTtcclxuICAgICAgICBpZiAobGV0dGVyLmNvbG9yUHJvZ3Jlc3MgPj0gMSkge1xyXG4gICAgICAgICAgbGV0dGVyLmNvbG9yUHJvZ3Jlc3MgPSAxO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVMZXR0ZXJJbmRpY2VzLmRlbGV0ZShpbmRleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdGFydFJnYiA9IHRoaXMucGFyc2VDb2xvcihsZXR0ZXIub3JpZ2luYWxDb2xvcik7XHJcbiAgICAgICAgY29uc3QgZW5kUmdiID0gdGhpcy5wYXJzZUNvbG9yKGxldHRlci50YXJnZXRDb2xvcik7XHJcblxyXG4gICAgICAgIGlmIChzdGFydFJnYiAmJiBlbmRSZ2IpIHtcclxuICAgICAgICAgIGxldHRlci5jb2xvciA9IHRoaXMuaW50ZXJwb2xhdGVDb2xvcihzdGFydFJnYiwgZW5kUmdiLCBsZXR0ZXIuY29sb3JQcm9ncmVzcyk7XHJcbiAgICAgICAgICBuZWVkc1JlZHJhdyA9IHRydWU7XHJcbiAgICAgICAgICBpdGVtc1RvRHJhdy5hZGQoaW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXR0ZXIuY29sb3IgPSBsZXR0ZXIudGFyZ2V0Q29sb3I7XHJcbiAgICAgICAgICBsZXR0ZXIuY29sb3JQcm9ncmVzcyA9IDE7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUxldHRlckluZGljZXMuZGVsZXRlKGluZGV4KTtcclxuICAgICAgICAgIG5lZWRzUmVkcmF3ID0gdHJ1ZTtcclxuICAgICAgICAgIGl0ZW1zVG9EcmF3LmFkZChpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTGV0dGVySW5kaWNlcy5kZWxldGUoaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAobmVlZHNSZWRyYXcgJiYgaXRlbXNUb0RyYXcuc2l6ZSA+IDApIHtcclxuICAgICAgdGhpcy5kcmF3TGV0dGVycyhpdGVtc1RvRHJhdyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFuaW1hdGUgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgaWYgKG5vdyAtIHRoaXMubGFzdEdsaXRjaFRpbWUgPj0gdGhpcy5uY0dsaXRjaFNwZWVkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlTGV0dGVycygpO1xyXG4gICAgICBpZiAoIXRoaXMubmNTbW9vdGgpIHtcclxuICAgICAgICB0aGlzLmRyYXdMZXR0ZXJzKHRoaXMuYWN0aXZlTGV0dGVySW5kaWNlcyk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVMZXR0ZXJJbmRpY2VzLmNsZWFyKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5sYXN0R2xpdGNoVGltZSA9IG5vdztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5uY1Ntb290aCkge1xyXG4gICAgICB0aGlzLmhhbmRsZVNtb290aFRyYW5zaXRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hbmltYXRpb25SZWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiAjY29udGFpbmVyIGNsYXNzPVwibmMtbGV0dGVyLWdsaXRjaC1jb250YWluZXJcIj5cclxuICA8Y2FudmFzICNjYW52YXMgY2xhc3M9XCJuYy1sZXR0ZXItZ2xpdGNoLWNhbnZhc1wiPjwvY2FudmFzPlxyXG4gIDxkaXYgKm5nSWY9XCJuY091dGVyVmlnbmV0dGVcIiBjbGFzcz1cIm5jLW91dGVyLXZpZ25ldHRlXCI+PC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cIm5jQ2VudGVyVmlnbmV0dGVcIiBjbGFzcz1cIm5jLWNlbnRlci12aWduZXR0ZVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm5jLWNvbnRlbnQtd3JhcHBlclwiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L2Rpdj5cclxuIl19