UNPKG

styled-string-builder

Version:

String Styler class based on a builder design pattern

175 lines (173 loc) 36.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StyledString = void 0; exports.style = style; const constants_1 = require("./constants.cjs"); const colors_1 = require("./colors.cjs"); /** * @class StyledString * @description A class that extends string functionality with ANSI color and style options. * @summary StyledString provides methods to apply various ANSI color and style options to text strings. * It implements the ColorizeOptions interface and proxies native string methods to the underlying text. * This class allows for chaining of styling methods and easy application of colors and styles to text. * * @implements {ColorizeOptions} * @param {string} text - The initial text string to be styled. */ class StyledString { constructor(text) { this.text = text; // Basic colors Object.entries(constants_1.StandardForegroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.foreground(code), }); }); Object.entries(constants_1.BrightForegroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.foreground(code), }); }); // Background colors Object.entries(constants_1.StandardBackgroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.background(code), }); }); Object.entries(constants_1.BrightBackgroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.background(code), }); }); // Styles Object.entries(constants_1.styles).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.style(code), }); }); } /** * @description Clears all styling from the text. * @summary Removes all ANSI color and style codes from the text. * @return {StyledString} The StyledString instance with cleared styling. */ clear() { this.text = (0, colors_1.clear)(this.text); return this; } /** * @description Applies raw ANSI codes to the text. * @summary Allows direct application of ANSI escape sequences to the text. * @param {string} rawAnsi - The raw ANSI escape sequence to apply. * @return {StyledString} The StyledString instance with the raw ANSI code applied. */ raw(rawAnsi) { this.text = (0, colors_1.raw)(this.text, rawAnsi); return this; } /** * @description Applies a foreground color to the text. * @summary Sets the text color using ANSI color codes. * @param {number} n - The ANSI color code for the foreground color. * @return {StyledString} The StyledString instance with the foreground color applied. */ foreground(n) { this.text = (0, colors_1.colorizeANSI)(this.text, n); return this; } /** * @description Applies a background color to the text. * @summary Sets the background color of the text using ANSI color codes. * @param {number} n - The ANSI color code for the background color. * @return {StyledString} The StyledString instance with the background color applied. */ background(n) { this.text = (0, colors_1.colorizeANSI)(this.text, n, true); return this; } /** * @description Applies a text style to the string. * @summary Sets text styles such as bold, italic, or underline using ANSI style codes. * @param {number | string} n - The style code or key from the styles object. * @return {StyledString} The StyledString instance with the style applied. */ style(n) { if (typeof n === "string" && !(n in constants_1.styles)) { console.warn(`Invalid style: ${n}`); return this; } this.text = (0, colors_1.applyStyle)(this.text, n); return this; } /** * @description Applies a 256-color foreground color to the text. * @summary Sets the text color using the extended 256-color palette. * @param {number} n - The color number from the 256-color palette. * @return {StyledString} The StyledString instance with the 256-color foreground applied. */ color256(n) { this.text = (0, colors_1.colorize256)(this.text, n); return this; } /** * @description Applies a 256-color background color to the text. * @summary Sets the background color using the extended 256-color palette. * @param {number} n - The color number from the 256-color palette. * @return {StyledString} The StyledString instance with the 256-color background applied. */ bgColor256(n) { this.text = (0, colors_1.colorize256)(this.text, n, true); return this; } /** * @description Applies an RGB foreground color to the text. * @summary Sets the text color using RGB values. * @param {number} r - The red component (0-255). * @param {number} g - The green component (0-255). * @param {number} b - The blue component (0-255). * @return {StyledString} The StyledString instance with the RGB foreground color applied. */ rgb(r, g, b) { this.text = (0, colors_1.colorizeRGB)(this.text, r, g, b); return this; } /** * @description Applies an RGB background color to the text. * @summary Sets the background color using RGB values. * @param {number} r - The red component (0-255). * @param {number} g - The green component (0-255). * @param {number} b - The blue component (0-255). * @return {StyledString} The StyledString instance with the RGB background color applied. */ bgRgb(r, g, b) { this.text = (0, colors_1.colorizeRGB)(this.text, r, g, b, true); return this; } /** * @description Converts the StyledString to a regular string. * @summary Returns the underlying text with all applied styling. * @return {string} The styled text as a regular string. */ toString() { return this.text; } } exports.StyledString = StyledString; /** * @description Applies styling to a given text string. * @summary This function takes a string and returns a StyledString object, which is an enhanced * version of the original string with additional methods for applying various ANSI color and style * options. It sets up a mapper object with methods for different styling operations and then * defines properties on the text string to make these methods accessible. * * @param {string[]} t The input text to be styled. * @return {StyledString} A StyledString object with additional styling methods. * * @function style * * @memberOf StyledString */ function style(...t) { return new StyledString(t.join(" ")); } //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUEsb0JBQVcsRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQW5jRCxvQ0FtY0M7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsS0FBSyxDQUFDLEdBQUcsQ0FBVztJQUNsQyxPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwiZmlsZSI6InN0cmluZ3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCcmlnaHRCYWNrZ3JvdW5kQ29sb3JzLFxuICBCcmlnaHRGb3JlZ3JvdW5kQ29sb3JzLFxuICBTdGFuZGFyZEJhY2tncm91bmRDb2xvcnMsXG4gIFN0YW5kYXJkRm9yZWdyb3VuZENvbG9ycyxcbiAgc3R5bGVzLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGNsZWFyLFxuICBjb2xvcml6ZTI1NixcbiAgY29sb3JpemVBTlNJLFxuICBjb2xvcml6ZVJHQixcbiAgcmF3LFxuICBhcHBseVN0eWxlLFxufSBmcm9tIFwiLi9jb2xvcnNcIjtcblxuLyoqXG4gKiBAdHlwZWRlZiBDb2xvcml6ZU9wdGlvbnNcbiAqIEBkZXNjcmlwdGlvbiBPcHRpb25zIGZvciB0ZXh0IGNvbG9yaXphdGlvbiB1c2luZyBBTlNJIGNvZGVzLlxuICogQHN1bW1hcnkgVGhpcyB0eXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBjb2xvcml6ZSBmdW5jdGlvbi5cbiAqIEl0IGluY2x1ZGVzIG1ldGhvZHMgZm9yIGFwcGx5aW5nIHZhcmlvdXMgY29sb3IgYW5kIHN0eWxlIG9wdGlvbnMgdG8gdGV4dCB1c2luZyBBTlNJIGVzY2FwZSBjb2Rlcy5cbiAqXG4gKiBAcHJvcGVydHkge1N0eWxlZFN0cmluZ30gU3RhbmRhcmRGb3JlZ3JvdW5kQ29sb3JzIEdldHRlciBmb3IgZWFjaCBzdGFuZGFyZCBmb3JlZ3JvdW5kIGNvbG9yLlxuICogQHByb3BlcnR5IHtTdHlsZWRTdHJpbmd9IEJyaWdodEZvcmVncm91bmRDb2xvcnMgR2V0dGVyIGZvciBlYWNoIGJyaWdodCBmb3JlZ3JvdW5kIGNvbG9yLlxuICogQHByb3BlcnR5IHtTdHlsZWRTdHJpbmd9IFN0YW5kYXJkQmFja2dyb3VuZENvbG9ycyBHZXR0ZXIgZm9yIGVhY2ggc3RhbmRhcmQgYmFja2dyb3VuZCBjb2xvci5cbiAqIEBwcm9wZXJ0eSB7U3R5bGVkU3RyaW5nfSBCcmlnaHRCYWNrZ3JvdW5kQ29sb3JzIEdldHRlciBmb3IgZWFjaCBicmlnaHQgYmFja2dyb3VuZCBjb2xvci5cbiAqIEBwcm9wZXJ0eSB7U3R5bGVkU3RyaW5nfSBzdHlsZXMgR2V0dGVyIGZvciBlYWNoIHRleHQgc3R5bGUuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKCk6IFN0eWxlZFN0cmluZ30gY2xlYXIgUmVtb3ZlcyBhbGwgc3R5bGluZyBmcm9tIHRoZSB0ZXh0LlxuICogQHByb3BlcnR5IHtmdW5jdGlvbihzdHJpbmcpOiBTdHlsZWRTdHJpbmd9IHJhdyBBcHBsaWVzIHJhdyBBTlNJIGNvZGVzIHRvIHRoZSB0ZXh0LlxuICogQHByb3BlcnR5IHtmdW5jdGlvbihudW1iZXIpOiBTdHlsZWRTdHJpbmd9IGZvcmVncm91bmQgQXBwbGllcyBhIGZvcmVncm91bmQgY29sb3IgdXNpbmcgQU5TSSBjb2Rlcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24obnVtYmVyKTogU3R5bGVkU3RyaW5nfSBiYWNrZ3JvdW5kIEFwcGxpZXMgYSBiYWNrZ3JvdW5kIGNvbG9yIHVzaW5nIEFOU0kgY29kZXMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHN0cmluZyk6IFN0eWxlZFN0cmluZ30gc3R5bGUgQXBwbGllcyBhIHRleHQgc3R5bGUgdXNpbmcgQU5TSSBjb2Rlcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24obnVtYmVyKTogU3R5bGVkU3RyaW5nfSBjb2xvcjI1NiBBcHBsaWVzIGEgMjU2LWNvbG9yIGZvcmVncm91bmQgY29sb3IuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKG51bWJlcik6IFN0eWxlZFN0cmluZ30gYmdDb2xvcjI1NiBBcHBsaWVzIGEgMjU2LWNvbG9yIGJhY2tncm91bmQgY29sb3IuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKG51bWJlciwgbnVtYmVyLCBudW1iZXIpOiBTdHlsZWRTdHJpbmd9IHJnYiBBcHBsaWVzIGFuIFJHQiBmb3JlZ3JvdW5kIGNvbG9yLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbihudW1iZXIsIG51bWJlciwgbnVtYmVyKTogU3R5bGVkU3RyaW5nfSBiZ1JnYiBBcHBsaWVzIGFuIFJHQiBiYWNrZ3JvdW5kIGNvbG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRleHQgVGhlIHVuZGVybHlpbmcgdGV4dCBjb250ZW50LlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6U3R5bGVkU3RyaW5nXG4gKi9cbmV4cG9ydCB0eXBlIENvbG9yaXplT3B0aW9ucyA9IHtcbiAgW2sgaW4ga2V5b2YgdHlwZW9mIFN0YW5kYXJkRm9yZWdyb3VuZENvbG9yc106IFN0eWxlZFN0cmluZztcbn0gJiB7IFtrIGluIGtleW9mIHR5cGVvZiBCcmlnaHRGb3JlZ3JvdW5kQ29sb3JzXTogU3R5bGVkU3RyaW5nIH0gJiB7XG4gIFtrIGluIGtleW9mIHR5cGVvZiBTdGFuZGFyZEJhY2tncm91bmRDb2xvcnNdOiBTdHlsZWRTdHJpbmc7XG59ICYgeyBbayBpbiBrZXlvZiB0eXBlb2YgQnJpZ2h0QmFja2dyb3VuZENvbG9yc106IFN0eWxlZFN0cmluZyB9ICYge1xuICBbayBpbiBrZXlvZiB0eXBlb2Ygc3R5bGVzXTogU3R5bGVkU3RyaW5nO1xufSAmIHtcbiAgY2xlYXI6ICgpID0+IFN0eWxlZFN0cmluZztcbiAgcmF3OiAocmF3OiBzdHJpbmcpID0+IFN0eWxlZFN0cmluZztcbiAgZm9yZWdyb3VuZDogKG46IG51bWJlcikgPT4gU3R5bGVkU3RyaW5nO1xuICBiYWNrZ3JvdW5kOiAobjogbnVtYmVyKSA9PiBTdHlsZWRTdHJpbmc7XG4gIHN0eWxlOiAobjogbnVtYmVyIHwga2V5b2YgdHlwZW9mIHN0eWxlcykgPT4gU3R5bGVkU3RyaW5nO1xuICBjb2xvcjI1NjogKG46IG51bWJlcikgPT4gU3R5bGVkU3RyaW5nO1xuICBiZ0NvbG9yMjU2OiAobjogbnVtYmVyKSA9PiBTdHlsZWRTdHJpbmc7XG4gIHJnYjogKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpID0+IFN0eWxlZFN0cmluZztcbiAgYmdSZ2I6IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKSA9PiBTdHlsZWRTdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbn07XG5cbi8qKlxuICogQGNsYXNzIFN0eWxlZFN0cmluZ1xuICogQGRlc2NyaXB0aW9uIEEgY2xhc3MgdGhhdCBleHRlbmRzIHN0cmluZyBmdW5jdGlvbmFsaXR5IHdpdGggQU5TSSBjb2xvciBhbmQgc3R5bGUgb3B0aW9ucy5cbiAqIEBzdW1tYXJ5IFN0eWxlZFN0cmluZyBwcm92aWRlcyBtZXRob2RzIHRvIGFwcGx5IHZhcmlvdXMgQU5TSSBjb2xvciBhbmQgc3R5bGUgb3B0aW9ucyB0byB0ZXh0IHN0cmluZ3MuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBDb2xvcml6ZU9wdGlvbnMgaW50ZXJmYWNlIGFuZCBwcm94aWVzIG5hdGl2ZSBzdHJpbmcgbWV0aG9kcyB0byB0aGUgdW5kZXJseWluZyB0ZXh0LlxuICogVGhpcyBjbGFzcyBhbGxvd3MgZm9yIGNoYWluaW5nIG9mIHN0eWxpbmcgbWV0aG9kcyBhbmQgZWFzeSBhcHBsaWNhdGlvbiBvZiBjb2xvcnMgYW5kIHN0eWxlcyB0byB0ZXh0LlxuICogXG4gKiBAaW1wbGVtZW50cyB7Q29sb3JpemVPcHRpb25zfVxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5pdGlhbCB0ZXh0IHN0cmluZyB0byBiZSBzdHlsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZWRTdHJpbmcgaW1wbGVtZW50cyBDb2xvcml6ZU9wdGlvbnMge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYmxhY2sgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYmxhY2sgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIGJsYWNrITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyByZWQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggcmVkIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICByZWQhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGdyZWVuIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGdyZWVuIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBncmVlbiE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgeWVsbG93IGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHllbGxvdyBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgeWVsbG93ITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBibHVlIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJsdWUgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIGJsdWUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIG1hZ2VudGEgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggbWFnZW50YSBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgbWFnZW50YSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgY3lhbiBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBjeWFuIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBjeWFuITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB3aGl0ZSBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCB3aGl0ZSBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgd2hpdGUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBibGFjayAoZ3JheSkgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IGJsYWNrIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBicmlnaHRCbGFjayE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IHJlZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgcmVkIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBicmlnaHRSZWQhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBncmVlbiBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgZ3JlZW4gZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIGJyaWdodEdyZWVuITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgeWVsbG93IGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCB5ZWxsb3cgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIGJyaWdodFllbGxvdyE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IGJsdWUgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IGJsdWUgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIGJyaWdodEJsdWUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBtYWdlbnRhIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCBtYWdlbnRhIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBicmlnaHRNYWdlbnRhITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgY3lhbiBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgY3lhbiBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYnJpZ2h0Q3lhbiE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IHdoaXRlIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCB3aGl0ZSBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYnJpZ2h0V2hpdGUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJsYWNrIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYmxhY2sgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnQmxhY2shOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHJlZCBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHJlZCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdSZWQhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGdyZWVuIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggZ3JlZW4gYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnR3JlZW4hOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHllbGxvdyBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHllbGxvdyBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdZZWxsb3chOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJsdWUgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBibHVlIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0JsdWUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIG1hZ2VudGEgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBtYWdlbnRhIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ01hZ2VudGEhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGN5YW4gYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBjeWFuIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0N5YW4hOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHdoaXRlIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggd2hpdGUgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnV2hpdGUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBibGFjayAoZ3JheSkgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgYmxhY2sgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnQnJpZ2h0QmxhY2shOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCByZWQgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgcmVkIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0JyaWdodFJlZCE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IGdyZWVuIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IGdyZWVuIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0JyaWdodEdyZWVuITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgeWVsbG93IGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IHllbGxvdyBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdCcmlnaHRZZWxsb3chOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBibHVlIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IGJsdWUgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnQnJpZ2h0Qmx1ZSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IG1hZ2VudGEgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgbWFnZW50YSBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdCcmlnaHRNYWdlbnRhITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgY3lhbiBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCBjeWFuIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0JyaWdodEN5YW4hOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCB3aGl0ZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCB3aGl0ZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdCcmlnaHRXaGl0ZSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc2V0cyBhbGwgc3R5bGluZyBhcHBsaWVkIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGFsbCBzdHlsaW5nIHJlc2V0LlxuICAgKi9cbiAgcmVzZXQhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJvbGQgc3R5bGUgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYm9sZCBzdHlsZS5cbiAgICovXG4gIGJvbGQhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGRpbSAoZGVjcmVhc2VkIGludGVuc2l0eSkgc3R5bGUgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggZGltIHN0eWxlLlxuICAgKi9cbiAgZGltITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBpdGFsaWMgc3R5bGUgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggaXRhbGljIHN0eWxlLlxuICAgKi9cbiAgaXRhbGljITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB1bmRlcmxpbmUgc3R5bGUgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggdW5kZXJsaW5lIHN0eWxlLlxuICAgKi9cbiAgdW5kZXJsaW5lITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBibGlua2luZyBzdHlsZSB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBibGlua2luZyBzdHlsZS5cbiAgICovXG4gIGJsaW5rITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW52ZXJ0cyB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgb2YgdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggaW52ZXJ0ZWQgY29sb3JzLlxuICAgKi9cbiAgaW52ZXJzZSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhpZGVzIHRoZSB0ZXh0IChzYW1lIGNvbG9yIGFzIGJhY2tncm91bmQpLlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGhpZGRlbiB0ZXh0LlxuICAgKi9cbiAgaGlkZGVuITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBzdHJpa2V0aHJvdWdoIHN0eWxlIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHN0cmlrZXRocm91Z2ggc3R5bGUuXG4gICAqL1xuICBzdHJpa2V0aHJvdWdoITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBkb3VibGUgdW5kZXJsaW5lIHN0eWxlIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGRvdWJsZSB1bmRlcmxpbmUgc3R5bGUuXG4gICAqL1xuICBkb3VibGVVbmRlcmxpbmUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNldHMgdGhlIHRleHQgY29sb3IgdG8gbm9ybWFsIGludGVuc2l0eS5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBub3JtYWwgY29sb3IgaW50ZW5zaXR5LlxuICAgKi9cbiAgbm9ybWFsQ29sb3IhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGl0YWxpYyBvciBmcmFrdHVyIHN0eWxlIGZyb20gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggaXRhbGljIG9yIGZyYWt0dXIgc3R5bGUgcmVtb3ZlZC5cbiAgICovXG4gIG5vSXRhbGljT3JGcmFrdHVyITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyB1bmRlcmxpbmUgc3R5bGUgZnJvbSB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCB1bmRlcmxpbmUgc3R5bGUgcmVtb3ZlZC5cbiAgICovXG4gIG5vVW5kZXJsaW5lITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBibGlua2luZyBzdHlsZSBmcm9tIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJsaW5raW5nIHN0eWxlIHJlbW92ZWQuXG4gICAqL1xuICBub0JsaW5rITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBjb2xvciBpbnZlcnNpb24gZnJvbSB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBjb2xvciBpbnZlcnNpb24gcmVtb3ZlZC5cbiAgICovXG4gIG5vSW52ZXJzZSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgaGlkZGVuIHN0eWxlIGZyb20gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggaGlkZGVuIHN0eWxlIHJlbW92ZWQuXG4gICAqL1xuICBub0hpZGRlbiE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgc3RyaWtldGhyb3VnaCBzdHlsZSBmcm9tIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHN0cmlrZXRocm91Z2ggc3R5bGUgcmVtb3ZlZC5cbiAgICovXG4gIG5vU3RyaWtldGhyb3VnaCE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0ZXh0XG4gICAqIEBzdW1tYXJ5IFRoZSBzdHlsZWQgdGV4dCBhcyBhIHJlZ3VsYXIgc3RyaW5nLlxuICAgKi9cbiAgdGV4dCE6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIC8vIEJhc2ljIGNvbG9yc1xuICAgIE9iamVjdC5lbnRyaWVzKFN0YW5kYXJkRm9yZWdyb3VuZENvbG9ycykuZm9yRWFjaCgoW25hbWUsIGNvZGVdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwge1xuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuZm9yZWdyb3VuZChjb2RlKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoQnJpZ2h0Rm9yZWdyb3VuZENvbG9ycykuZm9yRWFjaCgoW25hbWUsIGNvZGVdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwge1xuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuZm9yZWdyb3VuZChjb2RlKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQmFja2dyb3VuZCBjb2xvcnNcbiAgICBPYmplY3QuZW50cmllcyhTdGFuZGFyZEJhY2tncm91bmRDb2xvcnMpLmZvckVhY2goKFtuYW1lLCBjb2RlXSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLmJhY2tncm91bmQoY29kZSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5lbnRyaWVzKEJyaWdodEJhY2tncm91bmRDb2xvcnMpLmZvckVhY2goKFtuYW1lLCBjb2RlXSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLmJhY2tncm91bmQoY29kZSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFN0eWxlc1xuICAgIE9iamVjdC5lbnRyaWVzKHN0eWxlcykuZm9yRWFjaCgoW25hbWUsIGNvZGVdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwge1xuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuc3R5bGUoY29kZSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCBzdHlsaW5nIGZyb20gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYWxsIEFOU0kgY29sb3IgYW5kIHN0eWxlIGNvZGVzIGZyb20gdGhlIHRleHQuXG4gICAqIEByZXR1cm4ge1N0eWxlZFN0cmluZ30gVGhlIFN0eWxlZFN0cmluZyBpbnN0YW5jZSB3aXRoIGNsZWFyZWQgc3R5bGluZy5cbiAgICovXG4gIGNsZWFyKCk6IFN0eWxlZFN0cmluZyB7XG4gICAgdGhpcy50ZXh0ID0gY2xlYXIodGhpcy50ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyByYXcgQU5TSSBjb2RlcyB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgQWxsb3dzIGRpcmVjdCBhcHBsaWNhdGlvbiBvZiBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgdG8gdGhlIHRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBbnNpIC0gVGhlIHJhdyBBTlNJIGVzY2FwZSBzZXF1ZW5jZSB0byBhcHBseS5cbiAgICogQHJldHVybiB7U3R5bGVkU3RyaW5nfSBUaGUgU3R5bGVkU3RyaW5nIGluc3RhbmNlIHdpdGggdGhlIHJhdyBBTlNJIGNvZGUgYXBwbGllZC5cbiAgICovXG4gIHJhdyhyYXdBbnNpOiBzdHJpbmcpOiBTdHlsZWRTdHJpbmcge1xuICAgIHRoaXMudGV4dCA9IHJhdyh0aGlzLnRleHQsIHJhd0Fuc2kpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgZm9yZWdyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgdGV4dCBjb2xvciB1c2luZyBBTlNJIGNvbG9yIGNvZGVzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbiAtIFRoZSBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKiBAcmV0dXJuIHtTdHlsZWRTdHJpbmd9IFRoZSBTdHlsZWRTdHJpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgZm9yZWdyb3VuZCBjb2xvciBhcHBsaWVkLlxuICAgKi9cbiAgZm9yZWdyb3VuZChuOiBudW1iZXIpOiBTdHlsZWRTdHJpbmcge1xuICAgIHRoaXMudGV4dCA9IGNvbG9yaXplQU5TSSh0aGlzLnRleHQsIG4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgdGV4dCB1c2luZyBBTlNJIGNvbG9yIGNvZGVzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbiAtIFRoZSBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKiBAcmV0dXJuIHtTdHlsZWRTdHJpbmd9IFRoZSBTdHlsZWRTdHJpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBhcHBsaWVkLlxuICAgKi9cbiAgYmFja2dyb3VuZChuOiBudW1iZXIpOiBTdHlsZWRTdHJpbmcge1xuICAgIHRoaXMudGV4dCA9IGNvbG9yaXplQU5TSSh0aGlzLnRleHQsIG4sIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgdGV4dCBzdHlsZSB0byB0aGUgc3RyaW5nLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRleHQgc3R5bGVzIHN1Y2ggYXMgYm9sZCwgaXRhbGljLCBvciB1bmRlcmxpbmUgdXNpbmcgQU5TSSBzdHlsZSBjb2Rlcy5cbiAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IG4gLSBUaGUgc3R5bGUgY29kZSBvciBrZXkgZnJvbSB0aGUgc3R5bGVzIG9iamVjdC5cbiAgICogQHJldHVybiB7U3R5bGVkU3RyaW5nfSBUaGUgU3R5bGVkU3RyaW5nIGluc3RhbmNlIHdpdGggdGhlIHN0eWxlIGFwcGxpZWQuXG4gICAqL1xuICBzdHlsZShuOiBudW1iZXIgfCBrZXlvZiB0eXBlb2Ygc3R5bGVzKTogU3R5bGVkU3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIG4gPT09IFwic3RyaW5nXCIgJiYgIShuIGluIHN0eWxlcykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgSW52YWxpZCBzdHlsZTogJHtufWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMudGV4dCA9IGFwcGx5U3R5bGUodGhpcy50ZXh0LCBuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIDI1Ni1jb2xvciBmb3JlZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSB0ZXh0IGNvbG9yIHVzaW5nIHRoZSBleHRlbmRlZCAyNTYtY29sb3IgcGFsZXR0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gLSBUaGUgY29sb3IgbnVtYmVyIGZyb20gdGhlIDI1Ni1jb2xvciBwYWxldHRlLlxuICAgKiBAcmV0dXJuIHtTdHlsZWRTdHJpbmd9IFRoZSBTdHlsZWRTdHJpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgMjU2LWNvbG9yIGZvcmVncm91bmQgYXBwbGllZC5cbiAgICovXG4gIGNvbG9yMjU2KG46IG51bWJlcik6IFN0eWxlZFN0cmluZyB7XG4gICAgdGhpcy50ZXh0ID0gY29sb3JpemUyNTYodGhpcy50ZXh0LCBuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIDI1Ni1jb2xvciBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzaW5nIHRoZSBleHRlbmRlZCAyNTYtY29sb3IgcGFsZXR0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gLSBUaGUgY29sb3IgbnVtYmVyIGZyb20gdGhlIDI1Ni1jb2xvciBwYWxldHRlLlxuICAgKiBAcmV0dXJuIHtTdHlsZWRTdHJpbmd9IFRoZSBTdHlsZWRTdHJpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgMjU2LWNvbG9yIGJhY2tncm91bmQgYXBwbGllZC5cbiAgICovXG4gIGJnQ29sb3IyNTYobjogbnVtYmVyKTogU3R5bGVkU3RyaW5nIHtcbiAgICB0aGlzLnRleHQgPSBjb2xvcml6ZTI1Nih0aGlzLnRleHQsIG4sIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGFuIFJHQiBmb3JlZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSB0ZXh0IGNvbG9yIHVzaW5nIFJHQiB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByIC0gVGhlIHJlZCBjb21wb25lbnQgKDAtMjU1KS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGcgLSBUaGUgZ3JlZW4gY29tcG9uZW50ICgwLTI1NSkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIGJsdWUgY29tcG9uZW50ICgwLTI1NSkuXG4gICAqIEByZXR1cm4ge1N0eWxlZFN0cmluZ30gVGhlIFN0eWxlZFN0cmluZyBpbnN0YW5jZSB3aXRoIHRoZSBSR0IgZm9yZWdyb3VuZCBjb2xvciBhcHBsaWVkLlxuICAgKi9cbiAgcmdiKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBTdHlsZWRTdHJpbmcge1xuICAgIHRoaXMudGV4dCA9IGNvbG9yaXplUkdCKHRoaXMudGV4dCwgciwgZywgYik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYW4gUkdCIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGJhY2tncm91bmQgY29sb3IgdXNpbmcgUkdCIHZhbHVlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHIgLSBUaGUgcmVkIGNvbXBvbmVudCAoMC0yNTUpLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZyAtIFRoZSBncmVlbiBjb21wb25lbnQgKDAtMjU1KS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGIgLSBUaGUgYmx1ZSBjb21wb25lbnQgKDAtMjU1KS5cbiAgICogQHJldHVybiB7U3R5bGVkU3RyaW5nfSBUaGUgU3R5bGVkU3RyaW5nIGluc3RhbmNlIHdpdGggdGhlIFJHQiBiYWNrZ3JvdW5kIGNvbG9yIGFwcGxpZWQuXG4gICAqL1xuICBiZ1JnYihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogU3R5bGVkU3RyaW5nIHtcbiAgICB0aGlzLnRleHQgPSBjb2xvcml6ZVJHQih0aGlzLnRleHQsIHIsIGcsIGIsIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgU3R5bGVkU3RyaW5nIHRvIGEgcmVndWxhciBzdHJpbmcuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHVuZGVybHlpbmcgdGV4dCB3aXRoIGFsbCBhcHBsaWVkIHN0eWxpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0eWxlZCB0ZXh0IGFzIGEgcmVndWxhciBzdHJpbmcuXG4gICAqL1xuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRleHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBzdHlsaW5nIHRvIGEgZ2l2ZW4gdGV4dCBzdHJpbmcuXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgU3R5bGVkU3RyaW5nIG9iamVjdCwgd2hpY2ggaXMgYW4gZW5oYW5jZWRcbiAqIHZlcnNpb24gb2YgdGhlIG9yaWdpbmFsIHN0cmluZyB3aXRoIGFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgYXBwbHlpbmcgdmFyaW91cyBBTlNJIGNvbG9yIGFuZCBzdHlsZVxuICogb3B0aW9ucy4gSXQgc2V0cyB1cCBhIG1hcHBlciBvYmplY3Qgd2l0aCBtZXRob2RzIGZvciBkaWZmZXJlbnQgc3R5bGluZyBvcGVyYXRpb25zIGFuZCB0aGVuXG4gKiBkZWZpbmVzIHByb3BlcnRpZXMgb24gdGhlIHRleHQgc3RyaW5nIHRvIG1ha2UgdGhlc2UgbWV0aG9kcyBhY2Nlc3NpYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHQgIFRoZSBpbnB1dCB0ZXh0IHRvIGJlIHN0eWxlZC5cbiAqIEByZXR1cm4ge1N0eWxlZFN0cmluZ30gQSBTdHlsZWRTdHJpbmcgb2JqZWN0IHdpdGggYWRkaXRpb25hbCBzdHlsaW5nIG1ldGhvZHMuXG4gKlxuICogQGZ1bmN0aW9uIHN0eWxlXG4gKlxuICogQG1lbWJlck9mIFN0eWxlZFN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3R5bGUoLi4udDogc3RyaW5nW10pOiBTdHlsZWRTdHJpbmcge1xuICByZXR1cm4gbmV3IFN0eWxlZFN0cmluZyh0LmpvaW4oXCIgXCIpKTtcbn0iXX0=