UNPKG

ng-cw-v12

Version:

Angular UI component library

333 lines 53.1 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._text = '';
        /** 延迟 */
        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 ncText(value) {
        this._text = value;
        setTimeout(() => {
            this.start();
        });
    }
    get ncText() {
        return this._text;
    }
    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
        };
    }
    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" }, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0ZS10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvYW5pbWF0ZS10ZXh0L2FuaW1hdGUtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2FuaW1hdGUtdGV4dC9hbmltYXRlLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQXlCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQXFFakYsTUFBTSxPQUFPLG9CQUFvQjtJQXdEL0IsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXZEMUMsY0FBYztRQUNOLFVBQUssR0FBVyxFQUFFLENBQUM7UUFXM0IsU0FBUztRQUNBLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDN0IsV0FBVztRQUNGLGdCQUFXLEdBQXFJLFFBQVEsQ0FBQztRQUNsSyxhQUFhO1FBQ0osU0FBSSxHQUEyQyxNQUFNLENBQUM7UUFDL0Qsa0JBQWtCO1FBQ1QsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUNsQywwQkFBMEI7UUFDakIsMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBQzVDLDBCQUEwQjtRQUNqQiwwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFDNUMsK0JBQStCO1FBQ3RCLCtCQUEwQixHQUFXLEVBQUUsQ0FBQztRQUNqRCwwQkFBMEI7UUFDakIsMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBQzVDLG9CQUFvQjtRQUNaLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBUXRDLGdCQUFnQjtRQUNSLFVBQUssR0FBWSxLQUFLLENBQUM7UUFTL0IsYUFBUSxHQUFhLEVBQUUs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QW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBVUYsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgc3R5bGUsIGFuaW1hdGUsIHRyYW5zaXRpb24sIHN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLWFuaW1hdGUtdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FuaW1hdGUtdGV4dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYW5pbWF0ZS10ZXh0LmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZmFkZUluJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyMHB4KScgfSkpKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdibHVySW4nLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAsIGZpbHRlcjogJ2JsdXIoMTBweCknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIGZpbHRlcjogJ2JsdXIoMHB4KScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zIHt7ZGVsYXl9fW1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJykpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ2JsdXJJblVwJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCBmaWx0ZXI6ICdibHVyKDEwcHgpJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyMHB4KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgZmlsdGVyOiAnYmx1cigwcHgpJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwcHgpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignYmx1ckluRG93bicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgZmlsdGVyOiAnYmx1cigxMHB4KScsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCBmaWx0ZXI6ICdibHVyKDBweCknLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycpKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdzbGlkZVVwJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVEb3duJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0yMHB4KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwcHgpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVMZWZ0JywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVSaWdodCcsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjBweCknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMHB4KScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zIHt7ZGVsYXl9fW1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDIwcHgpJyB9KSkpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NjYWxlVXAnLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuNSknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMgY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMiwgMS4yNzUpJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjUpJyB9KSkpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NjYWxlRG93bicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMS41KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcyBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyLCAxLjI3NSknKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDEuNSknIH0pKSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5pbWF0ZVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIOWxleekuueahOaWh+acrOWGheWuuSAqL1xyXG4gIHByaXZhdGUgX3RleHQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jVGV4dCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl90ZXh0ID0gdmFsdWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdGFydCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBuY1RleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90ZXh0O1xyXG4gIH1cclxuICAvKiog5bu26L+fICovXHJcbiAgQElucHV0KCkgbmNEZWxheTogbnVtYmVyID0gMDtcclxuICAvKiog5Yqo55S757G75Z6LICovXHJcbiAgQElucHV0KCkgbmNBbmltYXRpb246ICdmYWRlSW4nIHwgJ2JsdXJJbicgfCAnYmx1ckluVXAnIHwgJ2JsdXJJbkRvd24nIHwgJ3NsaWRlVXAnIHwgJ3NsaWRlRG93bicgfCAnc2xpZGVMZWZ0JyB8ICdzbGlkZVJpZ2h0JyB8ICdzY2FsZVVwJyB8ICdzY2FsZURvd24nID0gJ2ZhZGVJbic7XHJcbiAgLyoqIOWKqOeUu+WIhuWJsuaWueW8jyAqL1xyXG4gIEBJbnB1dCgpIG5jQnk6ICd0ZXh0JyB8ICd3b3JkJyB8ICdjaGFyYWN0ZXInIHwgJ2xpbmUnID0gJ3dvcmQnO1xyXG4gIC8qKiDmr4/kuKrliIblibLlnZfliqjnlLvmjIHnu63ml7bpl7QgKi9cclxuICBASW5wdXQoKSBuY0R1cmF0aW9uOiBudW1iZXIgPSAzMDA7XHJcbiAgLyoqIOavj+S4quWIhuWJsuWdl+S5i+mXtOeahOW7tui/nyjmjIl0ZXh05YiG5YmyKSAqL1xyXG4gIEBJbnB1dCgpIG5jRGVsYXlNdWx0aXBsZUJ5VGV4dDogbnVtYmVyID0gNjA7XHJcbiAgLyoqIOavj+S4quWIhuWJsuWdl+S5i+mXtOeahOW7tui/nyjmjIl3b3Jk5YiG5YmyKSAqL1xyXG4gIEBJbnB1dCgpIG5jRGVsYXlNdWx0aXBsZUJ5V29yZDogbnVtYmVyID0gNTA7XHJcbiAgLyoqIOavj+S4quWIhuWJsuWdl+S5i+mXtOeahOW7tui/nyjmjIljaGFyYWN0ZXLliIblibIpICovXHJcbiAgQElucHV0KCkgbmNEZWxheU11bHRpcGxlQnlDaGFyYWN0ZXI6IG51bWJlciA9IDMwO1xyXG4gIC8qKiDmr4/kuKrliIblibLlnZfkuYvpl7TnmoTlu7bov58o5oyJbGluZeWIhuWJsikgKi9cclxuICBASW5wdXQoKSBuY0RlbGF5TXVsdGlwbGVCeUxpbmU6IG51bWJlciA9IDYwO1xyXG4gIC8qKiDmmK/lkKblnKjop4blm77lj6/op4Hml7bmiY3lvIDlp4vliqjnlLsgKi9cclxuICBwcml2YXRlIF9zdGFydE9uVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jU3RhcnRPblZpZXcodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9zdGFydE9uVmlldyA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jU3RhcnRPblZpZXcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRPblZpZXc7XHJcbiAgfVxyXG4gIC8qKiDmmK/lkKblj6rmiafooYzkuIDmrKHliqjnlLsgKi9cclxuICBwcml2YXRlIF9vbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNPbmNlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fb25jZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jT25jZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9vbmNlO1xyXG4gIH1cclxuXHJcbiAgc2VnbWVudHM6IHN0cmluZ1tdID0gW107XHJcbiAgc2VnbWVudFN0YXRlczogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIG9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdGltZW91dDogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8g5Lqk6ZSZ5pe26Ze0XHJcbiAgcHJpdmF0ZSBzdGFnZ2VyVGltaW5nczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhZ2dlclRpbWluZ3MgPSB7XHJcbiAgICAgIHRleHQ6IHRoaXMubmNEZWxheU11bHRpcGxlQnlUZXh0LFxyXG4gICAgICB3b3JkOiB0aGlzLm5jRGVsYXlNdWx0aXBsZUJ5V29yZCxcclxuICAgICAgY2hhcmFjdGVyOiB0aGlzLm5jRGVsYXlNdWx0aXBsZUJ5Q2hhcmFjdGVyLFxyXG4gICAgICBsaW5lOiB0aGlzLm5jRGVsYXlNdWx0aXBsZUJ5TGluZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gICAgdGhpcy5zcGxpdFRleHQoKTtcclxuICAgIC8vIOWIneWni+aJgOacieauteiQvemDvemakOiXj1xyXG4gICAgdGhpcy5zZWdtZW50U3RhdGVzID0gdGhpcy5zZWdtZW50cy5tYXAoKCkgPT4gJ2hpZGRlbicpO1xyXG4gICAgaWYgKHRoaXMubmNTdGFydE9uVmlldykge1xyXG4gICAgICB0aGlzLnNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZUluKCk7XHJcbiAgICAgIH0sIHRoaXMubmNEZWxheSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzcGxpdFRleHQoKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKHRoaXMubmNCeSkge1xyXG4gICAgICBjYXNlICd3b3JkJzpcclxuICAgICAgICB0aGlzLnNlZ21lbnRzID0gdGhpcy5uY1RleHQuc3BsaXQoLyhcXHMrKS8pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjaGFyYWN0ZXInOlxyXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSB0aGlzLm5jVGV4dC5zcGxpdCgnJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2xpbmUnOlxyXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSB0aGlzLm5jVGV4dC5zcGxpdCgnXFxuJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBbdGhpcy5uY1RleHRdO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgcm9vdDogbnVsbCxcclxuICAgICAgcm9vdE1hcmdpbjogJzBweCcsXHJcbiAgICAgIHRocmVzaG9sZDogMC4xXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcclxuICAgICAgaWYgKGVudHJpZXNbMF0uaXNJbnRlcnNlY3RpbmcpIHtcclxuICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuYW5pbWF0ZUluKCk7XHJcbiAgICAgICAgfSwgdGhpcy5uY0RlbGF5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLm5jT25jZSkge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZU91dCgpO1xyXG4gICAgICB9XHJcbiAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5q+P5Liq5q616JC955qE5bu26L+f5pe26Ze0XHJcbiAgcHJpdmF0ZSBnZXRTZWdtZW50RGVsYXkoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBzdGFnZ2VyRGVsYXkgPSB0aGlzLnN0YWdnZXJUaW1pbmdzW3RoaXMubmNCeV0gfHwgNTA7XHJcbiAgICByZXR1cm4gaW5kZXggKiBzdGFnZ2VyRGVsYXk7XHJcbiAgfVxyXG5cclxuICAvLyDmoLnmja7ntKLlvJXojrflj5bmrrXokL3nmoTliqjnlLvnirbmgIFcclxuICBnZXRTZWdtZW50U3RhdGUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWdtZW50U3RhdGVzW2luZGV4XSB8fCAnaGlkZGVuJztcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluauteiQveexu+WQjVxyXG4gIGdldFNlZ21lbnRDbGFzcyhpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBjbGFzc2VzID0gJ2FuaW1hdGUtdGV4dC1zZWdtZW50JztcclxuXHJcbiAgICBpZiAodGhpcy5uY0J5ID09PSAnbGluZScpIHtcclxuICAgICAgY2xhc3NlcyArPSAnIGJsb2NrJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNsYXNzZXMgKz0gJyBpbmxpbmUtYmxvY2sgd2hpdGVzcGFjZS1wcmUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm5jQnkgPT09ICdjaGFyYWN0ZXInKSB7XHJcbiAgICAgIGNsYXNzZXMgKz0gJyBjaGFyYWN0ZXInO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc2VzO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5Yqo55S75Y+C5pWwXHJcbiAgZ2V0QW5pbWF0aW9uUGFyYW1zKGluZGV4OiBudW1iZXIpOiBhbnkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZHVyYXRpb246IHRoaXMubmNEdXJhdGlvbixcclxuICAgICAgZGVsYXk6IHRoaXMuZ2V0U2VnbWVudERlbGF5KGluZGV4KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOaJp+ihjOi/m+WFpeWKqOeUu1xyXG4gIHByaXZhdGUgYW5pbWF0ZUluKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWdtZW50U3RhdGVzLmZvckVhY2goKHN0YXRlLCBpbmRleCkgPT4ge1xyXG4gICAgICB0aGlzLnNlZ21lbnRTdGF0ZXNbaW5kZXhdID0gJ3Zpc2libGUnO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIOaJp+ihjOmAgOWHuuWKqOeUu1xyXG4gIHByaXZhdGUgYW5pbWF0ZU91dCgpOiB2b2lkIHtcclxuICAgIC8v6Iul5a2Y5ZyobmNEZWxhee+8jOemu+W8gOinhuWbvuWQju+8jOi/m+WFpeWKqOeUu++8iGFuaW1hdGVJbu+8ieWPr+iDvei/mOacquaJp+ihjO+8jOWImemcgOimgea4hemZpHRpbWVvdXRcclxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcbiAgICAvL+makOiXj+aYvuekuueahOaWh+acrFxyXG4gICAgdGhpcy5zZWdtZW50U3RhdGVzLmZvckVhY2goKHN0YXRlLCBpbmRleCkgPT4ge1xyXG4gICAgICB0aGlzLnNlZ21lbnRTdGF0ZXNbaW5kZXhdID0gJ2hpZGRlbic7XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYW5pbWF0ZS10ZXh0LWNvbnRhaW5lciB3aGl0ZXNwYWNlLXByZS13cmFwXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWdtZW50IG9mIHNlZ21lbnRzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgPCEtLSDmoLnmja7lvZPliY3liqjnlLvnsbvlnovpgInmi6nmraPnoa7nmoTliqjnlLvop6blj5HlmaggLS0+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJuY0FuaW1hdGlvbiA9PT0gJ2ZhZGVJbidcIiBbY2xhc3NdPVwiZ2V0U2VnbWVudENsYXNzKGkpXCJcclxuICAgICAgICAgICAgW0BmYWRlSW5dPVwie3ZhbHVlOiBnZXRTZWdtZW50U3RhdGUoaSksIHBhcmFtczogZ2V0QW5pbWF0aW9uUGFyYW1zKGkpfVwiPnt7c2VnbWVudH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibmNBbmltYXRpb24gPT09ICdibHVySW4nXCIgW2NsYXNzXT1cImdldFNlZ21lbnRDbGFzcyhpKVwiXHJcbiAgICAgICAgICAgIFtAYmx1ckluXT1cInt2YWx1ZTogZ2V0U2VnbWVudFN0YXRlKGkpLCBwYXJhbXM6IGdldEFuaW1hdGlvblBhcmFtcyhpKX1cIj57e3NlZ21lbnR9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIm5jQW5pbWF0aW9uID09PSAnYmx1ckluVXAnXCIgW2NsYXNzXT1cImdldFNlZ21lbnRDbGFzcyhpKVwiXHJcbiAgICAgICAgICAgIFtAYmx1ckluVXBdPVwie3ZhbHVlOiBnZXRTZWdtZW50U3RhdGUoaSksIHBhcmFtczogZ2V0QW5pbWF0aW9uUGFyYW1zKGkpfVwiPnt7c2VnbWVudH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibmNBbmltYXRpb24gPT09ICdibHVySW5Eb3duJ1wiIFtjbGFzc109XCJnZXRTZWdtZW50Q2xhc3MoaSlcIlxyXG4gICAgICAgICAgICBbQGJsdXJJbkRvd25dPVwie3ZhbHVlOiBnZXRTZWdtZW50U3RhdGUoaSksIHBhcmFtczogZ2V0QW5pbWF0aW9uUGFyYW1zKGkpfVwiPnt7c2VnbWVudH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibmNBbmltYXRpb24gPT09ICdzbGlkZVVwJ1wiIFtjbGFzc109XCJnZXRTZWdtZW50Q2xhc3MoaSlcIlxyXG4gICAgICAgICAgICBbQHNsaWRlVXBdPVwie3ZhbHVlOiBnZXRTZWdtZW50U3RhdGUoaSksIHBhcmFtczogZ2V0QW5pbWF0aW9uUGFyYW1zKGkpfVwiPnt7c2VnbWVudH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibmNBbmltYXRpb24gPT09ICdzbGlkZURvd24nXCIgW2NsYXNzXT1cImdldFNlZ21lbnRDbGFzcyhpKVwiXHJcbiAgICAgICAgICAgIFtAc2xpZGVEb3duXT1cInt2YWx1ZTogZ2V0U2VnbWVudFN0YXRlKGkpLCBwYXJhbXM6IGdldEFuaW1hdGlvblBhcmFtcyhpKX1cIj57e3NlZ21lbnR9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIm5jQW5pbWF0aW9uID09PSAnc2xpZGVMZWZ0J1wiIFtjbGFzc109XCJnZXRTZWdtZW50Q2xhc3MoaSlcIlxyXG4gICAgICAgICAgICBbQHNsaWRlTGVmdF09XCJ7dmFsdWU6IGdldFNlZ21lbnRTdGF0ZShpKSwgcGFyYW1zOiBnZXRBbmltYXRpb25QYXJhbXMoaSl9XCI+e3tzZWdtZW50fX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJuY0FuaW1hdGlvbiA9PT0gJ3NsaWRlUmlnaHQnXCIgW2NsYXNzXT1cImdldFNlZ21lbnRDbGFzcyhpKVwiXHJcbiAgICAgICAgICAgIFtAc2xpZGVSaWdodF09XCJ7dmFsdWU6IGdldFNlZ21lbnRTdGF0ZShpKSwgcGFyYW1zOiBnZXRBbmltYXRpb25QYXJhbXMoaSl9XCI+e3tzZWdtZW50fX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJuY0FuaW1hdGlvbiA9PT0gJ3NjYWxlVXAnXCIgW2NsYXNzXT1cImdldFNlZ21lbnRDbGFzcyhpKVwiXHJcbiAgICAgICAgICAgIFtAc2NhbGVVcF09XCJ7dmFsdWU6IGdldFNlZ21lbnRTdGF0ZShpKSwgcGFyYW1zOiBnZXRBbmltYXRpb25QYXJhbXMoaSl9XCI+e3tzZWdtZW50fX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJuY0FuaW1hdGlvbiA9PT0gJ3NjYWxlRG93bidcIiBbY2xhc3NdPVwiZ2V0U2VnbWVudENsYXNzKGkpXCJcclxuICAgICAgICAgICAgW0BzY2FsZURvd25dPVwie3ZhbHVlOiBnZXRTZWdtZW50U3RhdGUoaSksIHBhcmFtczogZ2V0QW5pbWF0aW9uUGFyYW1zKGkpfVwiPnt7c2VnbWVudH19PC9zcGFuPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==