UNPKG

ngx-highlightjs

Version:

Instant code highlighting, auto-detect language, super easy to use.

139 lines 20.7 kB
import { Injectable, Inject, Optional } from '@angular/core'; import { filter, map, tap } from 'rxjs/operators'; import { HIGHLIGHT_OPTIONS } from './highlight.model'; import * as i0 from "@angular/core"; import * as i1 from "./highlight.loader"; export class HighlightJS { constructor(_loader, options) { this._loader = _loader; this._hljs = null; // Load highlight.js library on init _loader.ready.subscribe((hljs) => { this._hljs = hljs; if (options && options.config) { // Set global config if present hljs.configure(options.config); if (hljs.listLanguages().length < 1) { console.error('[HighlightJS]: No languages were registered!'); } } }); } // A reference for hljs library get hljs() { return this._hljs; } /** * Core highlighting function. Accepts the code to highlight (string) and a list of options (object) * @param code Accepts the code to highlight * @param language must be present and specify the language name or alias of the grammar to be used for highlighting * @param ignoreIllegals (optional) when set to true it forces highlighting to finish even in case of detecting illegal syntax for the language instead of throwing an exception. */ highlight(code, { language, ignoreIllegals }) { return this._loader.ready.pipe(map((hljs) => hljs.highlight(code, { language, ignoreIllegals }))); } /** * Highlighting with language detection. * @param value Accepts a string with the code to highlight * @param languageSubset An optional array of language names and aliases restricting detection to only those languages. * The subset can also be set with configure, but the local parameter overrides the option if set. */ highlightAuto(value, languageSubset) { return this._loader.ready.pipe(map((hljs) => hljs.highlightAuto(value, languageSubset))); } /** * Applies highlighting to a DOM node containing code. * This function is the one to use to apply highlighting dynamically after page load or within initialization code of third-party JavaScript frameworks. * The function uses language detection by default but you can specify the language in the class attribute of the DOM node. See the scopes reference for all available language names and scopes. * @param element */ highlightElement(element) { return this._loader.ready.pipe(map((hljs) => hljs.highlightElement(element))); } /** * Applies highlighting to all elements on a page matching the configured cssSelector. The default cssSelector value is 'pre code', * which highlights all code blocks. This can be called before or after the page’s onload event has fired. */ highlightAll() { return this._loader.ready.pipe(map((hljs) => hljs.highlightAll())); } /** * @deprecated in version 12 * Configures global options: * @param config HighlightJs configuration argument */ configure(config) { return this._loader.ready.pipe(map((hljs) => hljs.configure(config))); } /** * Adds new language to the library under the specified name. Used mostly internally. * @param languageName A string with the name of the language being registered * @param languageDefinition A function that returns an object which represents the language definition. * The function is passed the hljs object to be able to use common regular expressions defined within it. */ registerLanguage(languageName, languageDefinition) { return this._loader.ready.pipe(tap((hljs) => hljs.registerLanguage(languageName, languageDefinition))); } /** * Removes a language and its aliases from the library. Used mostly internall * @param languageName: a string with the name of the language being removed. */ unregisterLanguage(languageName) { return this._loader.ready.pipe(tap((hljs) => hljs.unregisterLanguage(languageName))); } /** * Adds new language alias or aliases to the library for the specified language name defined under languageName key. * @param alias: A string or array with the name of alias being registered * @param languageName: the language name as specified by registerLanguage. */ registerAliases(alias, { languageName }) { return this._loader.ready.pipe(tap((hljs) => hljs.registerAliases(alias, { languageName }))); } /** * @return The languages names list. */ listLanguages() { return this._loader.ready.pipe(map((hljs) => hljs.listLanguages())); } /** * Looks up a language by name or alias. * @param name Language name * @return The language object if found, undefined otherwise. */ getLanguage(name) { return this._loader.ready.pipe(map((hljs) => hljs.getLanguage(name))); } /** * Enables safe mode. This is the default mode, providing the most reliable experience for production usage. */ safeMode() { return this._loader.ready.pipe(map((hljs) => hljs.safeMode())); } /** * Enables debug/development mode. */ debugMode() { return this._loader.ready.pipe(map((hljs) => hljs.debugMode())); } /** * Display line numbers * @param el Code element */ lineNumbersBlock(el) { return this._loader.ready.pipe(filter((hljs) => !!hljs.lineNumbersBlock), tap((hljs) => hljs.lineNumbersBlock(el))); } } HighlightJS.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightJS, deps: [{ token: i1.HighlightLoader }, { token: HIGHLIGHT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); HighlightJS.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightJS, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightJS, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.HighlightLoader }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [HIGHLIGHT_OPTIONS] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaGlnaGxpZ2h0anMvc3JjL2xpYi9oaWdobGlnaHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUtMLGlCQUFpQixFQUVsQixNQUFNLG1CQUFtQixDQUFDOzs7QUFNM0IsTUFBTSxPQUFPLFdBQVc7SUFTdEIsWUFBb0IsT0FBd0IsRUFBeUMsT0FBeUI7UUFBMUYsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFQcEMsVUFBSyxHQUE0QixJQUFJLENBQUM7UUFRNUMsb0NBQW9DO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBc0IsRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQzdCLCtCQUErQjtnQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztpQkFDL0Q7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQWpCRCwrQkFBK0I7SUFDL0IsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFnQkQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsSUFBWSxF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LElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDNUIsR0FBRyxDQUFDLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQ2pELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzVCLEdBQUcsQ0FBQyxDQUFDLElBQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUNsRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEVBQWU7UUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzVCLE1BQU0sQ0FBQyxDQUFDLElBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFDM0QsR0FBRyxDQUFDLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQzNELENBQUM7SUFDSixDQUFDOzt3R0FqS1UsV0FBVyxpREFTNEMsaUJBQWlCOzRHQVR4RSxXQUFXLGNBRlYsTUFBTTsyRkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBVWdELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgSGlnaGxpZ2h0Q29uZmlnLFxyXG4gIEhpZ2hsaWdodFJlc3VsdCxcclxuICBIaWdobGlnaHRMaWJyYXJ5LFxyXG4gIEhpZ2hsaWdodE9wdGlvbnMsXHJcbiAgSElHSExJR0hUX09QVElPTlMsXHJcbiAgSGlnaGxpZ2h0QXV0b1Jlc3VsdFxyXG59IGZyb20gJy4vaGlnaGxpZ2h0Lm1vZGVsJztcclxuaW1wb3J0IHsgSGlnaGxpZ2h0TG9hZGVyIH0gZnJvbSAnLi9oaWdobGlnaHQubG9hZGVyJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEhpZ2hsaWdodEpTIHtcclxuXHJcbiAgcHJpdmF0ZSBfaGxqczogSGlnaGxpZ2h0TGlicmFyeSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyBBIHJlZmVyZW5jZSBmb3IgaGxqcyBsaWJyYXJ5XHJcbiAgZ2V0IGhsanMoKTogSGlnaGxpZ2h0TGlicmFyeSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hsanM7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2FkZXI6IEhpZ2hsaWdodExvYWRlciwgQE9wdGlvbmFsKCkgQEluamVjdChISUdITElHSFRfT1BUSU9OUykgb3B0aW9uczogSGlnaGxpZ2h0T3B0aW9ucykge1xyXG4gICAgLy8gTG9hZCBoaWdobGlnaHQuanMgbGlicmFyeSBvbiBpbml0XHJcbiAgICBfbG9hZGVyLnJlYWR5LnN1YnNjcmliZSgoaGxqczogSGlnaGxpZ2h0TGlicmFyeSkgPT4ge1xyXG4gICAgICB0aGlzLl9obGpzID0gaGxqcztcclxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jb25maWcpIHtcclxuICAgICAgICAvLyBTZXQgZ2xvYmFsIGNvbmZpZyBpZiBwcmVzZW50XHJcbiAgICAgICAgaGxqcy5jb25maWd1cmUob3B0aW9ucy5jb25maWcpO1xyXG4gICAgICAgIGlmIChobGpzLmxpc3RMYW5ndWFnZXMoKS5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSGlnaGxpZ2h0SlNdOiBObyBsYW5ndWFnZXMgd2VyZSByZWdpc3RlcmVkIScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3JlIGhpZ2hsaWdodGluZyBmdW5jdGlvbi4gQWNjZXB0cyB0aGUgY29kZSB0byBoaWdobGlnaHQgKHN0cmluZykgYW5kIGEgbGlzdCBvZiBvcHRpb25zIChvYmplY3QpXHJcbiAgICogQHBhcmFtIGNvZGUgQWNjZXB0cyB0aGUgY29kZSB0byBoaWdobGlnaHRcclxuICAgKiBAcGFyYW0gbGFuZ3VhZ2UgbXVzdCBiZSBwcmVzZW50IGFuZCBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBuYW1lIG9yIGFsaWFzIG9mIHRoZSBncmFtbWFyIHRvIGJlIHVzZWQgZm9yIGhpZ2hsaWdodGluZ1xyXG4gICAqIEBwYXJhbSBpZ25vcmVJbGxlZ2FscyAob3B0aW9uYWwpIHdoZW4gc2V0IHRvIHRydWUgaXQgZm9yY2VzIGhpZ2hsaWdodGluZyB0byBmaW5pc2ggZXZlbiBpbiBjYXNlIG9mIGRldGVjdGluZyBpbGxlZ2FsIHN5bnRheCBmb3IgdGhlIGxhbmd1YWdlIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodChjb2RlOiBzdHJpbmcsIHsgbGFuZ3VhZ2UsIGlnbm9yZUlsbGVnYWxzIH06IHsgbGFuZ3VhZ2U6IHN0cmluZywgaWdub3JlSWxsZWdhbHM6IGJvb2xlYW4gfSk6IE9ic2VydmFibGU8SGlnaGxpZ2h0UmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZGVyLnJlYWR5LnBpcGUoXHJcbiAgICAgIG1hcCgoaGxqczogSGlnaGxpZ2h0TGlicmFyeSkgPT4gaGxqcy5oaWdobGlnaHQoY29kZSwgeyBsYW5ndWFnZSwgaWdub3JlSWxsZWdhbHMgfSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0aW5nIHdpdGggbGFuZ3VhZ2UgZGV0ZWN0aW9uLlxyXG4gICAqIEBwYXJhbSB2YWx1ZSBBY2NlcHRzIGEgc3RyaW5nIHdpdGggdGhlIGNvZGUgdG8gaGlnaGxpZ2h0XHJcbiAgICogQHBhcmFtIGxhbmd1YWdlU3Vic2V0IEFuIG9wdGlvbmFsIGFycmF5IG9mIGxhbmd1YWdlIG5hbWVzIGFuZCBhbGlhc2VzIHJlc3RyaWN0aW5nIGRldGVjdGlvbiB0byBvbmx5IHRob3NlIGxhbmd1YWdlcy5cclxuICAgKiBUaGUgc3Vic2V0IGNhbiBhbHNvIGJlIHNldCB3aXRoIGNvbmZpZ3VyZSwgYnV0IHRoZSBsb2NhbCBwYXJhbWV0ZXIgb3ZlcnJpZGVzIHRoZSBvcHRpb24gaWYgc2V0LlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodEF1dG8odmFsdWU6IHN0cmluZywgbGFuZ3VhZ2VTdWJzZXQ6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxIaWdobGlnaHRBdXRvUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZGVyLnJlYWR5LnBpcGUoXHJcbiAgICAgIG1hcCgoaGxqczogSGlnaGxpZ2h0TGlicmFyeSkgPT4gaGxqcy5oaWdobGlnaHRBdXRvKHZhbHVlLCBsYW5ndWFnZVN1YnNldCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbGllcyBoaWdobGlnaHRpbmcgdG8gYSBET00gbm9kZSBjb250YWluaW5nIGNvZGUuXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgb25lIHRvIHVzZSB0byBhcHBseSBoaWdobGlnaHRpbmcgZHluYW1pY2FsbHkgYWZ0ZXIgcGFnZSBsb2FkIG9yIHdpdGhpbiBpbml0aWFsaXphdGlvbiBjb2RlIG9mIHRoaXJkLXBhcnR5IEphdmFTY3JpcHQgZnJhbWV3b3Jrcy5cclxuICAgKiBUaGUgZnVuY3Rpb24gdXNlcyBsYW5ndWFnZSBkZXRlY3Rpb24gYnkgZGVmYXVsdCBidXQgeW91IGNhbiBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB0aGUgY2xhc3MgYXR0cmlidXRlIG9mIHRoZSBET00gbm9kZS4gU2VlIHRoZSBzY29wZXMgcmVmZXJlbmNlIGZvciBhbGwgYXZhaWxhYmxlIGxhbmd1YWdlIG5hbWVzIGFuZCBzY29wZXMuXHJcbiAgICogQHBhcmFtIGVsZW1lbnRcclxuICAgKi9cclxuICBoaWdobGlnaHRFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9sb2FkZXIucmVhZHkucGlwZShcclxuICAgICAgbWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiBobGpzLmhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbGllcyBoaWdobGlnaHRpbmcgdG8gYWxsIGVsZW1lbnRzIG9uIGEgcGFnZSBtYXRjaGluZyB0aGUgY29uZmlndXJlZCBjc3NTZWxlY3Rvci4gVGhlIGRlZmF1bHQgY3NzU2VsZWN0b3IgdmFsdWUgaXMgJ3ByZSBjb2RlJyxcclxuICAgKiB3aGljaCBoaWdobGlnaHRzIGFsbCBjb2RlIGJsb2Nrcy4gVGhpcyBjYW4gYmUgY2FsbGVkIGJlZm9yZSBvciBhZnRlciB0aGUgcGFnZeKAmXMgb25sb2FkIGV2ZW50IGhhcyBmaXJlZC5cclxuICAgKi9cclxuICBoaWdobGlnaHRBbGwoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9sb2FkZXIucmVhZHkucGlwZShcclxuICAgICAgbWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiBobGpzLmhpZ2hsaWdodEFsbCgpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTJcclxuICAgKiBDb25maWd1cmVzIGdsb2JhbCBvcHRpb25zOlxyXG4gICAqIEBwYXJhbSBjb25maWcgSGlnaGxpZ2h0SnMgY29uZmlndXJhdGlvbiBhcmd1bWVudFxyXG4gICAqL1xyXG4gIGNvbmZpZ3VyZShjb25maWc6IEhpZ2hsaWdodENvbmZpZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlci5yZWFkeS5waXBlKFxyXG4gICAgICBtYXAoKGhsanM6IEhpZ2hsaWdodExpYnJhcnkpID0+IGhsanMuY29uZmlndXJlKGNvbmZpZykpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBuZXcgbGFuZ3VhZ2UgdG8gdGhlIGxpYnJhcnkgdW5kZXIgdGhlIHNwZWNpZmllZCBuYW1lLiBVc2VkIG1vc3RseSBpbnRlcm5hbGx5LlxyXG4gICAqIEBwYXJhbSBsYW5ndWFnZU5hbWUgQSBzdHJpbmcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UgYmVpbmcgcmVnaXN0ZXJlZFxyXG4gICAqIEBwYXJhbSBsYW5ndWFnZURlZmluaXRpb24gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGxhbmd1YWdlIGRlZmluaXRpb24uXHJcbiAgICogVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgaGxqcyBvYmplY3QgdG8gYmUgYWJsZSB0byB1c2UgY29tbW9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVmaW5lZCB3aXRoaW4gaXQuXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZU5hbWU6IHN0cmluZywgbGFuZ3VhZ2VEZWZpbml0aW9uOiAoKSA9PiBhbnkpOiBPYnNlcnZhYmxlPEhpZ2hsaWdodExpYnJhcnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9sb2FkZXIucmVhZHkucGlwZShcclxuICAgICAgdGFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiBobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UobGFuZ3VhZ2VOYW1lLCBsYW5ndWFnZURlZmluaXRpb24pKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYSBsYW5ndWFnZSBhbmQgaXRzIGFsaWFzZXMgZnJvbSB0aGUgbGlicmFyeS4gVXNlZCBtb3N0bHkgaW50ZXJuYWxsXHJcbiAgICogQHBhcmFtIGxhbmd1YWdlTmFtZTogYSBzdHJpbmcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UgYmVpbmcgcmVtb3ZlZC5cclxuICAgKi9cclxuICB1bnJlZ2lzdGVyTGFuZ3VhZ2UobGFuZ3VhZ2VOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlci5yZWFkeS5waXBlKFxyXG4gICAgICB0YXAoKGhsanM6IEhpZ2hsaWdodExpYnJhcnkpID0+IGhsanMudW5yZWdpc3Rlckxhbmd1YWdlKGxhbmd1YWdlTmFtZSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBuZXcgbGFuZ3VhZ2UgYWxpYXMgb3IgYWxpYXNlcyB0byB0aGUgbGlicmFyeSBmb3IgdGhlIHNwZWNpZmllZCBsYW5ndWFnZSBuYW1lIGRlZmluZWQgdW5kZXIgbGFuZ3VhZ2VOYW1lIGtleS5cclxuICAgKiBAcGFyYW0gYWxpYXM6IEEgc3RyaW5nIG9yIGFycmF5IHdpdGggdGhlIG5hbWUgb2YgYWxpYXMgYmVpbmcgcmVnaXN0ZXJlZFxyXG4gICAqIEBwYXJhbSBsYW5ndWFnZU5hbWU6IHRoZSBsYW5ndWFnZSBuYW1lIGFzIHNwZWNpZmllZCBieSByZWdpc3Rlckxhbmd1YWdlLlxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyQWxpYXNlcyhhbGlhczogc3RyaW5nIHwgc3RyaW5nW10sIHsgbGFuZ3VhZ2VOYW1lIH06IHsgbGFuZ3VhZ2VOYW1lOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZGVyLnJlYWR5LnBpcGUoXHJcbiAgICAgIHRhcCgoaGxqczogSGlnaGxpZ2h0TGlicmFyeSkgPT4gaGxqcy5yZWdpc3RlckFsaWFzZXMoYWxpYXMsIHsgbGFuZ3VhZ2VOYW1lIH0pKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAcmV0dXJuIFRoZSBsYW5ndWFnZXMgbmFtZXMgbGlzdC5cclxuICAgKi9cclxuICBsaXN0TGFuZ3VhZ2VzKCk6IE9ic2VydmFibGU8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9sb2FkZXIucmVhZHkucGlwZShcclxuICAgICAgbWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiBobGpzLmxpc3RMYW5ndWFnZXMoKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb29rcyB1cCBhIGxhbmd1YWdlIGJ5IG5hbWUgb3IgYWxpYXMuXHJcbiAgICogQHBhcmFtIG5hbWUgTGFuZ3VhZ2UgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGxhbmd1YWdlIG9iamVjdCBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBnZXRMYW5ndWFnZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlci5yZWFkeS5waXBlKFxyXG4gICAgICBtYXAoKGhsanM6IEhpZ2hsaWdodExpYnJhcnkpID0+IGhsanMuZ2V0TGFuZ3VhZ2UobmFtZSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBzYWZlIG1vZGUuIFRoaXMgaXMgdGhlIGRlZmF1bHQgbW9kZSwgcHJvdmlkaW5nIHRoZSBtb3N0IHJlbGlhYmxlIGV4cGVyaWVuY2UgZm9yIHByb2R1Y3Rpb24gdXNhZ2UuXHJcbiAgICovXHJcbiAgc2FmZU1vZGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9sb2FkZXIucmVhZHkucGlwZShcclxuICAgICAgbWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiBobGpzLnNhZmVNb2RlKCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBkZWJ1Zy9kZXZlbG9wbWVudCBtb2RlLlxyXG4gICAqL1xyXG4gIGRlYnVnTW9kZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlci5yZWFkeS5waXBlKFxyXG4gICAgICBtYXAoKGhsanM6IEhpZ2hsaWdodExpYnJhcnkpID0+IGhsanMuZGVidWdNb2RlKCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheSBsaW5lIG51bWJlcnNcclxuICAgKiBAcGFyYW0gZWwgQ29kZSBlbGVtZW50XHJcbiAgICovXHJcbiAgbGluZU51bWJlcnNCbG9jayhlbDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlci5yZWFkeS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKGhsanM6IEhpZ2hsaWdodExpYnJhcnkpID0+ICEhaGxqcy5saW5lTnVtYmVyc0Jsb2NrKSxcclxuICAgICAgdGFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiBobGpzLmxpbmVOdW1iZXJzQmxvY2soZWwpKVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19