ng-cw-v12
Version:
Angular UI Component Library
329 lines • 53 kB
JavaScript
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