UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

204 lines 23.9 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { BehaviorSubject, firstValueFrom } from 'rxjs'; import { map } from 'rxjs/operators'; import { NGE_MONACO_CONFIG } from '../monaco-config'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; export class NgeMonacoThemeService { constructor(http, config) { this.http = http; this.config = config; this.themes = new BehaviorSubject([]); this.activeTheme = new BehaviorSubject(undefined); } /** * Gets the current active theme of monaco editor (undefined if monaco editor is not loaded). */ get theme() { return this.activeTheme.value; } /** * Gets an observable that emit each time monaco editor theme change. * * Note: The observable emits first with the current theme * the first time `subscribe()` method is called. */ get themeChanges() { return this.activeTheme.asObservable(); } /** * Gets an observable that emit each time monaco editor theme list change. */ get themesChanges() { return this.themes.asObservable().pipe(map((e) => e.slice()) // return a copy of the array ); } async activate() { //this.decorateCreateEditorAPI() const node = document.createElement('div'); const editor = monaco.editor.create(node); this.themeService = editor._themeService; setTimeout(() => editor.dispose()); this.retrieveThemes(); await this.setTheme(this.config?.theming?.default || 'vs'); node.remove(); } /** * Switches monaco editor theme. * @param themeName The new theme to use. * */ async setTheme(themeName) { await this.defineTheme(themeName); monaco.editor.setTheme(themeName); this.activeTheme.next(this.themeService.getColorTheme()); } /** * Gets the information about the given `themeName` * @param themeName The theme to get. * @returns A promise that resolves with the theme info. */ async getTheme(themeName) { await this.defineTheme(themeName); return this.themeService._knownThemes.get(themeName); } /** * Defines a theme for the Monaco editor. * @remarks * - If the theme is already defined, this method does nothing. * @param themeName - The name of the theme to define. * @throws {ReferenceError} If the themeName argument is not provided. * @throws {Error} If the specified theme is missing. * @throws {Error} If HttpClientModule is missing in AppModule. * @returns A Promise that resolves when the theme is defined successfully. */ async defineTheme(themeName) { if (!themeName) { throw new ReferenceError('Argument "themeName" is required'); } const knownThemes = this.themeService._knownThemes; if (knownThemes.has(themeName)) { return; } const customThemePath = this.config?.theming?.themes?.find((e) => { return this.themeNameFromPath(e) === themeName; }); if (!customThemePath) { throw new Error(`[nge-monaco] Missing theme "${themeName}"`); } if (!this.http) { throw new Error('[nge-monaco] Missing HttpClientModule in AppModule. See README for more information'); } try { const theme = await firstValueFrom(this.http.get(customThemePath)); monaco.editor.defineTheme(themeName, { base: theme.base, inherit: theme.inherit, rules: theme.rules, colors: theme.colors, }); } catch (error) { console.error('[nge-monaco] Failed to load theme ' + customThemePath, error); } } retrieveThemes() { const themes = []; this.themeService._knownThemes.forEach((theme) => { themes.push(theme.themeName); }); const customThemes = (this.config?.theming?.themes || []).map(this.themeNameFromPath.bind(this)); this.themes.next(themes.concat(customThemes)); } themeNameFromPath(path) { const name = path.split('/').pop(); if (!name) { throw new Error(`[nge-monaco]: invalid theme path "${path}"`); } return name.replace('.json', ''); } decorateCreateEditorAPI() { const createEditor = monaco.editor.create; monaco.editor.create = (element, options, override) => { const editor = createEditor.call(monaco.editor, element, options, override); const updateOptions = editor.updateOptions; editor.updateOptions = (newOptions) => { updateOptions.call(editor, newOptions); if (newOptions.theme) { this.setTheme(newOptions.theme).catch(console.error); } }; if (options?.theme) { this.setTheme(options.theme).catch(console.error); } return editor; }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMonacoThemeService, deps: [{ token: i1.HttpClient, optional: true }, { token: NGE_MONACO_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMonacoThemeService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMonacoThemeService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.HttpClient, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NGE_MONACO_CONFIG] }] }] }); /** List of all custom themes from of the library */ export const NGE_MONACO_THEMES = [ 'active4d.json', 'all-hallows-eve.json', 'amy.json', 'birds-of-paradise.json', 'blackboard.json', 'brilliance-black.json', 'brilliance-dull.json', 'chrome-devtools.json', 'clouds-midnight.json', 'clouds.json', 'cobalt.json', 'dawn.json', 'dreamweaver.json', 'eiffel.json', 'espresso-libre.json', 'github.json', 'idle-fingers.json', 'idle.json', 'iplastic.json', 'katzenmilch.json', 'kuroir-theme.json', 'kr-theme.json', 'lazy.json', 'magicwb-amiga.json', 'merbivore-soft.json', 'merbivore.json', 'monokai-bright.json', 'monokai.json', 'monoindustrial.json', 'night-owl.json', 'nord.json', 'oceanic-next.json', 'one-dark-pro.json', 'pastels-on-dark.json', 'slush-and-poppies.json', 'solarized-dark.json', 'solarized-light.json', 'space-cadet.json', 'sunburst.json', 'textmate.json', 'tomorrow-night-blue.json', 'tomorrow-night-bright.json', 'tomorrow-night-eighties.json', 'tomorrow-night.json', 'tomorrow.json', 'twilight.json', 'upstream-sunburst.json', 'vibrant-ink.json', 'xcode.json', 'zenburnesque.json', ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uYWNvLXRoZW1lLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ2UvbW9uYWNvL3NyYy9zZXJ2aWNlcy9tb25hY28tdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXBDLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxrQkFBa0IsQ0FBQTs7O0FBR3JFLE1BQU0sT0FBTyxxQkFBcUI7SUFNaEMsWUFFbUIsSUFBZ0IsRUFJaEIsTUFBdUI7UUFKdkIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUloQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQVh6QixXQUFNLEdBQUcsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUE7UUFDMUMsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBNkIsU0FBUyxDQUFDLENBQUE7SUFXdEYsQ0FBQztJQUVKOztPQUVHO0lBQ0gsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQTtJQUMvQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyw2QkFB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YTtJQUNiLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2YsV0FBVztJQUNYLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QscUJBQXFCO0lBQ3JCLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsd0JBQXdCO0lBQ3hCLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixlQUFlO0lBQ2YsMEJBQTBCO0lBQzFCLDRCQUE0QjtJQUM1Qiw4QkFBOEI7SUFDOUIscUJBQXFCO0lBQ3JCLGVBQWU7SUFDZixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osbUJBQW1CO0NBQ3BCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBOZ2VNb25hY29Db250cmlidXRpb24gfSBmcm9tICcuLi9jb250cmlidXRpb25zL21vbmFjby1jb250cmlidXRpb24nXG5pbXBvcnQgeyBOR0VfTU9OQUNPX0NPTkZJRywgTmdlTW9uYWNvQ29uZmlnIH0gZnJvbSAnLi4vbW9uYWNvLWNvbmZpZydcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOZ2VNb25hY29UaGVtZVNlcnZpY2UgaW1wbGVtZW50cyBOZ2VNb25hY29Db250cmlidXRpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IHRoZW1lcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKVxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZVRoZW1lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOZ2VNb25hY29UaGVtZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuXG4gIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBhbnlcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcblxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChOR0VfTU9OQUNPX0NPTkZJRylcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTmdlTW9uYWNvQ29uZmlnXG4gICkge31cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBhY3RpdmUgdGhlbWUgb2YgbW9uYWNvIGVkaXRvciAodW5kZWZpbmVkIGlmIG1vbmFjbyBlZGl0b3IgaXMgbm90IGxvYWRlZCkuXG4gICAqL1xuICBnZXQgdGhlbWUoKTogTmdlTW9uYWNvVGhlbWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZVRoZW1lLnZhbHVlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdCBlYWNoIHRpbWUgbW9uYWNvIGVkaXRvciB0aGVtZSBjaGFuZ2UuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBvYnNlcnZhYmxlIGVtaXRzIGZpcnN0IHdpdGggdGhlIGN1cnJlbnQgdGhlbWVcbiAgICogdGhlIGZpcnN0IHRpbWUgYHN1YnNjcmliZSgpYCBtZXRob2QgaXMgY2FsbGVkLlxuICAgKi9cbiAgZ2V0IHRoZW1lQ2hhbmdlcygpOiBPYnNlcnZhYmxlPE5nZU1vbmFjb1RoZW1lIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVGhlbWUuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9ic2VydmFibGUgdGhhdCBlbWl0IGVhY2ggdGltZSBtb25hY28gZWRpdG9yIHRoZW1lIGxpc3QgY2hhbmdlLlxuICAgKi9cbiAgZ2V0IHRoZW1lc0NoYW5nZXMoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnRoZW1lcy5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgbWFwKChlKSA9PiBlLnNsaWNlKCkpIC8vIHJldHVybiBhIGNvcHkgb2YgdGhlIGFycmF5XG4gICAgKVxuICB9XG5cbiAgYXN5bmMgYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy90aGlzLmRlY29yYXRlQ3JlYXRlRWRpdG9yQVBJKClcblxuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuXG4gICAgY29uc3QgZWRpdG9yID0gbW9uYWNvLmVkaXRvci5jcmVhdGUobm9kZSlcbiAgICB0aGlzLnRoZW1lU2VydmljZSA9IChlZGl0b3IgYXMgYW55KS5fdGhlbWVTZXJ2aWNlXG4gICAgc2V0VGltZW91dCgoKSA9PiBlZGl0b3IuZGlzcG9zZSgpKVxuXG4gICAgdGhpcy5yZXRyaWV2ZVRoZW1lcygpXG5cbiAgICBhd2FpdCB0aGlzLnNldFRoZW1lKHRoaXMuY29uZmlnPy50aGVtaW5nPy5kZWZhdWx0IHx8ICd2cycpXG4gICAgbm9kZS5yZW1vdmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIG1vbmFjbyBlZGl0b3IgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZU5hbWUgVGhlIG5ldyB0aGVtZSB0byB1c2UuXG4gICAqXG4gICAqL1xuICBhc3luYyBzZXRUaGVtZSh0aGVtZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVmaW5lVGhlbWUodGhlbWVOYW1lKVxuICAgIG1vbmFjby5lZGl0b3Iuc2V0VGhlbWUodGhlbWVOYW1lKVxuICAgIHRoaXMuYWN0aXZlVGhlbWUubmV4dCh0aGlzLnRoZW1lU2VydmljZS5nZXRDb2xvclRoZW1lKCkpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuIGB0aGVtZU5hbWVgXG4gICAqIEBwYXJhbSB0aGVtZU5hbWUgVGhlIHRoZW1lIHRvIGdldC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGhlbWUgaW5mby5cbiAgICovXG4gIGFzeW5jIGdldFRoZW1lKHRoZW1lTmFtZTogc3RyaW5nKTogUHJvbWlzZTxOZ2VNb25hY29UaGVtZT4ge1xuICAgIGF3YWl0IHRoaXMuZGVmaW5lVGhlbWUodGhlbWVOYW1lKVxuICAgIHJldHVybiB0aGlzLnRoZW1lU2VydmljZS5fa25vd25UaGVtZXMuZ2V0KHRoZW1lTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgdGhlbWUgZm9yIHRoZSBNb25hY28gZWRpdG9yLlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIElmIHRoZSB0aGVtZSBpcyBhbHJlYWR5IGRlZmluZWQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cbiAgICogQHBhcmFtIHRoZW1lTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0aGVtZSB0byBkZWZpbmUuXG4gICAqIEB0aHJvd3Mge1JlZmVyZW5jZUVycm9yfSBJZiB0aGUgdGhlbWVOYW1lIGFyZ3VtZW50IGlzIG5vdCBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBzcGVjaWZpZWQgdGhlbWUgaXMgbWlzc2luZy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIEh0dHBDbGllbnRNb2R1bGUgaXMgbWlzc2luZyBpbiBBcHBNb2R1bGUuXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRoZW1lIGlzIGRlZmluZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgYXN5bmMgZGVmaW5lVGhlbWUodGhlbWVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoZW1lTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdBcmd1bWVudCBcInRoZW1lTmFtZVwiIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICBjb25zdCBrbm93blRoZW1lczogTWFwPHN0cmluZywgTmdlTW9uYWNvVGhlbWU+ID0gdGhpcy50aGVtZVNlcnZpY2UuX2tub3duVGhlbWVzXG4gICAgaWYgKGtub3duVGhlbWVzLmhhcyh0aGVtZU5hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21UaGVtZVBhdGggPSB0aGlzLmNvbmZpZz8udGhlbWluZz8udGhlbWVzPy5maW5kKChlKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy50aGVtZU5hbWVGcm9tUGF0aChlKSA9PT0gdGhlbWVOYW1lXG4gICAgfSlcbiAgICBpZiAoIWN1c3RvbVRoZW1lUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmdlLW1vbmFjb10gTWlzc2luZyB0aGVtZSBcIiR7dGhlbWVOYW1lfVwiYClcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaHR0cCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbbmdlLW1vbmFjb10gTWlzc2luZyBIdHRwQ2xpZW50TW9kdWxlIGluIEFwcE1vZHVsZS4gU2VlIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbicpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRoZW1lID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxhbnk+KGN1c3RvbVRoZW1lUGF0aCkpXG4gICAgICBtb25hY28uZWRpdG9yLmRlZmluZVRoZW1lKHRoZW1lTmFtZSwge1xuICAgICAgICBiYXNlOiB0aGVtZS5iYXNlLFxuICAgICAgICBpbmhlcml0OiB0aGVtZS5pbmhlcml0LFxuICAgICAgICBydWxlczogdGhlbWUucnVsZXMsXG4gICAgICAgIGNvbG9yczogdGhlbWUuY29sb3JzIGFzIGFueSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuZ2UtbW9uYWNvXSBGYWlsZWQgdG8gbG9hZCB0aGVtZSAnICsgY3VzdG9tVGhlbWVQYXRoLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJldHJpZXZlVGhlbWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRoZW1lczogc3RyaW5nW10gPSBbXVxuICAgIHRoaXMudGhlbWVTZXJ2aWNlLl9rbm93blRoZW1lcy5mb3JFYWNoKCh0aGVtZTogYW55KSA9PiB7XG4gICAgICB0aGVtZXMucHVzaCh0aGVtZS50aGVtZU5hbWUpXG4gICAgfSlcbiAgICBjb25zdCBjdXN0b21UaGVtZXM6IHN0cmluZ1tdID0gKHRoaXMuY29uZmlnPy50aGVtaW5nPy50aGVtZXMgfHwgW10pLm1hcCh0aGlzLnRoZW1lTmFtZUZyb21QYXRoLmJpbmQodGhpcykpXG4gICAgdGhpcy50aGVtZXMubmV4dCh0aGVtZXMuY29uY2F0KGN1c3RvbVRoZW1lcykpXG4gIH1cblxuICBwcml2YXRlIHRoZW1lTmFtZUZyb21QYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHBhdGguc3BsaXQoJy8nKS5wb3AoKVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmdlLW1vbmFjb106IGludmFsaWQgdGhlbWUgcGF0aCBcIiR7cGF0aH1cImApXG4gICAgfVxuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy5qc29uJywgJycpXG4gIH1cblxuICBwcml2YXRlIGRlY29yYXRlQ3JlYXRlRWRpdG9yQVBJKCk6IHZvaWQge1xuICAgIGNvbnN0IGNyZWF0ZUVkaXRvciA9IG1vbmFjby5lZGl0b3IuY3JlYXRlXG4gICAgbW9uYWNvLmVkaXRvci5jcmVhdGUgPSAoXG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgIG9wdGlvbnM/OiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgICAgIG92ZXJyaWRlPzogbW9uYWNvLmVkaXRvci5JRWRpdG9yT3ZlcnJpZGVTZXJ2aWNlcyB8IHVuZGVmaW5lZFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgZWRpdG9yID0gY3JlYXRlRWRpdG9yLmNhbGwobW9uYWNvLmVkaXRvciwgZWxlbWVudCwgb3B0aW9ucywgb3ZlcnJpZGUpXG4gICAgICBjb25zdCB1cGRhdGVPcHRpb25zID0gZWRpdG9yLnVwZGF0ZU9wdGlvbnNcbiAgICAgIGVkaXRvci51cGRhdGVPcHRpb25zID0gKG5ld09wdGlvbnM6IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIHVwZGF0ZU9wdGlvbnMuY2FsbChlZGl0b3IsIG5ld09wdGlvbnMpXG4gICAgICAgIGlmIChuZXdPcHRpb25zLnRoZW1lKSB7XG4gICAgICAgICAgdGhpcy5zZXRUaGVtZShuZXdPcHRpb25zLnRoZW1lKS5jYXRjaChjb25zb2xlLmVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zPy50aGVtZSkge1xuICAgICAgICB0aGlzLnNldFRoZW1lKG9wdGlvbnMudGhlbWUpLmNhdGNoKGNvbnNvbGUuZXJyb3IpXG4gICAgICB9XG4gICAgICByZXR1cm4gZWRpdG9yXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdlTW9uYWNvVGhlbWUge1xuICBpZDogc3RyaW5nXG4gIHR5cGU6ICdsaWdodCcgfCAnZGFyaycgfCAnaGMnXG4gIGNvbG9yczogTWFwPHN0cmluZywgYW55PlxuICB0aGVtZU5hbWU6IHN0cmluZ1xuICBzZW1hbnRpY0hpZ2hsaWdodGluZzogYm9vbGVhblxuICB0aGVtZURhdGE6IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVUaGVtZURhdGFcbiAgZGVmYXVsdENvbG9yczogTWFwPHN0cmluZywgYW55PlxuICBkZWZpbmVzKGNvbG9ySWQ6IHN0cmluZyk6IGJvb2xlYW5cbiAgZ2V0Q29sb3IoY29sb3JJZDogc3RyaW5nLCB1c2VEZWZhdWx0PzogYm9vbGVhbik6IGFueVxuICBnZXRDb2xvcnMoKTogTWFwPHN0cmluZywgYW55PlxufVxuXG4vKiogTGlzdCBvZiBhbGwgY3VzdG9tIHRoZW1lcyBmcm9tIG9mIHRoZSBsaWJyYXJ5ICovXG5leHBvcnQgY29uc3QgTkdFX01PTkFDT19USEVNRVMgPSBbXG4gICdhY3RpdmU0ZC5qc29uJyxcbiAgJ2FsbC1oYWxsb3dzLWV2ZS5qc29uJyxcbiAgJ2FteS5qc29uJyxcbiAgJ2JpcmRzLW9mLXBhcmFkaXNlLmpzb24nLFxuICAnYmxhY2tib2FyZC5qc29uJyxcbiAgJ2JyaWxsaWFuY2UtYmxhY2suanNvbicsXG4gICdicmlsbGlhbmNlLWR1bGwuanNvbicsXG4gICdjaHJvbWUtZGV2dG9vbHMuanNvbicsXG4gICdjbG91ZHMtbWlkbmlnaHQuanNvbicsXG4gICdjbG91ZHMuanNvbicsXG4gICdjb2JhbHQuanNvbicsXG4gICdkYXduLmpzb24nLFxuICAnZHJlYW13ZWF2ZXIuanNvbicsXG4gICdlaWZmZWwuanNvbicsXG4gICdlc3ByZXNzby1saWJyZS5qc29uJyxcbiAgJ2dpdGh1Yi5qc29uJyxcbiAgJ2lkbGUtZmluZ2Vycy5qc29uJyxcbiAgJ2lkbGUuanNvbicsXG4gICdpcGxhc3RpYy5qc29uJyxcbiAgJ2thdHplbm1pbGNoLmpzb24nLFxuICAna3Vyb2lyLXRoZW1lLmpzb24nLFxuICAna3ItdGhlbWUuanNvbicsXG4gICdsYXp5Lmpzb24nLFxuICAnbWFnaWN3Yi1hbWlnYS5qc29uJyxcbiAgJ21lcmJpdm9yZS1zb2Z0Lmpzb24nLFxuICAnbWVyYml2b3JlLmpzb24nLFxuICAnbW9ub2thaS1icmlnaHQuanNvbicsXG4gICdtb25va2FpLmpzb24nLFxuICAnbW9ub2luZHVzdHJpYWwuanNvbicsXG4gICduaWdodC1vd2wuanNvbicsXG4gICdub3JkLmpzb24nLFxuICAnb2NlYW5pYy1uZXh0Lmpzb24nLFxuICAnb25lLWRhcmstcHJvLmpzb24nLFxuICAncGFzdGVscy1vbi1kYXJrLmpzb24nLFxuICAnc2x1c2gtYW5kLXBvcHBpZXMuanNvbicsXG4gICdzb2xhcml6ZWQtZGFyay5qc29uJyxcbiAgJ3NvbGFyaXplZC1saWdodC5qc29uJyxcbiAgJ3NwYWNlLWNhZGV0Lmpzb24nLFxuICAnc3VuYnVyc3QuanNvbicsXG4gICd0ZXh0bWF0ZS5qc29uJyxcbiAgJ3RvbW9ycm93LW5pZ2h0LWJsdWUuanNvbicsXG4gICd0b21vcnJvdy1uaWdodC1icmlnaHQuanNvbicsXG4gICd0b21vcnJvdy1uaWdodC1laWdodGllcy5qc29uJyxcbiAgJ3RvbW9ycm93LW5pZ2h0Lmpzb24nLFxuICAndG9tb3Jyb3cuanNvbicsXG4gICd0d2lsaWdodC5qc29uJyxcbiAgJ3Vwc3RyZWFtLXN1bmJ1cnN0Lmpzb24nLFxuICAndmlicmFudC1pbmsuanNvbicsXG4gICd4Y29kZS5qc29uJyxcbiAgJ3plbmJ1cm5lc3F1ZS5qc29uJyxcbl1cbiJdfQ==