UNPKG

ng-cw-v12

Version:

Angular UI Component Library

329 lines 53 kB
import { Component, Input } from '@angular/core'; import { trigger, style, animate, transition, state } from '@angular/animations'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class AnimateTextComponent { constructor(elementRef) { this.elementRef = elementRef; /** 展示的文本内容 */ this.ncText = ''; /** 延迟 */ this.ncDelay = 0; /** 动画类型 */ this.ncAnimation = 'fadeIn'; /** 动画分割方式 */ this.ncBy = 'word'; /** 每个分割块动画持续时间 */ this.ncDuration = 300; /** 每个分割块之间的延迟(按text分割) */ this.ncDelayMultipleByText = 60; /** 每个分割块之间的延迟(按word分割) */ this.ncDelayMultipleByWord = 50; /** 每个分割块之间的延迟(按character分割) */ this.ncDelayMultipleByCharacter = 30; /** 每个分割块之间的延迟(按line分割) */ this.ncDelayMultipleByLine = 60; /** 是否在视图可见时才开始动画 */ this._startOnView = false; /** 是否只执行一次动画 */ this._once = false; this.segments = []; this.segmentStates = []; this.observer = null; this.timeout = null; // 交错时间 this.staggerTimings = {}; } set ncStartOnView(val) { this._startOnView = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncStartOnView() { return this._startOnView; } set ncOnce(val) { this._once = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncOnce() { return this._once; } ngOnInit() { this.staggerTimings = { text: this.ncDelayMultipleByText, word: this.ncDelayMultipleByWord, character: this.ncDelayMultipleByCharacter, line: this.ncDelayMultipleByLine }; } ngOnChanges(changes) { if (changes['ncText']) { this.start(); } } ngOnDestroy() { this.clear(); } start() { this.clear(); this.splitText(); // 初始所有段落都隐藏 this.segmentStates = this.segments.map(() => 'hidden'); if (this.ncStartOnView) { this.setupIntersectionObserver(); } else { this.timeout = setTimeout(() => { this.animateIn(); }, this.ncDelay); } } clear() { if (this.observer) { this.observer.disconnect(); } if (this.timeout) { clearTimeout(this.timeout); } } splitText() { switch (this.ncBy) { case 'word': this.segments = this.ncText.split(/(\s+)/); break; case 'character': this.segments = this.ncText.split(''); break; case 'line': this.segments = this.ncText.split('\n'); break; case 'text': default: this.segments = [this.ncText]; break; } } setupIntersectionObserver() { const options = { root: null, rootMargin: '0px', threshold: 0.1 }; this.observer = new IntersectionObserver((entries) => { var _a; if (entries[0].isIntersecting) { this.timeout = setTimeout(() => { this.animateIn(); }, this.ncDelay); if (this.ncOnce) { (_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect(); } } else if (!this.ncOnce) { this.animateOut(); } }, options); this.observer.observe(this.elementRef.nativeElement); } // 计算每个段落的延迟时间 getSegmentDelay(index) { const staggerDelay = this.staggerTimings[this.ncBy] || 50; return index * staggerDelay; } // 根据索引获取段落的动画状态 getSegmentState(index) { return this.segmentStates[index] || 'hidden'; } // 获取段落类名 getSegmentClass(index) { let classes = 'animate-text-segment'; if (this.ncBy === 'line') { classes += ' block'; } else { classes += ' inline-block whitespace-pre'; } if (this.ncBy === 'character') { classes += ' character'; } return classes; } // 获取动画参数 getAnimationParams(index) { return { duration: this.ncDuration, delay: this.getSegmentDelay(index) }; } // 执行进入动画 animateIn() { this.segmentStates.forEach((state, index) => { this.segmentStates[index] = 'visible'; }); } // 执行退出动画 animateOut() { //若存在ncDelay,离开视图后,进入动画(animateIn)可能还未执行,则需要清除timeout if (this.timeout) { clearTimeout(this.timeout); } //隐藏显示的文本 this.segmentStates.forEach((state, index) => { this.segmentStates[index] = 'hidden'; }); } } AnimateTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AnimateTextComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); AnimateTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AnimateTextComponent, selector: "nc-animate-text", inputs: { ncText: "ncText", ncDelay: "ncDelay", ncAnimation: "ncAnimation", ncBy: "ncBy", ncDuration: "ncDuration", ncDelayMultipleByText: "ncDelayMultipleByText", ncDelayMultipleByWord: "ncDelayMultipleByWord", ncDelayMultipleByCharacter: "ncDelayMultipleByCharacter", ncDelayMultipleByLine: "ncDelayMultipleByLine", ncStartOnView: "ncStartOnView", ncOnce: "ncOnce" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"animate-text-container whitespace-pre-wrap\">\r\n <ng-container *ngFor=\"let segment of segments; let i = index\">\r\n <!-- \u6839\u636E\u5F53\u524D\u52A8\u753B\u7C7B\u578B\u9009\u62E9\u6B63\u786E\u7684\u52A8\u753B\u89E6\u53D1\u5668 -->\r\n <span *ngIf=\"ncAnimation === 'fadeIn'\" [class]=\"getSegmentClass(i)\"\r\n [@fadeIn]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'blurIn'\" [class]=\"getSegmentClass(i)\"\r\n [@blurIn]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'blurInUp'\" [class]=\"getSegmentClass(i)\"\r\n [@blurInUp]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'blurInDown'\" [class]=\"getSegmentClass(i)\"\r\n [@blurInDown]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideUp'\" [class]=\"getSegmentClass(i)\"\r\n [@slideUp]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideDown'\" [class]=\"getSegmentClass(i)\"\r\n [@slideDown]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideLeft'\" [class]=\"getSegmentClass(i)\"\r\n [@slideLeft]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideRight'\" [class]=\"getSegmentClass(i)\"\r\n [@slideRight]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'scaleUp'\" [class]=\"getSegmentClass(i)\"\r\n [@scaleUp]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'scaleDown'\" [class]=\"getSegmentClass(i)\"\r\n [@scaleDown]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n </ng-container>\r\n</div>", styles: [":host{display:block}.animate-text-container{width:-moz-fit-content;width:fit-content}.whitespace-pre-wrap{white-space:pre-wrap}.inline-block{display:inline-block}.whitespace-pre{white-space:pre}.block{display:block}\n"], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [ trigger('fadeIn', [ state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })), state('visible', style({ opacity: 1, transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' }))) ]), trigger('blurIn', [ state('hidden', style({ opacity: 0, filter: 'blur(10px)' })), state('visible', style({ opacity: 1, filter: 'blur(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms')) ]), trigger('blurInUp', [ state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(20px)' })), state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms')) ]), trigger('blurInDown', [ state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(-20px)' })), state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms')) ]), trigger('slideUp', [ state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })), state('visible', style({ opacity: 1, transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(-20px)' }))) ]), trigger('slideDown', [ state('hidden', style({ opacity: 0, transform: 'translateY(-20px)' })), state('visible', style({ opacity: 1, transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' }))) ]), trigger('slideLeft', [ state('hidden', style({ opacity: 0, transform: 'translateX(20px)' })), state('visible', style({ opacity: 1, transform: 'translateX(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(-20px)' }))) ]), trigger('slideRight', [ state('hidden', style({ opacity: 0, transform: 'translateX(-20px)' })), state('visible', style({ opacity: 1, transform: 'translateX(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(20px)' }))) ]), trigger('scaleUp', [ state('hidden', style({ opacity: 0, transform: 'scale(0.5)' })), state('visible', style({ opacity: 1, transform: 'scale(1)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(0.5)' }))) ]), trigger('scaleDown', [ state('hidden', style({ opacity: 0, transform: 'scale(1.5)' })), state('visible', style({ opacity: 1, transform: 'scale(1)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(1.5)' }))) ]) ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AnimateTextComponent, decorators: [{ type: Component, args: [{ selector: 'nc-animate-text', templateUrl: './animate-text.component.html', styleUrls: ['./animate-text.component.less'], animations: [ trigger('fadeIn', [ state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })), state('visible', style({ opacity: 1, transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' }))) ]), trigger('blurIn', [ state('hidden', style({ opacity: 0, filter: 'blur(10px)' })), state('visible', style({ opacity: 1, filter: 'blur(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms')) ]), trigger('blurInUp', [ state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(20px)' })), state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms')) ]), trigger('blurInDown', [ state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(-20px)' })), state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms')) ]), trigger('slideUp', [ state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })), state('visible', style({ opacity: 1, transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(-20px)' }))) ]), trigger('slideDown', [ state('hidden', style({ opacity: 0, transform: 'translateY(-20px)' })), state('visible', style({ opacity: 1, transform: 'translateY(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' }))) ]), trigger('slideLeft', [ state('hidden', style({ opacity: 0, transform: 'translateX(20px)' })), state('visible', style({ opacity: 1, transform: 'translateX(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(-20px)' }))) ]), trigger('slideRight', [ state('hidden', style({ opacity: 0, transform: 'translateX(-20px)' })), state('visible', style({ opacity: 1, transform: 'translateX(0px)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(20px)' }))) ]), trigger('scaleUp', [ state('hidden', style({ opacity: 0, transform: 'scale(0.5)' })), state('visible', style({ opacity: 1, transform: 'scale(1)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(0.5)' }))) ]), trigger('scaleDown', [ state('hidden', style({ opacity: 0, transform: 'scale(1.5)' })), state('visible', style({ opacity: 1, transform: 'scale(1)' })), transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')), transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(1.5)' }))) ]) ] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncText: [{ type: Input }], ncDelay: [{ type: Input }], ncAnimation: [{ type: Input }], ncBy: [{ type: Input }], ncDuration: [{ type: Input }], ncDelayMultipleByText: [{ type: Input }], ncDelayMultipleByWord: [{ type: Input }], ncDelayMultipleByCharacter: [{ type: Input }], ncDelayMultipleByLine: [{ type: Input }], ncStartOnView: [{ type: Input }], ncOnce: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0ZS10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvYW5pbWF0ZS10ZXh0L2FuaW1hdGUtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2FuaW1hdGUtdGV4dC9hbmltYXRlLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQzFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQXdFakYsTUFBTSxPQUFPLG9CQUFvQjtJQThDL0IsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTdDMUMsY0FBYztRQUNMLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDN0IsU0FBUztRQUNBLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDN0IsV0FBVztRQUNGLGdCQUFXLEdBQW9CLFFBQVEsQ0FBQztRQUNqRCxhQUFhO1FBQ0osU0FBSSxHQUFhLE1BQU0sQ0FBQztRQUNqQyxrQkFBa0I7UUFDVCxlQUFVLEdBQVcsR0FBRyxDQUFDO1FBQ2xDLDBCQUEwQjtRQUNqQiwwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFDNUMsMEJBQTBCO1FBQ2pCLDBCQUFxQixHQUFXLEVBQUUsQ0FBQztRQUM1QywrQkFBK0I7UUFDdEIsK0JBQTBCLEdBQVcsRUFBRSxDQUFDO1FBQ2pELDBCQUEwQjtRQUNqQiwwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFDNUMsb0JBQW9CO1FBQ1osaUJBQVksR0FBWSxLQUFLLENBQUM7UUFRdEMsZ0JBQWdCO1FBQ1IsVUFBSyxHQUFZLEtBQUssQ0FBQztRQVMvQixhQUFRLEdBQWEsRUFBRSxD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O2dCQUVHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkFVRixNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHN0eWxlLCBhbmltYXRlLCB0cmFuc2l0aW9uLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5cclxuZXhwb3J0IHR5cGUgTmNBbmltYXRpb25UeXBlID0gJ2ZhZGVJbicgfCAnYmx1ckluJyB8ICdibHVySW5VcCcgfCAnYmx1ckluRG93bicgfCAnc2xpZGVVcCcgfCAnc2xpZGVEb3duJyB8ICdzbGlkZUxlZnQnIHwgJ3NsaWRlUmlnaHQnIHwgJ3NjYWxlVXAnIHwgJ3NjYWxlRG93bic7XHJcbmV4cG9ydCB0eXBlIE5jQnlUeXBlID0gJ3RleHQnIHwgJ3dvcmQnIHwgJ2NoYXJhY3RlcicgfCAnbGluZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLWFuaW1hdGUtdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FuaW1hdGUtdGV4dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYW5pbWF0ZS10ZXh0LmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZmFkZUluJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyMHB4KScgfSkpKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdibHVySW4nLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAsIGZpbHRlcjogJ2JsdXIoMTBweCknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIGZpbHRlcjogJ2JsdXIoMHB4KScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zIHt7ZGVsYXl9fW1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJykpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ2JsdXJJblVwJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCBmaWx0ZXI6ICdibHVyKDEwcHgpJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyMHB4KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgZmlsdGVyOiAnYmx1cigwcHgpJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwcHgpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignYmx1ckluRG93bicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgZmlsdGVyOiAnYmx1cigxMHB4KScsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCBmaWx0ZXI6ICdibHVyKDBweCknLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycpKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdzbGlkZVVwJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVEb3duJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0yMHB4KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwcHgpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVMZWZ0JywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVSaWdodCcsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjBweCknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMHB4KScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zIHt7ZGVsYXl9fW1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDIwcHgpJyB9KSkpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NjYWxlVXAnLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuNSknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMgY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMiwgMS4yNzUpJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjUpJyB9KSkpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NjYWxlRG93bicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMS41KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcyBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyLCAxLjI3NSknKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDEuNSknIH0pKSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5pbWF0ZVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICAvKiog5bGV56S655qE5paH5pys5YaF5a65ICovXHJcbiAgQElucHV0KCkgbmNUZXh0OiBzdHJpbmcgPSAnJztcclxuICAvKiog5bu26L+fICovXHJcbiAgQElucHV0KCkgbmNEZWxheTogbnVtYmVyID0gMDtcclxuICAvKiog5Yqo55S757G75Z6LICovXHJcbiAgQElucHV0KCkgbmNBbmltYXRpb246IE5jQW5pbWF0aW9uVHlwZSA9ICdmYWRlSW4nO1xyXG4gIC8qKiDliqjnlLvliIblibLmlrnlvI8gKi9cclxuICBASW5wdXQoKSBuY0J5OiBOY0J5VHlwZSA9ICd3b3JkJztcclxuICAvKiog5q+P5Liq5YiG5Ymy5Z2X5Yqo55S75oyB57ut5pe26Ze0ICovXHJcbiAgQElucHV0KCkgbmNEdXJhdGlvbjogbnVtYmVyID0gMzAwO1xyXG4gIC8qKiDmr4/kuKrliIblibLlnZfkuYvpl7TnmoTlu7bov58o5oyJdGV4dOWIhuWJsikgKi9cclxuICBASW5wdXQoKSBuY0RlbGF5TXVsdGlwbGVCeVRleHQ6IG51bWJlciA9IDYwO1xyXG4gIC8qKiDmr4/kuKrliIblibLlnZfkuYvpl7TnmoTlu7bov58o5oyJd29yZOWIhuWJsikgKi9cclxuICBASW5wdXQoKSBuY0RlbGF5TXVsdGlwbGVCeVdvcmQ6IG51bWJlciA9IDUwO1xyXG4gIC8qKiDmr4/kuKrliIblibLlnZfkuYvpl7TnmoTlu7bov58o5oyJY2hhcmFjdGVy5YiG5YmyKSAqL1xyXG4gIEBJbnB1dCgpIG5jRGVsYXlNdWx0aXBsZUJ5Q2hhcmFjdGVyOiBudW1iZXIgPSAzMDtcclxuICAvKiog5q+P5Liq5YiG5Ymy5Z2X5LmL6Ze055qE5bu26L+fKOaMiWxpbmXliIblibIpICovXHJcbiAgQElucHV0KCkgbmNEZWxheU11bHRpcGxlQnlMaW5lOiBudW1iZXIgPSA2MDtcclxuICAvKiog5piv5ZCm5Zyo6KeG5Zu+5Y+v6KeB5pe25omN5byA5aeL5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfc3RhcnRPblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1N0YXJ0T25WaWV3KHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fc3RhcnRPblZpZXcgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY1N0YXJ0T25WaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0T25WaWV3O1xyXG4gIH1cclxuICAvKiog5piv5ZCm5Y+q5omn6KGM5LiA5qyh5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfb25jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jT25jZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX29uY2UgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY09uY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb25jZTtcclxuICB9XHJcblxyXG4gIHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHNlZ21lbnRTdGF0ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHRpbWVvdXQ6IGFueSA9IG51bGw7XHJcblxyXG4gIC8vIOS6pOmUmeaXtumXtFxyXG4gIHByaXZhdGUgc3RhZ2dlclRpbWluZ3M6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YWdnZXJUaW1pbmdzID0ge1xyXG4gICAgICB0ZXh0OiB0aGlzLm5jRGVsYXlNdWx0aXBsZUJ5VGV4dCxcclxuICAgICAgd29yZDogdGhpcy5uY0RlbGF5TXVsdGlwbGVCeVdvcmQsXHJcbiAgICAgIGNoYXJhY3RlcjogdGhpcy5uY0RlbGF5TXVsdGlwbGVCeUNoYXJhY3RlcixcclxuICAgICAgbGluZTogdGhpcy5uY0RlbGF5TXVsdGlwbGVCeUxpbmVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWyduY1RleHQnXSkge1xyXG4gICAgICB0aGlzLnN0YXJ0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnNwbGl0VGV4dCgpO1xyXG4gICAgLy8g5Yid5aeL5omA5pyJ5q616JC96YO96ZqQ6JePXHJcbiAgICB0aGlzLnNlZ21lbnRTdGF0ZXMgPSB0aGlzLnNlZ21lbnRzLm1hcCgoKSA9PiAnaGlkZGVuJyk7XHJcbiAgICBpZiAodGhpcy5uY1N0YXJ0T25WaWV3KSB7XHJcbiAgICAgIHRoaXMuc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hbmltYXRlSW4oKTtcclxuICAgICAgfSwgdGhpcy5uY0RlbGF5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xyXG4gICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNwbGl0VGV4dCgpOiB2b2lkIHtcclxuICAgIHN3aXRjaCAodGhpcy5uY0J5KSB7XHJcbiAgICAgIGNhc2UgJ3dvcmQnOlxyXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSB0aGlzLm5jVGV4dC5zcGxpdCgvKFxccyspLyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2NoYXJhY3Rlcic6XHJcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IHRoaXMubmNUZXh0LnNwbGl0KCcnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbGluZSc6XHJcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IHRoaXMubmNUZXh0LnNwbGl0KCdcXG4nKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAndGV4dCc6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IFt0aGlzLm5jVGV4dF07XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICByb290OiBudWxsLFxyXG4gICAgICByb290TWFyZ2luOiAnMHB4JyxcclxuICAgICAgdGhyZXNob2xkOiAwLjFcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xyXG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hbmltYXRlSW4oKTtcclxuICAgICAgICB9LCB0aGlzLm5jRGVsYXkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5uY09uY2UpIHtcclxuICAgICAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgdGhpcy5hbmltYXRlT3V0KCk7XHJcbiAgICAgIH1cclxuICAgIH0sIG9wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICAvLyDorqHnrpfmr4/kuKrmrrXokL3nmoTlu7bov5/ml7bpl7RcclxuICBwcml2YXRlIGdldFNlZ21lbnREZWxheShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHN0YWdnZXJEZWxheSA9IHRoaXMuc3RhZ2dlclRpbWluZ3NbdGhpcy5uY0J5XSB8fCA1MDtcclxuICAgIHJldHVybiBpbmRleCAqIHN0YWdnZXJEZWxheTtcclxuICB9XHJcblxyXG4gIC8vIOagueaNrue0ouW8leiOt+WPluauteiQveeahOWKqOeUu+eKtuaAgVxyXG4gIGdldFNlZ21lbnRTdGF0ZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNlZ21lbnRTdGF0ZXNbaW5kZXhdIHx8ICdoaWRkZW4nO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5q616JC957G75ZCNXHJcbiAgZ2V0U2VnbWVudENsYXNzKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNsYXNzZXMgPSAnYW5pbWF0ZS10ZXh0LXNlZ21lbnQnO1xyXG5cclxuICAgIGlmICh0aGlzLm5jQnkgPT09ICdsaW5lJykge1xyXG4gICAgICBjbGFzc2VzICs9ICcgYmxvY2snO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2xhc3NlcyArPSAnIGlubGluZS1ibG9jayB3aGl0ZXNwYWNlLXByZSc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubmNCeSA9PT0gJ2NoYXJhY3RlcicpIHtcclxuICAgICAgY2xhc3NlcyArPSAnIGNoYXJhY3Rlcic7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bliqjnlLvlj4LmlbBcclxuICBnZXRBbmltYXRpb25QYXJhbXMoaW5kZXg6IG51bWJlcik6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkdXJhdGlvbjogdGhpcy5uY0R1cmF0aW9uLFxyXG4gICAgICBkZWxheTogdGhpcy5nZXRTZWdtZW50RGVsYXkoaW5kZXgpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8g5omn6KGM6L+b5YWl5Yqo55S7XHJcbiAgcHJpdmF0ZSBhbmltYXRlSW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlZ21lbnRTdGF0ZXMuZm9yRWFjaCgoc3RhdGUsIGluZGV4KSA9PiB7XHJcbiAgICAgIHRoaXMuc2VnbWVudFN0YXRlc1tpbmRleF0gPSAndmlzaWJsZSc7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8g5omn6KGM6YCA5Ye65Yqo55S7XHJcbiAgcHJpdmF0ZSBhbmltYXRlT3V0KCk6IHZvaWQge1xyXG4gICAgLy/oi6XlrZjlnKhuY0RlbGF577yM56a75byA6KeG5Zu+5ZCO77yM6L+b5YWl5Yqo55S777yIYW5pbWF0ZUlu77yJ5Y+v6IO96L+Y5pyq5omn6KGM77yM5YiZ6ZyA6KaB5riF6ZmkdGltZW91dFxyXG4gICAgaWYgKHRoaXMudGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcclxuICAgIH1cclxuICAgIC8v6ZqQ6JeP5pi+56S655qE5paH5pysXHJcbiAgICB0aGlzLnNlZ21lbnRTdGF0ZXMuZm9yRWFjaCgoc3RhdGUsIGluZGV4KSA9PiB7XHJcbiAgICAgIHRoaXMuc2VnbWVudFN0YXRlc1tpbmRleF0gPSAnaGlkZGVuJztcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhbmltYXRlLXRleHQtY29udGFpbmVyIHdoaXRlc3BhY2UtcHJlLXdyYXBcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlZ21lbnQgb2Ygc2VnbWVudHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICA8IS0tIOagueaNruW9k+WJjeWKqOeUu+exu+Wei+mAieaLqeato+ehrueahOWKqOeUu+inpuWPkeWZqCAtLT5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIm5jQW5pbWF0aW9uID