@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
204 lines • 23.9 kB
JavaScript
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==