@alauda-fe/common
Version:
Alauda frontend team common codes.
140 lines • 19 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
import { debounce } from 'lodash-es';
import { Observable } from 'rxjs';
import { Terminal } from 'xterm';
import { FitAddon } from 'xterm-addon-fit';
import { SearchAddon } from 'xterm-addon-search';
import { WebLinksAddon } from 'xterm-addon-web-links';
import { clearWindowsXtermTools, setWindowsXtermTools, } from '../core/public-api';
import { ObservableInput, ValueHook } from '../core/utils/decorators';
import { EffectDirectiveModule } from '../effect-directive/module';
import { XTERM_DARK_THEME, XTERM_LIGHT_THEME } from '../exec/constants';
import { initRendererAddon } from '../exec/terminal/component';
import { CommonLayoutModule } from '../page-scaffold/page-header/common-layout/common-layout.module';
import * as i0 from "@angular/core";
const _c0 = ["anchor"];
const SHELL_THEMES = {
dark: XTERM_DARK_THEME,
light: XTERM_LIGHT_THEME,
};
export class XtermComponent {
constructor() {
this.feedLines = 1;
this.searchAddonInit = new EventEmitter();
this.terminalInit = new EventEmitter();
this.searchAddon = new SearchAddon();
this.baseTerminalOptions = {
fontSize: 12,
lineHeight: 1.5,
letterSpacing: 0,
fontWeight: 'normal',
fontFamily: 'Menlo, Monaco, "Consolas", "Courier New", monospace',
cursorBlink: false,
convertEol: true,
scrollback: Number.MAX_SAFE_INTEGER,
allowProposedApi: true,
};
}
initFitAddon() {
this.fitAddon = new FitAddon();
const resizeObserver = new ResizeObserver(debounce(([entry]) => {
if (entry.contentRect.width !== 0) {
this.fitAddon.fit();
}
}, 200));
resizeObserver.observe(this.terminalWrapper.nativeElement);
return this.fitAddon;
}
initSearchAddon() {
this.searchAddon = new SearchAddon();
this.searchAddonInit.next(this.searchAddon);
return this.searchAddon;
}
initXterm() {
this.terminal = new Terminal(this.baseTerminalOptions);
this.terminal.loadAddon(this.initFitAddon());
this.terminal.loadAddon(this.initSearchAddon());
this.terminal.loadAddon(new WebLinksAddon());
this.terminal.loadAddon(initRendererAddon());
this.terminal.open(this.terminalWrapper.nativeElement);
this.setTheme();
this.bindCopyEvent();
setWindowsXtermTools(this.terminal);
this.terminalInit.next(this.terminal);
}
ngAfterViewInit() {
this.initXterm();
this.logs$.subscribe(logs => {
this.fitAddon.fit();
this.write(logs, () => {
requestAnimationFrame(() => this.terminal.scrollToBottom());
});
});
}
ngOnDestroy() {
if (this.terminal) {
this.terminal.dispose();
}
clearWindowsXtermTools();
}
write(logs, callback) {
if (this.terminal?.write) {
this.terminal.clear();
Array.isArray(logs)
? logs.forEach(v => this.terminal.write(v, callback))
: this.terminal.write(logs || '', callback);
}
}
bindCopyEvent() {
this.terminal.attachCustomKeyEventHandler((e) => {
if (e.ctrlKey && e.key?.toLowerCase() === 'c') {
document.execCommand('copy');
}
return false;
});
}
setTheme(theme = this.theme) {
if (!this.terminal) {
return;
}
this.terminal.options.theme = SHELL_THEMES[theme];
}
static { this.ɵfac = function XtermComponent_Factory(t) { return new (t || XtermComponent)(); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: XtermComponent, selectors: [["acl-xterm"]], viewQuery: function XtermComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 7);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.terminalWrapper = _t.first);
} }, inputs: { theme: "theme", logs: "logs" }, outputs: { searchAddonInit: "searchAddonInit", terminalInit: "terminalInit" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 0, consts: [["anchor", ""], [1, "logs-xterm"]], template: function XtermComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "div", 1, 0);
} }, dependencies: [CommonModule, CommonLayoutModule, EffectDirectiveModule], styles: [".logs-xterm[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-8));width:100%;height:100%}.logs-xterm[_ngcontent-%COMP%] .xterm{padding:0 20px;height:100%}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-screen{pointer-events:none}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport{width:100%!important;border-radius:0 0 2px 2px}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar{width:8px;height:4px}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgb(var(--aui-color-n-7))}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--aui-color-n-5))}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar-corner{background-color:transparent}"], changeDetection: 0 }); }
}
__decorate([
ValueHook(function (theme) {
this.setTheme(theme);
}),
__metadata("design:type", String)
], XtermComponent.prototype, "theme", void 0);
__decorate([
ObservableInput(),
__metadata("design:type", Observable)
], XtermComponent.prototype, "logs$", void 0);
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(XtermComponent, [{
type: Component,
args: [{ selector: 'acl-xterm', template: '<div class="logs-xterm" #anchor></div>', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, CommonLayoutModule, EffectDirectiveModule], styles: [".logs-xterm{color:rgb(var(--aui-color-n-8));width:100%;height:100%}.logs-xterm ::ng-deep .xterm{padding:0 20px;height:100%}.logs-xterm ::ng-deep .xterm .xterm-screen{pointer-events:none}.logs-xterm ::ng-deep .xterm .xterm-viewport{width:100%!important;border-radius:0 0 2px 2px}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar{width:8px;height:4px}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgb(var(--aui-color-n-7))}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--aui-color-n-5))}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar-corner{background-color:transparent}\n"] }]
}], null, { theme: [{
type: Input
}], logs$: [], logs: [{
type: Input
}], terminalWrapper: [{
type: ViewChild,
args: ['anchor', { static: true }]
}], searchAddonInit: [{
type: Output
}], terminalInit: [{
type: Output
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(XtermComponent, { className: "XtermComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHRlcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3h0ZXJtL3h0ZXJtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBNEIsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEdBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQzs7O0FBRXJHLE1BQU0sWUFBWSxHQUEwQjtJQUMxQyxJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLEtBQUssRUFBRSxpQkFBaUI7Q0FDekIsQ0FBQztBQVVGLE1BQU0sT0FBTyxjQUFjO0lBUjNCO1FBZUUsY0FBUyxHQUFHLENBQUMsQ0FBQztRQVlkLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUdsRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFHNUMsZ0JBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBSWhDLHdCQUFtQixHQUFxQjtZQUN0QyxRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxHQUFHO1lBQ2YsYUFBYSxFQUFFLENBQUM7WUFDaEIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsVUFBVSxFQUFFLHFEQUFxRDtZQUNqRSxXQUFXLEVBQUUsS0FBSztZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQixVQUFVLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtZQUNuQyxnQkFBZ0IsRUFBRSxJQUFJO1NBQ3ZCLENBQUM7S0FrRkg7SUFoRlMsWUFBWTtRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFFL0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQ3ZDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNuQixJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQ1IsQ0FBQztRQUVGLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUzRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ3BCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxzQkFBc0IsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBdUIsRUFBRSxRQUFxQjtRQUNsRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDakIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFnQixFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQzlDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFDLFFBQWUsSUFBSSxDQUFDLEtBQUs7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQzsrRUF4SFUsY0FBYztvRUFBZCxjQUFjOzs7Ozs7WUFOZCw0QkFBc0M7NEJBSXZDLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUI7O0FBT2pFO0lBSkMsU0FBUyxDQUFDLFVBQVUsS0FBWTtRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQzs7NkNBRVc7QUFLYjtJQURDLGVBQWUsRUFBRTs4QkFDWCxVQUFVOzZDQUFvQjtpRkFWMUIsY0FBYztjQVIxQixTQUFTOzJCQUNFLFdBQVcsWUFDWCx3Q0FBd0MsbUJBRWpDLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDO2dCQU9sRSxLQUFLO2tCQURKLEtBQUs7WUFNTixLQUFLLE1BR0wsSUFBSTtrQkFESCxLQUFLO1lBSU4sZUFBZTtrQkFEZCxTQUFTO21CQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFJckMsZUFBZTtrQkFEZCxNQUFNO1lBSVAsWUFBWTtrQkFEWCxNQUFNOztrRkFyQkksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRoZW1lIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJVGVybWluYWxPcHRpb25zLCBJVGhlbWUsIFRlcm1pbmFsIH0gZnJvbSAneHRlcm0nO1xuaW1wb3J0IHsgRml0QWRkb24gfSBmcm9tICd4dGVybS1hZGRvbi1maXQnO1xuaW1wb3J0IHsgU2VhcmNoQWRkb24gfSBmcm9tICd4dGVybS1hZGRvbi1zZWFyY2gnO1xuaW1wb3J0IHsgV2ViTGlua3NBZGRvbiB9IGZyb20gJ3h0ZXJtLWFkZG9uLXdlYi1saW5rcyc7XG5cbmltcG9ydCB7XG4gIGNsZWFyV2luZG93c1h0ZXJtVG9vbHMsXG4gIHNldFdpbmRvd3NYdGVybVRvb2xzLFxufSBmcm9tICcuLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZUlucHV0LCBWYWx1ZUhvb2sgfSBmcm9tICcuLi9jb3JlL3V0aWxzL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgRWZmZWN0RGlyZWN0aXZlTW9kdWxlIH0gZnJvbSAnLi4vZWZmZWN0LWRpcmVjdGl2ZS9tb2R1bGUnO1xuaW1wb3J0IHsgWFRFUk1fREFSS19USEVNRSwgWFRFUk1fTElHSFRfVEhFTUUgfSBmcm9tICcuLi9leGVjL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbml0UmVuZGVyZXJBZGRvbiB9IGZyb20gJy4uL2V4ZWMvdGVybWluYWwvY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbkxheW91dE1vZHVsZSB9IGZyb20gJy4uL3BhZ2Utc2NhZmZvbGQvcGFnZS1oZWFkZXIvY29tbW9uLWxheW91dC9jb21tb24tbGF5b3V0Lm1vZHVsZSc7XG5cbmNvbnN0IFNIRUxMX1RIRU1FUzogUmVjb3JkPFRoZW1lLCBJVGhlbWU+ID0ge1xuICBkYXJrOiBYVEVSTV9EQVJLX1RIRU1FLFxuICBsaWdodDogWFRFUk1fTElHSFRfVEhFTUUsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wteHRlcm0nLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJsb2dzLXh0ZXJtXCIgI2FuY2hvcj48L2Rpdj4nLFxuICBzdHlsZVVybHM6IFsneHRlcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENvbW1vbkxheW91dE1vZHVsZSwgRWZmZWN0RGlyZWN0aXZlTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgWHRlcm1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmFsdWVIb29rKGZ1bmN0aW9uICh0aGVtZTogVGhlbWUpIHtcbiAgICB0aGlzLnNldFRoZW1lKHRoZW1lKTtcbiAgfSlcbiAgQElucHV0KClcbiAgdGhlbWU6IFRoZW1lO1xuXG4gIGZlZWRMaW5lcyA9IDE7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGxvZ3MkOiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgc3RyaW5nPjtcblxuICBASW5wdXQoKVxuICBsb2dzOiBzdHJpbmdbXSB8IHN0cmluZztcblxuICBAVmlld0NoaWxkKCdhbmNob3InLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICB0ZXJtaW5hbFdyYXBwZXI6IEVsZW1lbnRSZWY7XG5cbiAgQE91dHB1dCgpXG4gIHNlYXJjaEFkZG9uSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VhcmNoQWRkb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHRlcm1pbmFsSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8VGVybWluYWw+KCk7XG5cbiAgdGVybWluYWw6IFRlcm1pbmFsO1xuICBzZWFyY2hBZGRvbiA9IG5ldyBTZWFyY2hBZGRvbigpO1xuXG4gIGZpdEFkZG9uOiBGaXRBZGRvbjtcblxuICBiYXNlVGVybWluYWxPcHRpb25zOiBJVGVybWluYWxPcHRpb25zID0ge1xuICAgIGZvbnRTaXplOiAxMixcbiAgICBsaW5lSGVpZ2h0OiAxLjUsXG4gICAgbGV0dGVyU3BhY2luZzogMCxcbiAgICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgICBmb250RmFtaWx5OiAnTWVubG8sIE1vbmFjbywgXCJDb25zb2xhc1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gICAgY3Vyc29yQmxpbms6IGZhbHNlLFxuICAgIGNvbnZlcnRFb2w6IHRydWUsXG4gICAgc2Nyb2xsYmFjazogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgYWxsb3dQcm9wb3NlZEFwaTogdHJ1ZSxcbiAgfTtcblxuICBwcml2YXRlIGluaXRGaXRBZGRvbigpIHtcbiAgICB0aGlzLmZpdEFkZG9uID0gbmV3IEZpdEFkZG9uKCk7XG5cbiAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihcbiAgICAgIGRlYm91bmNlKChbZW50cnldKSA9PiB7XG4gICAgICAgIGlmIChlbnRyeS5jb250ZW50UmVjdC53aWR0aCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZml0QWRkb24uZml0KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwMCksXG4gICAgKTtcblxuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy50ZXJtaW5hbFdyYXBwZXIubmF0aXZlRWxlbWVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5maXRBZGRvbjtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNlYXJjaEFkZG9uKCkge1xuICAgIHRoaXMuc2VhcmNoQWRkb24gPSBuZXcgU2VhcmNoQWRkb24oKTtcbiAgICB0aGlzLnNlYXJjaEFkZG9uSW5pdC5uZXh0KHRoaXMuc2VhcmNoQWRkb24pO1xuICAgIHJldHVybiB0aGlzLnNlYXJjaEFkZG9uO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0WHRlcm0oKSB7XG4gICAgdGhpcy50ZXJtaW5hbCA9IG5ldyBUZXJtaW5hbCh0aGlzLmJhc2VUZXJtaW5hbE9wdGlvbnMpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKHRoaXMuaW5pdEZpdEFkZG9uKCkpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKHRoaXMuaW5pdFNlYXJjaEFkZG9uKCkpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKG5ldyBXZWJMaW5rc0FkZG9uKCkpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKGluaXRSZW5kZXJlckFkZG9uKCkpO1xuXG4gICAgdGhpcy50ZXJtaW5hbC5vcGVuKHRoaXMudGVybWluYWxXcmFwcGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuc2V0VGhlbWUoKTtcbiAgICB0aGlzLmJpbmRDb3B5RXZlbnQoKTtcblxuICAgIHNldFdpbmRvd3NYdGVybVRvb2xzKHRoaXMudGVybWluYWwpO1xuICAgIHRoaXMudGVybWluYWxJbml0Lm5leHQodGhpcy50ZXJtaW5hbCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0WHRlcm0oKTtcblxuICAgIHRoaXMubG9ncyQuc3Vic2NyaWJlKGxvZ3MgPT4ge1xuICAgICAgdGhpcy5maXRBZGRvbi5maXQoKTtcbiAgICAgIHRoaXMud3JpdGUobG9ncywgKCkgPT4ge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy50ZXJtaW5hbC5zY3JvbGxUb0JvdHRvbSgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGVybWluYWwpIHtcbiAgICAgIHRoaXMudGVybWluYWwuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBjbGVhcldpbmRvd3NYdGVybVRvb2xzKCk7XG4gIH1cblxuICB3cml0ZShsb2dzOiBzdHJpbmcgfCBzdHJpbmdbXSwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMudGVybWluYWw/LndyaXRlKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsLmNsZWFyKCk7XG4gICAgICBBcnJheS5pc0FycmF5KGxvZ3MpXG4gICAgICAgID8gbG9ncy5mb3JFYWNoKHYgPT4gdGhpcy50ZXJtaW5hbC53cml0ZSh2LCBjYWxsYmFjaykpXG4gICAgICAgIDogdGhpcy50ZXJtaW5hbC53cml0ZShsb2dzIHx8ICcnLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG5cbiAgYmluZENvcHlFdmVudCgpIHtcbiAgICB0aGlzLnRlcm1pbmFsLmF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUuY3RybEtleSAmJiBlLmtleT8udG9Mb3dlckNhc2UoKSA9PT0gJ2MnKSB7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBzZXRUaGVtZSh0aGVtZTogVGhlbWUgPSB0aGlzLnRoZW1lKSB7XG4gICAgaWYgKCF0aGlzLnRlcm1pbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50ZXJtaW5hbC5vcHRpb25zLnRoZW1lID0gU0hFTExfVEhFTUVTW3RoZW1lXTtcbiAgfVxufVxuIl19