UNPKG

@qodalis/angular-cli

Version:

A lightweight and flexible command-line interface (CLI) tool designed to streamline workflows and automate tasks for developers.

196 lines 30 kB
import { Injectable } from '@angular/core'; import { CliForegroundColor, } from '@qodalis/cli-core'; import { DefaultLibraryAuthor } from '@qodalis/cli-core'; import { themes } from './types'; import * as i0 from "@angular/core"; export class CliThemeCommandProcessor { constructor() { this.command = 'theme'; this.description = 'Interact with the theme'; this.author = DefaultLibraryAuthor; this.version = '1.0.1'; this.processors = []; this.metadata = { sealed: true, icon: '🎨', module: 'system', }; this.stateConfiguration = { initialState: { selectedTheme: 'default', customOptions: null, }, }; this.themeOptions = Object.keys(themeOptions); this.processors = [ { command: 'list', description: 'List available themes', processCommand: async (command, context) => { context.writer.writeln('Available themes:'); Object.keys(themes).forEach((theme) => { context.writer.writeln(context.writer.wrapInColor(theme, CliForegroundColor.Cyan)); }); }, }, { command: 'current', description: 'Show the current theme', processCommand: async (_, context) => { const state = context.state.getState(); const theme = state.selectedTheme || 'custom'; context.writer.writeln(`Current theme: ${theme}`); context.writer.writeln('Theme options:'); Object.keys(context.terminal.options.theme).forEach((key) => { context.writer.writeln(`${key}: ${context.terminal.options.theme[key]}`); }); }, }, { command: 'apply', description: 'Apply a theme', valueRequired: true, processCommand: async (command, context) => { const theme = command.value; if (!themes[theme]) { context.writer.writeError(`Theme ${theme} not found`); return; } context.terminal.options.theme = themes[theme]; context.state.updateState({ selectedTheme: theme, customOptions: null, }); await context.state.persist(); this.applyStyles(context); context.writer.writeSuccess(`Theme ${theme} applied`); }, }, { command: 'set', allowUnlistedCommands: true, description: 'Set a theme variable', parameters: [ { name: 'save', description: 'Save the theme settings', type: 'boolean', required: false, }, ], processCommand: async (command, context) => { const [key, value] = command.command.split(' ').slice(2); if (!this.themeOptions.includes(key)) { context.writer.writeError(`Unsupported key: ${key}, supported keys: ${this.themeOptions.join(', ')}`); return; } context.terminal.options.theme = { ...context.terminal.options.theme, [key]: value, }; context.state.updateState({ selectedTheme: null, customOptions: context.terminal.options.theme, }); context.writer.writeSuccess(`Set ${key} to ${value}`); this.applyStyles(context); if (command.args['save']) { await this.saveTheme(context); } }, }, { command: 'save', description: 'Save the current theme settings', processCommand: async (command, context) => { context.terminal.options.theme = {}; context.state.updateState({ selectedTheme: null, customOptions: context.terminal.options.theme, }); await this.saveTheme(context); }, }, { command: 'reset', description: 'Reset the theme to the default', processCommand: async (command, context) => { context.terminal.options.theme = { ...this.defaultTheme }; context.state.reset(); await context.state.persist(); context.writer.writeSuccess('Theme reset to default'); }, }, ]; } async initialize(context) { this.defaultTheme = context.terminal.options.theme; const state = context.state.getState(); if (state.selectedTheme && state.selectedTheme !== 'default') { context.terminal.options.theme = themes[state.selectedTheme]; } else if (state.customOptions) { context.terminal.options.theme = state.customOptions; } this.applyStyles(context); } async processCommand(command, context) { context.executor.showHelp(command, context); } applyStyles(context) { const parents = document.getElementsByClassName('terminal-container'); for (const parent of Array.from(parents)) { parent.style.background = context.terminal.options.theme?.background || this.defaultTheme.background; } } async saveTheme(context) { await context.state.persist(); context.writer.writeSuccess('Theme saved'); } writeDescription(context) { context.writer.writeln('Interact with the theme'); context.writer.writeln('Examples:'); context.writer.writeln(context.writer.wrapInColor('theme apply dracula', CliForegroundColor.Magenta)); context.writer.writeln(context.writer.wrapInColor('theme reset', CliForegroundColor.Magenta)); context.writer.writeln(context.writer.wrapInColor('theme set background red', CliForegroundColor.Magenta)); context.writer.writeln(context.writer.wrapInColor('theme set foreground red', CliForegroundColor.Magenta)); context.writer.write('Available theme options: '); context.writer.writeln(context.writer.wrapInColor(this.themeOptions.join(', ') ?? '', CliForegroundColor.Blue)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliThemeCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliThemeCommandProcessor, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliThemeCommandProcessor, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); const themeOptions = { background: '', foreground: '', black: '', blue: '', brightBlack: '', brightBlue: '', brightCyan: '', brightGreen: '', brightMagenta: '', brightRed: '', brightWhite: '', brightYellow: '', cyan: '', green: '', magenta: '', red: '', white: '', yellow: '', cursor: '', cursorAccent: '', selectionBackground: '', selectionForeground: '', selectionInactiveBackground: '', }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXRoZW1lLWNvbW1hbmQtcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpL3NyYy9saWIvY2xpL3Byb2Nlc3NvcnMvdGhlbWUvY2xpLXRoZW1lLWNvbW1hbmQtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNILGtCQUFrQixHQU9yQixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXpELE9BQU8sRUFBRSxNQUFNLEVBQWMsTUFBTSxTQUFTLENBQUM7O0FBSzdDLE1BQU0sT0FBTyx3QkFBd0I7SUE0QmpDO1FBM0JBLFlBQU8sR0FBRyxPQUFPLENBQUM7UUFFbEIsZ0JBQVcsR0FBRyx5QkFBeUIsQ0FBQztRQUV4QyxXQUFNLEdBQW1DLG9CQUFvQixDQUFDO1FBRTlELFlBQU8sR0FBd0IsT0FBTyxDQUFDO1FBRXZDLGVBQVUsR0FBd0MsRUFBRSxDQUFDO1FBRXJELGFBQVEsR0FBc0M7WUFDMUMsTUFBTSxFQUFFLElBQUk7WUFDWixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRSxRQUFRO1NBQ25CLENBQUM7UUFFRix1QkFBa0IsR0FBdUM7WUFDckQsWUFBWSxFQUFFO2dCQUNWLGFBQWEsRUFBRSxTQUFTO2dCQUN4QixhQUFhLEVBQUUsSUFBSTthQUN0QjtTQUNKLENBQUM7UUFFTSxpQkFBWSxHQUFhLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFLdkQsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNkO2dCQUNJLE9BQU8sRUFBRSxNQUFNO2dCQUNmLFdBQVcsRUFBRSx1QkFBdUI7Z0JBQ3BDLGNBQWMsRUFBRSxLQUFLLEVBQ2pCLE9BQTBCLEVBQzFCLE9BQTZCLEVBQy9C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QVksRUFBRSxFQUFFO0lBQ2hCLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEVBQUU7SUFDVCxPQUFPLEVBQUUsRUFBRTtJQUNYLEdBQUcsRUFBRSxFQUFFO0lBQ1AsS0FBSyxFQUFFLEVBQUU7SUFDVCxNQUFNLEVBQUUsRUFBRTtJQUNWLE1BQU0sRUFBRSxFQUFFO0lBQ1YsWUFBWSxFQUFFLEVBQUU7SUFDaEIsbUJBQW1CLEVBQUUsRUFBRTtJQUN2QixtQkFBbUIsRUFBRSxFQUFFO0lBQ3ZCLDJCQUEyQixFQUFFLEVBQUU7Q0FDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ2xpRm9yZWdyb3VuZENvbG9yLFxuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIENsaVByb2Nlc3Nvck1ldGFkYXRhLFxuICAgIENsaVN0YXRlQ29uZmlndXJhdGlvbixcbiAgICBJQ2xpQ29tbWFuZEF1dGhvcixcbiAgICBJQ2xpQ29tbWFuZFByb2Nlc3NvcixcbiAgICBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnQHFvZGFsaXMvY2xpLWNvcmUnO1xuXG5pbXBvcnQgeyBEZWZhdWx0TGlicmFyeUF1dGhvciB9IGZyb20gJ0Bxb2RhbGlzL2NsaS1jb3JlJztcbmltcG9ydCB7IElUaGVtZSB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyB0aGVtZXMsIFRoZW1lU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ2xpVGhlbWVDb21tYW5kUHJvY2Vzc29yIGltcGxlbWVudHMgSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIGNvbW1hbmQgPSAndGhlbWUnO1xuXG4gICAgZGVzY3JpcHRpb24gPSAnSW50ZXJhY3Qgd2l0aCB0aGUgdGhlbWUnO1xuXG4gICAgYXV0aG9yPzogSUNsaUNvbW1hbmRBdXRob3IgfCB1bmRlZmluZWQgPSBEZWZhdWx0TGlicmFyeUF1dGhvcjtcblxuICAgIHZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnMS4wLjEnO1xuXG4gICAgcHJvY2Vzc29ycz86IElDbGlDb21tYW5kUHJvY2Vzc29yW10gfCB1bmRlZmluZWQgPSBbXTtcblxuICAgIG1ldGFkYXRhPzogQ2xpUHJvY2Vzc29yTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB7XG4gICAgICAgIHNlYWxlZDogdHJ1ZSxcbiAgICAgICAgaWNvbjogJ/CfjqgnLFxuICAgICAgICBtb2R1bGU6ICdzeXN0ZW0nLFxuICAgIH07XG5cbiAgICBzdGF0ZUNvbmZpZ3VyYXRpb24/OiBDbGlTdGF0ZUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQgPSB7XG4gICAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICAgICAgc2VsZWN0ZWRUaGVtZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgY3VzdG9tT3B0aW9uczogbnVsbCxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB0aGVtZU9wdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhlbWVPcHRpb25zKTtcblxuICAgIHByaXZhdGUgZGVmYXVsdFRoZW1lITogSVRoZW1lO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc29ycyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdMaXN0IGF2YWlsYWJsZSB0aGVtZXMnLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignQXZhaWxhYmxlIHRoZW1lczonKTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhlbWVzKS5mb3JFYWNoKCh0aGVtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaUZvcmVncm91bmRDb2xvci5DeWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAnY3VycmVudCcsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTaG93IHRoZSBjdXJyZW50IHRoZW1lJyxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBfOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udGV4dC5zdGF0ZS5nZXRTdGF0ZTxUaGVtZVN0YXRlPigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGVtZSA9IHN0YXRlLnNlbGVjdGVkVGhlbWUgfHwgJ2N1c3RvbSc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihgQ3VycmVudCB0aGVtZTogJHt0aGVtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignVGhlbWUgb3B0aW9uczonKTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29udGV4dC50ZXJtaW5hbC5vcHRpb25zLnRoZW1lISkuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtrZXl9OiAkeyhjb250ZXh0LnRlcm1pbmFsLm9wdGlvbnMudGhlbWUgYXMgYW55KVtrZXldfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ2FwcGx5JyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGx5IGEgdGhlbWUnLFxuICAgICAgICAgICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGVtZSA9IGNvbW1hbmQudmFsdWUhO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhlbWVzW3RoZW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVFcnJvcihgVGhlbWUgJHt0aGVtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnRlcm1pbmFsLm9wdGlvbnMudGhlbWUgPSB0aGVtZXNbdGhlbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhdGUudXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUaGVtZTogdGhlbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21PcHRpb25zOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LnN0YXRlLnBlcnNpc3QoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U3R5bGVzKGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlU3VjY2VzcyhgVGhlbWUgJHt0aGVtZX0gYXBwbGllZGApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdzZXQnLFxuICAgICAgICAgICAgICAgIGFsbG93VW5saXN0ZWRDb21tYW5kczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NldCBhIHRoZW1lIHZhcmlhYmxlJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzYXZlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2F2ZSB0aGUgdGhlbWUgc2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBjb21tYW5kLmNvbW1hbmQuc3BsaXQoJyAnKS5zbGljZSgyKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGhlbWVPcHRpb25zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFVuc3VwcG9ydGVkIGtleTogJHtrZXl9LCBzdXBwb3J0ZWQga2V5czogJHt0aGlzLnRoZW1lT3B0aW9ucy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50ZXJtaW5hbC5vcHRpb25zLnRoZW1lID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29udGV4dC50ZXJtaW5hbC5vcHRpb25zLnRoZW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgW2tleV06IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhdGUudXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUaGVtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbU9wdGlvbnM6IGNvbnRleHQudGVybWluYWwub3B0aW9ucy50aGVtZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVTdWNjZXNzKGBTZXQgJHtrZXl9IHRvICR7dmFsdWV9YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVN0eWxlcyhjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC5hcmdzWydzYXZlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVRoZW1lKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3NhdmUnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2F2ZSB0aGUgY3VycmVudCB0aGVtZSBzZXR0aW5ncycsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnRlcm1pbmFsLm9wdGlvbnMudGhlbWUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdGF0ZS51cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRoZW1lOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tT3B0aW9uczogY29udGV4dC50ZXJtaW5hbC5vcHRpb25zLnRoZW1lLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVUaGVtZShjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncmVzZXQnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUmVzZXQgdGhlIHRoZW1lIHRvIHRoZSBkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGVybWluYWwub3B0aW9ucy50aGVtZSA9IHsgLi4udGhpcy5kZWZhdWx0VGhlbWUgfTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdGF0ZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LnN0YXRlLnBlcnNpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVTdWNjZXNzKCdUaGVtZSByZXNldCB0byBkZWZhdWx0Jyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbGl6ZShjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmRlZmF1bHRUaGVtZSA9IGNvbnRleHQudGVybWluYWwub3B0aW9ucy50aGVtZSE7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY29udGV4dC5zdGF0ZS5nZXRTdGF0ZTxUaGVtZVN0YXRlPigpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3RlZFRoZW1lICYmIHN0YXRlLnNlbGVjdGVkVGhlbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgY29udGV4dC50ZXJtaW5hbC5vcHRpb25zLnRoZW1lID0gdGhlbWVzW3N0YXRlLnNlbGVjdGVkVGhlbWVdO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmN1c3RvbU9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnRleHQudGVybWluYWwub3B0aW9ucy50aGVtZSA9IHN0YXRlLmN1c3RvbU9wdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGx5U3R5bGVzKGNvbnRleHQpO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NDb21tYW5kKFxuICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnRleHQuZXhlY3V0b3Iuc2hvd0hlbHAoY29tbWFuZCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseVN0eWxlcyhjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGVybWluYWwtY29udGFpbmVyJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnQgb2YgQXJyYXkuZnJvbShwYXJlbnRzKSkge1xuICAgICAgICAgICAgKHBhcmVudCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZCA9XG4gICAgICAgICAgICAgICAgY29udGV4dC50ZXJtaW5hbC5vcHRpb25zLnRoZW1lPy5iYWNrZ3JvdW5kIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VGhlbWUuYmFja2dyb3VuZCE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNhdmVUaGVtZShjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBjb250ZXh0LnN0YXRlLnBlcnNpc3QoKTtcblxuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZVN1Y2Nlc3MoJ1RoZW1lIHNhdmVkJyk7XG4gICAgfVxuXG4gICAgd3JpdGVEZXNjcmlwdGlvbj8oY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignSW50ZXJhY3Qgd2l0aCB0aGUgdGhlbWUnKTtcblxuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdFeGFtcGxlczonKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyYXBJbkNvbG9yKFxuICAgICAgICAgICAgICAgICd0aGVtZSBhcHBseSBkcmFjdWxhJyxcbiAgICAgICAgICAgICAgICBDbGlGb3JlZ3JvdW5kQ29sb3IuTWFnZW50YSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcihcbiAgICAgICAgICAgICAgICAndGhlbWUgcmVzZXQnLFxuICAgICAgICAgICAgICAgIENsaUZvcmVncm91bmRDb2xvci5NYWdlbnRhLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyYXBJbkNvbG9yKFxuICAgICAgICAgICAgICAgICd0aGVtZSBzZXQgYmFja2dyb3VuZCByZWQnLFxuICAgICAgICAgICAgICAgIENsaUZvcmVncm91bmRDb2xvci5NYWdlbnRhLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyYXBJbkNvbG9yKFxuICAgICAgICAgICAgICAgICd0aGVtZSBzZXQgZm9yZWdyb3VuZCByZWQnLFxuICAgICAgICAgICAgICAgIENsaUZvcmVncm91bmRDb2xvci5NYWdlbnRhLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZSgnQXZhaWxhYmxlIHRoZW1lIG9wdGlvbnM6ICcpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JhcEluQ29sb3IoXG4gICAgICAgICAgICAgICAgdGhpcy50aGVtZU9wdGlvbnMuam9pbignLCAnKSA/PyAnJyxcbiAgICAgICAgICAgICAgICBDbGlGb3JlZ3JvdW5kQ29sb3IuQmx1ZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5jb25zdCB0aGVtZU9wdGlvbnM6IElUaGVtZSA9IHtcbiAgICBiYWNrZ3JvdW5kOiAnJyxcbiAgICBmb3JlZ3JvdW5kOiAnJyxcbiAgICBibGFjazogJycsXG4gICAgYmx1ZTogJycsXG4gICAgYnJpZ2h0QmxhY2s6ICcnLFxuICAgIGJyaWdodEJsdWU6ICcnLFxuICAgIGJyaWdodEN5YW46ICcnLFxuICAgIGJyaWdodEdyZWVuOiAnJyxcbiAgICBicmlnaHRNYWdlbnRhOiAnJyxcbiAgICBicmlnaHRSZWQ6ICcnLFxuICAgIGJyaWdodFdoaXRlOiAnJyxcbiAgICBicmlnaHRZZWxsb3c6ICcnLFxuICAgIGN5YW46ICcnLFxuICAgIGdyZWVuOiAnJyxcbiAgICBtYWdlbnRhOiAnJyxcbiAgICByZWQ6ICcnLFxuICAgIHdoaXRlOiAnJyxcbiAgICB5ZWxsb3c6ICcnLFxuICAgIGN1cnNvcjogJycsXG4gICAgY3Vyc29yQWNjZW50OiAnJyxcbiAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiAnJyxcbiAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiAnJyxcbiAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQ6ICcnLFxufTtcbiJdfQ==