UNPKG

angular-odata

Version:

Client side OData typescript library for Angular

423 lines 57.5 kB
import { QueryOption } from '../../types'; import { Objects, Types } from '../../utils'; import { alias, normalizeValue, raw, duration, binary, } from './builder'; import { ComputeExpression, FilterExpression, OrderByExpression, SearchExpression, ExpandExpression, SelectExpression, ApplyExpression, } from './expressions'; import { pathAndParamsFromQueryOptions, } from './options'; export class ODataQueryOptionHandler { o; n; constructor(o, n) { this.o = o; this.n = n; } /** * The name of the managed odata query option. */ get name() { return this.n; } /** * Converts the managed odata query option to a json object. * @returns {any} */ toJson() { return this.o.get(this.n); } /** * Returns a boolean indicating if the managed odata query option is empty. * @returns True if the managed odata query option is empty. */ empty() { return Types.isEmpty(this.o.get(this.n)); } //#region Primitive Value /** * Get or Set the value of the managed odata query option. * @param v The value to set. * @returns */ value(v) { if (v !== undefined) this.o.set(this.n, v); return this.o.get(this.n); } //#endregion //#region Array Value assertArray() { if (!Types.isArray(this.o.get(this.n))) this.o.set(this.n, this.o.has(this.n) ? [this.o.get(this.n)] : []); return this.o.get(this.n); } /** * Push value to the managed odata query option. * @param value Value to push */ push(value) { this.assertArray().push(value); } /** * Remove value from the managed odata query option. * @param value Value to remove */ remove(value) { this.o.set(this.n, this.assertArray().filter((v) => v !== value)); // If only one and not is array... down to value if (this.o.get(this.n).length === 1 && !Types.isArray(this.o.get(this.n)[0])) this.o.set(this.n, this.o.get(this.n)[0]); } /** * Return value at index of the managed odata query option. * @param index Index of the value * @returns The value */ at(index) { return this.assertArray()[index]; } some(predicate) { return this.assertArray().some(predicate); } every(predicate) { return this.assertArray().every(predicate); } find(predicate) { return this.assertArray().find(predicate); } //#endregion //#region HashMap Value assertObject(create) { if (!Types.isArray(this.o.get(this.n)) && Types.isPlainObject(this.o.get(this.n))) { return this.o.get(this.n); } let arr = this.assertArray(); let obj = arr.find((v) => Types.isPlainObject(v)); if (!obj && create) { obj = {}; arr.push(obj); } return obj; } /** * Set the value for path in the managed odata query option. * @param path Path for set the value * @param value Value to set */ set(path, value) { let obj = this.assertObject(true); Objects.set(obj, path, value); } /** * Get the value for path from the managed odata query option. * @param path The path from get the value * @param def Default if not found * @returns */ get(path, def) { let obj = this.assertObject(false) || {}; return Objects.get(obj, path, def); } /** * Unset the value for path in the managed odata query option. * @param path */ unset(path) { let obj = this.assertObject(true); Objects.unset(obj, path); if (Types.isArray(this.o.get(this.n))) { this.o.set(this.n, this.o.get(this.n).filter((v) => !Types.isEmpty(v))); if (this.o.get(this.n).length === 1) this.o.set(this.n, this.o.get(this.n)[0]); } } /** * Test if the managed odata query option has the value. * @param path The path fot test if the value is set * @returns Boolean indicating if the value is set */ has(path) { let obj = this.assertObject(false) || {}; return Objects.has(obj, path); } /** * Merge values from object into the managed odata query option. * @param values Object to merge * @returns */ assign(values) { let obj = this.assertObject(true); return Objects.merge(obj, values); } //#endregion /** * Clear the managed odata query option. */ clear() { this.o.delete(this.n); } toString({ escape, parser, } = {}) { const [_, params] = pathAndParamsFromQueryOptions(new Map([[this.n, this.o.get(this.n)]]), { escape, parser }); return params[`$${this.n}`]; } } export class ODataQueryOptionsHandler { options; constructor(options) { this.options = options; } /** * Create a raw odata value * @param value The value to raw * @returns The raw value */ raw(value) { return raw(value); } /** * Create a new odata alias parameter * @link https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_ParameterAliases * @param value The value of the alias * @param name The name of the alias * @returns The alias */ alias(value, name) { return alias(value, name); } /** * Create a duration odata value * @param value The value to duration * @returns The duration value */ duration(value) { return duration(value); } /** * Create a binary odata value * @param value The value to binary * @returns The binary value */ binary(value) { return binary(value); } /** * Normalize the given value to a valid odata value * @param value The value to normalize * @returns The normalized value */ normalize(value) { return normalizeValue(value); } select(opts) { if (Types.isFunction(opts)) { return this.options.expression(QueryOption.select, SelectExpression.factory(opts, this.options.expression(QueryOption.select))); } return this.options.option(QueryOption.select, opts); } expand(opts) { if (Types.isFunction(opts)) { return this.options.expression(QueryOption.expand, ExpandExpression.factory(opts, this.options.expression(QueryOption.expand))); } return this.options.option(QueryOption.expand, opts); } compute(opts) { if (Types.isFunction(opts)) { return this.options.expression(QueryOption.compute, ComputeExpression.factory(opts, this.options.expression(QueryOption.compute))); } return this.options.option(QueryOption.compute, opts); } apply(opts) { if (Types.isFunction(opts)) { return this.options.expression(QueryOption.apply, ApplyExpression.factory(opts, this.options.expression(QueryOption.apply))); } return this.options.option(QueryOption.apply, opts); } format(opts) { return this.options.option(QueryOption.format, opts); } transform(opts) { return this.options.option(QueryOption.transform, opts); } search(opts) { if (Types.isFunction(opts)) { return this.options.expression(QueryOption.search, SearchExpression.factory(opts, this.options.expression(QueryOption.search))); } return this.options.option(QueryOption.search, opts); } filter(opts) { if (Types.isFunction(opts)) { return this.options.expression(QueryOption.filter, FilterExpression.factory(opts, this.options.expression(QueryOption.filter))); } return this.options.option(QueryOption.filter, opts); } orderBy(opts) { if (Types.isFunction(opts)) { return this.options.option(QueryOption.orderBy, OrderByExpression.factory(opts, this.options.expression(QueryOption.orderBy))); } return this.options.option(QueryOption.orderBy, opts); } top(opts) { return this.options.option(QueryOption.top, opts); } skip(opts) { return this.options.option(QueryOption.skip, opts); } skiptoken(opts) { return this.options.option(QueryOption.skiptoken, opts); } remove(...keys) { this.options.remove(...keys); } keep(...keys) { this.options.keep(...keys); } /** * Shortcut for set $top, $skip, $skiptoken. * @param param0 skip or top or skiptoken */ paging({ skip, skiptoken, top, } = {}) { if (skiptoken !== undefined) { if (skiptoken !== null) { this.skiptoken(skiptoken); } else { this.remove(QueryOption.skiptoken); } } if (skip !== undefined) { if (skip !== null) { this.skip(skip); } else { this.remove(QueryOption.skip); } } if (top !== undefined) { if (top !== null) { this.top(top); } else { this.remove(QueryOption.top); } } } /** * Shortcut for clear pagination by unset $top, $skip, $skiptoken. */ removePaging() { this.remove(QueryOption.skip, QueryOption.top, QueryOption.skiptoken); } /** * Shortcut for clear query. */ clear() { this.options.clear(); } /** * Store the query options from the current query. */ store() { return this.options.toQueryArguments(); } /** * Restore the given query options to the current query. * @param options The query to be applied. */ restore(options) { if (options.select !== undefined) { if (options.select instanceof SelectExpression) { this.options.expression(QueryOption.select, options.select); } else if (options.select !== null) { this.options.option(QueryOption.select, options.select); } else { this.options.remove(QueryOption.select); } } if (options.expand !== undefined) { if (options.expand instanceof ExpandExpression) { this.options.expression(QueryOption.expand, options.expand); } else if (options.expand !== null) { this.options.option(QueryOption.expand, options.expand); } else { this.options.remove(QueryOption.expand); } } if (options.compute !== undefined) { if (options.compute instanceof ComputeExpression) { this.options.expression(QueryOption.compute, options.compute); } else if (options.compute !== null) { this.options.option(QueryOption.compute, options.compute); } else { this.options.remove(QueryOption.compute); } } if (options.apply !== undefined) { if (options.apply instanceof ApplyExpression) { this.options.expression(QueryOption.apply, options.apply); } else if (options.apply !== null) { this.options.option(QueryOption.apply, options.apply); } else { this.options.remove(QueryOption.apply); } } if (options.transform !== undefined) { if (options.transform !== null) { this.options.option(QueryOption.transform, options.transform); } else { this.options.remove(QueryOption.transform); } } if (options.search !== undefined) { if (options.search instanceof SearchExpression) { this.options.expression(QueryOption.search, options.search); } else if (options.search !== null) { this.options.option(QueryOption.search, options.search); } else { this.options.remove(QueryOption.search); } } if (options.filter !== undefined) { if (options.filter instanceof FilterExpression) { this.options.expression(QueryOption.filter, options.filter); } else if (options.filter !== null) { this.options.option(QueryOption.filter, options.filter); } else { this.options.remove(QueryOption.filter); } } if (options.orderBy !== undefined) { if (options.orderBy instanceof OrderByExpression) { this.options.expression(QueryOption.orderBy, options.orderBy); } else if (options.orderBy !== null) { this.options.option(QueryOption.orderBy, options.orderBy); } else { this.options.remove(QueryOption.orderBy); } } this.paging(options); } toJson() { return this.options.toJson(); } fromJson(json) { this.options.fromJson(json); } toString({ escape, parser, } = {}) { return this.options.toString({ escape, parser }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3F1ZXJ5L2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBVSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUNMLEtBQUssRUFNTCxjQUFjLEVBQ2QsR0FBRyxFQUNILFFBQVEsRUFDUixNQUFNLEdBQ1AsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLGlCQUFpQixFQUVqQixnQkFBZ0IsRUFFaEIsaUJBQWlCLEVBRWpCLGdCQUFnQixFQUVoQixnQkFBZ0IsRUFFaEIsZ0JBQWdCLEVBRWhCLGVBQWUsR0FFaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLDZCQUE2QixHQUM5QixNQUFNLFdBQVcsQ0FBQztBQUVuQixNQUFNLE9BQU8sdUJBQXVCO0lBRXhCO0lBQ0E7SUFGVixZQUNVLENBQXdCLEVBQ3hCLENBQWM7UUFEZCxNQUFDLEdBQUQsQ0FBQyxDQUF1QjtRQUN4QixNQUFDLEdBQUQsQ0FBQyxDQUFhO0lBQ3JCLENBQUM7SUFFSjs7T0FFRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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V0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsUUFBUSxDQUFDLElBQTZCO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxRQUFRLENBQUMsRUFDUCxNQUFNLEVBQ04sTUFBTSxNQUNzQyxFQUFFO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hJztcbmltcG9ydCB7IFBhcnNlciwgUXVlcnlPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzLCBUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIGFsaWFzLFxuICBFeHBhbmQsXG4gIEZpbHRlcixcbiAgT3JkZXJCeSxcbiAgU2VsZWN0LFxuICBUcmFuc2Zvcm0sXG4gIG5vcm1hbGl6ZVZhbHVlLFxuICByYXcsXG4gIGR1cmF0aW9uLFxuICBiaW5hcnksXG59IGZyb20gJy4vYnVpbGRlcic7XG5pbXBvcnQge1xuICBDb21wdXRlRXhwcmVzc2lvbixcbiAgQ29tcHV0ZUV4cHJlc3Npb25CdWlsZGVyLFxuICBGaWx0ZXJFeHByZXNzaW9uLFxuICBGaWx0ZXJFeHByZXNzaW9uQnVpbGRlcixcbiAgT3JkZXJCeUV4cHJlc3Npb24sXG4gIE9yZGVyQnlFeHByZXNzaW9uQnVpbGRlcixcbiAgU2VhcmNoRXhwcmVzc2lvbixcbiAgU2VhcmNoRXhwcmVzc2lvbkJ1aWxkZXIsXG4gIEV4cGFuZEV4cHJlc3Npb24sXG4gIEV4cGFuZEV4cHJlc3Npb25CdWlsZGVyLFxuICBTZWxlY3RFeHByZXNzaW9uLFxuICBTZWxlY3RFeHByZXNzaW9uQnVpbGRlcixcbiAgQXBwbHlFeHByZXNzaW9uLFxuICBBcHBseUV4cHJlc3Npb25CdWlsZGVyLFxufSBmcm9tICcuL2V4cHJlc3Npb25zJztcbmltcG9ydCB7XG4gIE9EYXRhUXVlcnlBcmd1bWVudHMsXG4gIE9EYXRhUXVlcnlPcHRpb25zLFxuICBwYXRoQW5kUGFyYW1zRnJvbVF1ZXJ5T3B0aW9ucyxcbn0gZnJvbSAnLi9vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhUXVlcnlPcHRpb25IYW5kbGVyPFQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvOiBNYXA8UXVlcnlPcHRpb24sIGFueT4sXG4gICAgcHJpdmF0ZSBuOiBRdWVyeU9wdGlvbixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuYWdlZCBvZGF0YSBxdWVyeSBvcHRpb24uXG4gICAqL1xuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBtYW5hZ2VkIG9kYXRhIHF1ZXJ5IG9wdGlvbiB0byBhIGpzb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB0aGlzLm8uZ2V0KHRoaXMubik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgbWFuYWdlZCBvZGF0YSBxdWVyeSBvcHRpb24gaXMgZW1wdHkuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG1hbmFnZWQgb2RhdGEgcXVlcnkgb3B0aW9uIGlzIGVtcHR5LlxuICAgKi9cbiAgZW1wdHkoKSB7XG4gICAgcmV0dXJuIFR5cGVzLmlzRW1wdHkodGhpcy5vLmdldCh0aGlzLm4pKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBQcmltaXRpdmUgVmFsdWVcbiAgLyoqXG4gICAqIEdldCBvciBTZXQgdGhlIHZhbHVlIG9mIHRoZSBtYW5hZ2VkIG9kYXRhIHF1ZXJ5IG9wdGlvbi5cbiAgICogQHBhcmFtIHYgVGhlIHZhbHVlIHRvIHNldC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHZhbHVlKHY/OiBhbnkpIHtcbiAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB0aGlzLm8uc2V0KHRoaXMubiwgdik7XG4gICAgcmV0dXJuIHRoaXMuby5nZXQodGhpcy5uKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gQXJyYXkgVmFsdWVcbiAgcHJpdmF0ZSBhc3NlcnRBcnJheSgpOiBhbnlbXSB7XG4gICAgaWYgKCFUeXBlcy5pc0FycmF5KHRoaXMuby5nZXQodGhpcy5uKSkpXG4gICAgICB0aGlzLm8uc2V0KHRoaXMubiwgdGhpcy5vLmhhcyh0aGlzLm4pID8gW3RoaXMuby5nZXQodGhpcy5uKV0gOiBbXSk7XG4gICAgcmV0dXJuIHRoaXMuby5nZXQodGhpcy5uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoIHZhbHVlIHRvIHRoZSBtYW5hZ2VkIG9kYXRhIHF1ZXJ5IG9wdGlvbi5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHB1c2hcbiAgICovXG4gIHB1c2godmFsdWU6IGFueSkge1xuICAgIHRoaXMuYXNzZXJ0QXJyYXkoKS5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdmFsdWUgZnJvbSB0aGUgbWFuYWdlZCBvZGF0YSBxdWVyeSBvcHRpb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5vLnNldChcbiAgICAgIHRoaXMubixcbiAgICAgIHRoaXMuYXNzZXJ0QXJyYXkoKS5maWx0ZXIoKHYpID0+IHYgIT09IHZhbHVlKSxcbiAgICApO1xuICAgIC8vIElmIG9ubHkgb25lIGFuZCBub3QgaXMgYXJyYXkuLi4gZG93biB0byB2YWx1ZVxuICAgIGlmIChcbiAgICAgIHRoaXMuby5nZXQodGhpcy5uKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICFUeXBlcy5pc0FycmF5KHRoaXMuby5nZXQodGhpcy5uKVswXSlcbiAgICApXG4gICAgICB0aGlzLm8uc2V0KHRoaXMubiwgdGhpcy5vLmdldCh0aGlzLm4pWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdmFsdWUgYXQgaW5kZXggb2YgdGhlIG1hbmFnZWQgb2RhdGEgcXVlcnkgb3B0aW9uLlxuICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIHZhbHVlXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZVxuICAgKi9cbiAgYXQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmFzc2VydEFycmF5KClbaW5kZXhdO1xuICB9XG5cbiAgc29tZShwcmVkaWNhdGU6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0QXJyYXkoKS5zb21lKHByZWRpY2F0ZSk7XG4gIH1cblxuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0QXJyYXkoKS5ldmVyeShwcmVkaWNhdGUpO1xuICB9XG5cbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0QXJyYXkoKS5maW5kKHByZWRpY2F0ZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEhhc2hNYXAgVmFsdWVcbiAgcHJpdmF0ZSBhc3NlcnRPYmplY3QoY3JlYXRlOiBib29sZWFuKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGlmIChcbiAgICAgICFUeXBlcy5pc0FycmF5KHRoaXMuby5nZXQodGhpcy5uKSkgJiZcbiAgICAgIFR5cGVzLmlzUGxhaW5PYmplY3QodGhpcy5vLmdldCh0aGlzLm4pKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuby5nZXQodGhpcy5uKTtcbiAgICB9XG4gICAgbGV0IGFyciA9IHRoaXMuYXNzZXJ0QXJyYXkoKTtcbiAgICBsZXQgb2JqID0gYXJyLmZpbmQoKHYpID0+IFR5cGVzLmlzUGxhaW5PYmplY3QodikpO1xuICAgIGlmICghb2JqICYmIGNyZWF0ZSkge1xuICAgICAgb2JqID0ge307XG4gICAgICBhcnIucHVzaChvYmopO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgZm9yIHBhdGggaW4gdGhlIG1hbmFnZWQgb2RhdGEgcXVlcnkgb3B0aW9uLlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIGZvciBzZXQgdGhlIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXRcbiAgICovXG4gIHNldChwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBsZXQgb2JqID0gdGhpcy5hc3NlcnRPYmplY3QodHJ1ZSk7XG4gICAgT2JqZWN0cy5zZXQob2JqLCBwYXRoLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBmb3IgcGF0aCBmcm9tIHRoZSBtYW5hZ2VkIG9kYXRhIHF1ZXJ5IG9wdGlvbi5cbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggZnJvbSBnZXQgdGhlIHZhbHVlXG4gICAqIEBwYXJhbSBkZWYgRGVmYXVsdCBpZiBub3QgZm91bmRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldChwYXRoOiBzdHJpbmcsIGRlZj86IGFueSk6IGFueSB7XG4gICAgbGV0IG9iaiA9IHRoaXMuYXNzZXJ0T2JqZWN0KGZhbHNlKSB8fCB7fTtcbiAgICByZXR1cm4gT2JqZWN0cy5nZXQob2JqLCBwYXRoLCBkZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc2V0IHRoZSB2YWx1ZSBmb3IgcGF0aCBpbiB0aGUgbWFuYWdlZCBvZGF0YSBxdWVyeSBvcHRpb24uXG4gICAqIEBwYXJhbSBwYXRoXG4gICAqL1xuICB1bnNldChwYXRoOiBzdHJpbmcpIHtcbiAgICBsZXQgb2JqID0gdGhpcy5hc3NlcnRPYmplY3QodHJ1ZSk7XG4gICAgT2JqZWN0cy51bnNldChvYmosIHBhdGgpO1xuXG4gICAgaWYgKFR5cGVzLmlzQXJyYXkodGhpcy5vLmdldCh0aGlzLm4pKSkge1xuICAgICAgdGhpcy5vLnNldChcbiAgICAgICAgdGhpcy5uLFxuICAgICAgICB0aGlzLm8uZ2V0KHRoaXMubikuZmlsdGVyKCh2OiBhbnkpID0+ICFUeXBlcy5pc0VtcHR5KHYpKSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5vLmdldCh0aGlzLm4pLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgdGhpcy5vLnNldCh0aGlzLm4sIHRoaXMuby5nZXQodGhpcy5uKVswXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgaWYgdGhlIG1hbmFnZWQgb2RhdGEgcXVlcnkgb3B0aW9uIGhhcyB0aGUgdmFsdWUuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIGZvdCB0ZXN0IGlmIHRoZSB2YWx1ZSBpcyBzZXRcbiAgICogQHJldHVybnMgQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB2YWx1ZSBpcyBzZXRcbiAgICovXG4gIGhhcyhwYXRoOiBzdHJpbmcpIHtcbiAgICBsZXQgb2JqID0gdGhpcy5hc3NlcnRPYmplY3QoZmFsc2UpIHx8IHt9O1xuICAgIHJldHVybiBPYmplY3RzLmhhcyhvYmosIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHZhbHVlcyBmcm9tIG9iamVjdCBpbnRvIHRoZSBtYW5hZ2VkIG9kYXRhIHF1ZXJ5IG9wdGlvbi5cbiAgICogQHBhcmFtIHZhbHVlcyBPYmplY3QgdG8gbWVyZ2VcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzc2lnbih2YWx1ZXM6IHsgW2F0dHI6IHN0cmluZ106IGFueSB9KSB7XG4gICAgbGV0IG9iaiA9IHRoaXMuYXNzZXJ0T2JqZWN0KHRydWUpO1xuICAgIHJldHVybiBPYmplY3RzLm1lcmdlKG9iaiwgdmFsdWVzKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIG1hbmFnZWQgb2RhdGEgcXVlcnkgb3B0aW9uLlxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5vLmRlbGV0ZSh0aGlzLm4pO1xuICB9XG4gIHRvU3RyaW5nKHtcbiAgICBlc2NhcGUsXG4gICAgcGFyc2VyLFxuICB9OiB7IGVzY2FwZT86IGJvb2xlYW47IHBhcnNlcj86IFBhcnNlcjxUPiB9ID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IFtfLCBwYXJhbXNdID0gcGF0aEFuZFBhcmFtc0Zyb21RdWVyeU9wdGlvbnMoXG4gICAgICBuZXcgTWFwPFF1ZXJ5T3B0aW9uLCBhbnk+KFtbdGhpcy5uLCB0aGlzLm8uZ2V0KHRoaXMubildXSksXG4gICAgICB7IGVzY2FwZSwgcGFyc2VyIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcGFyYW1zW2AkJHt0aGlzLm59YF07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBvcHRpb25zOiBPRGF0YVF1ZXJ5T3B0aW9uczxUPikge31cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmF3IG9kYXRhIHZhbHVlXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmF3XG4gICAqIEByZXR1cm5zIFRoZSByYXcgdmFsdWVcbiAgICovXG4gIHJhdyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHJhdyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG9kYXRhIGFsaWFzIHBhcmFtZXRlclxuICAgKiBAbGluayBodHRwczovL2RvY3Mub2FzaXMtb3Blbi5vcmcvb2RhdGEvb2RhdGEvdjQuMDEvb2RhdGEtdjQuMDEtcGFydDItdXJsLWNvbnZlbnRpb25zLmh0bWwjc2VjX1BhcmFtZXRlckFsaWFzZXNcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgYWxpYXNcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGFsaWFzXG4gICAqIEByZXR1cm5zIFRoZSBhbGlhc1xuICAgKi9cbiAgYWxpYXModmFsdWU6IGFueSwgbmFtZT86IHN0cmluZykge1xuICAgIHJldHVybiBhbGlhcyh2YWx1ZSwgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZHVyYXRpb24gb2RhdGEgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBkdXJhdGlvblxuICAgKiBAcmV0dXJucyBUaGUgZHVyYXRpb24gdmFsdWVcbiAgICovXG4gIGR1cmF0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gZHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJpbmFyeSBvZGF0YSB2YWx1ZVxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJpbmFyeVxuICAgKiBAcmV0dXJucyBUaGUgYmluYXJ5IHZhbHVlXG4gICAqL1xuICBiaW5hcnkodmFsdWU6IGFueSkge1xuICAgIHJldHVybiBiaW5hcnkodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gYSB2YWxpZCBvZGF0YSB2YWx1ZVxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCB2YWx1ZVxuICAgKi9cbiAgbm9ybWFsaXplKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuZCByZXR1cm4gYSBoYW5kbGVyIGZvciBtb2RpZnlpbmcgdGhlICRzZWxlY3Qgb3B0aW9uLlxuICAgKiBJZiBvcHRzIGlzIGdpdmVuIHRoZW4gc2V0IHRlIHZhbHVlIGFzIG5ldyB2YWx1ZSBmb3IgJHNlbGVjdC5cbiAgICogQHBhcmFtIG9wdHMgU2VsZWN0PFQ+IHZhbHVlIG9yIGJ1aWxkZXIgZnVuY3Rpb24gZm9yIFNlbGVjdEV4cHJlc3Npb248VD5cbiAgICovXG4gIHNlbGVjdChcbiAgICBvcHRzOiAoXG4gICAgICBidWlsZGVyOiBTZWxlY3RFeHByZXNzaW9uQnVpbGRlcjxUPixcbiAgICAgIGN1cnJlbnQ/OiBTZWxlY3RFeHByZXNzaW9uPFQ+LFxuICAgICkgPT4gU2VsZWN0RXhwcmVzc2lvbjxUPixcbiAgKTogU2VsZWN0RXhwcmVzc2lvbjxUPjtcbiAgc2VsZWN0KG9wdHM6IFNlbGVjdDxUPik6IE9EYXRhUXVlcnlPcHRpb25IYW5kbGVyPFQ+O1xuICBzZWxlY3QoKTogT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXI8VD47XG4gIHNlbGVjdChvcHRzPzogYW55KTogYW55IHtcbiAgICBpZiAoVHlwZXMuaXNGdW5jdGlvbihvcHRzKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHByZXNzaW9uKFxuICAgICAgICBRdWVyeU9wdGlvbi5zZWxlY3QsXG4gICAgICAgIFNlbGVjdEV4cHJlc3Npb24uZmFjdG9yeShcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5leHByZXNzaW9uKFF1ZXJ5T3B0aW9uLnNlbGVjdCksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9wdGlvbjxTZWxlY3Q8VD4+KFF1ZXJ5T3B0aW9uLnNlbGVjdCwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW5kIHJldHVybiBhIGhhbmRsZXIgZm9yIG1vZGlmeWluZyB0aGUgJGV4cGFuZCBvcHRpb24uXG4gICAqIElmIG9wdHMgaXMgZ2l2ZW4gdGhlbiBzZXQgdGUgdmFsdWUgYXMgbmV3IHZhbHVlIGZvciAkZXhwYW5kLlxuICAgKiBAcGFyYW0gb3B0cyBFeHBhbmQ8VD4gdmFsdWUgb3IgYnVpbGRlciBmdW5jdGlvbiBmb3IgRXhwYW5kRXhwcmVzc2lvbjxUPlxuICAgKi9cbiAgZXhwYW5kKFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IEV4cGFuZEV4cHJlc3Npb25CdWlsZGVyPFQ+LFxuICAgICAgY3VycmVudD86IEV4cGFuZEV4cHJlc3Npb248VD4sXG4gICAgKSA9PiBFeHBhbmRFeHByZXNzaW9uPFQ+LFxuICApOiBFeHBhbmRFeHByZXNzaW9uPFQ+O1xuICBleHBhbmQob3B0czogRXhwYW5kPFQ+KTogT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXI8VD47XG4gIGV4cGFuZCgpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgZXhwYW5kKG9wdHM/OiBhbnkpOiBhbnkge1xuICAgIGlmIChUeXBlcy5pc0Z1bmN0aW9uKG9wdHMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmV4cHJlc3Npb24oXG4gICAgICAgIFF1ZXJ5T3B0aW9uLmV4cGFuZCxcbiAgICAgICAgRXhwYW5kRXhwcmVzc2lvbi5mYWN0b3J5KFxuICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmV4cHJlc3Npb24oUXVlcnlPcHRpb24uZXhwYW5kKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMub3B0aW9uPEV4cGFuZDxUPj4oUXVlcnlPcHRpb24uZXhwYW5kLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbmQgcmV0dXJuIGEgaGFuZGxlciBmb3IgbW9kaWZ5aW5nIHRoZSAkY29tcHV0ZSBvcHRpb24uXG4gICAqIElmIG9wdHMgaXMgZ2l2ZW4gdGhlbiBzZXQgdGUgdmFsdWUgYXMgbmV3IHZhbHVlIGZvciAkY29tcHV0ZS5cbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL29kYXRhL29kYXRhL3Y0LjAxL29kYXRhLXY0LjAxLXBhcnQyLXVybC1jb252ZW50aW9ucy5odG1sI3NlY19TeXN0ZW1RdWVyeU9wdGlvbmNvbXB1dGVcbiAgICogQHBhcmFtIG9wdHMgc3RyaW5nIHZhbHVlIG9yIGJ1aWxkZXIgZnVuY3Rpb24gZm9yIENvbXB1dGVFeHByZXNzaW9uPFQ+XG4gICAqL1xuICBjb21wdXRlKFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IENvbXB1dGVFeHByZXNzaW9uQnVpbGRlcjxUPixcbiAgICAgIGN1cnJlbnQ/OiBDb21wdXRlRXhwcmVzc2lvbjxUPixcbiAgICApID0+IENvbXB1dGVFeHByZXNzaW9uPFQ+LFxuICApOiBDb21wdXRlRXhwcmVzc2lvbjxUPjtcbiAgY29tcHV0ZShvcHRzOiBzdHJpbmcpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgY29tcHV0ZSgpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgY29tcHV0ZShvcHRzPzogYW55KTogYW55IHtcbiAgICBpZiAoVHlwZXMuaXNGdW5jdGlvbihvcHRzKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHByZXNzaW9uKFxuICAgICAgICBRdWVyeU9wdGlvbi5jb21wdXRlLFxuICAgICAgICBDb21wdXRlRXhwcmVzc2lvbi5mYWN0b3J5KFxuICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmV4cHJlc3Npb24oUXVlcnlPcHRpb24uY29tcHV0ZSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9wdGlvbjxzdHJpbmc+KFF1ZXJ5T3B0aW9uLmNvbXB1dGUsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuZCByZXR1cm4gYSBoYW5kbGVyIGZvciBtb2RpZnlpbmcgdGhlICRhcHBseSBvcHRpb24uXG4gICAqIElmIG9wdHMgaXMgZ2l2ZW4gdGhlbiBzZXQgdGUgdmFsdWUgYXMgbmV3IHZhbHVlIGZvciAkY29tcHV0ZS5cbiAgICogQGxpbmsgaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvb2RhdGEvb2RhdGEtZGF0YS1hZ2dyZWdhdGlvbi1leHQvdjQuMC9jczAyL29kYXRhLWRhdGEtYWdncmVnYXRpb24tZXh0LXY0LjAtY3MwMi5odG1sXG4gICAqIEBwYXJhbSBvcHRzIHN0cmluZyB2YWx1ZSBvciBidWlsZGVyIGZ1bmN0aW9uIGZvciBBcHBseUV4cHJlc3Npb248VD5cbiAgICovXG4gIGFwcGx5KFxuICAgIG9wdHM6IChcbiAgICAgIGJ1aWxkZXI6IEFwcGx5RXhwcmVzc2lvbkJ1aWxkZXI8VD4sXG4gICAgICBjdXJyZW50PzogQXBwbHlFeHByZXNzaW9uPFQ+LFxuICAgICkgPT4gQXBwbHlFeHByZXNzaW9uPFQ+LFxuICApOiBBcHBseUV4cHJlc3Npb248VD47XG4gIGFwcGx5KG9wdHM6IHN0cmluZyk6IE9EYXRhUXVlcnlPcHRpb25IYW5kbGVyPFQ+O1xuICBhcHBseSgpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgYXBwbHkob3B0cz86IGFueSk6IGFueSB7XG4gICAgaWYgKFR5cGVzLmlzRnVuY3Rpb24ob3B0cykpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXhwcmVzc2lvbihcbiAgICAgICAgUXVlcnlPcHRpb24uYXBwbHksXG4gICAgICAgIEFwcGx5RXhwcmVzc2lvbi5mYWN0b3J5KFxuICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmV4cHJlc3Npb24oUXVlcnlPcHRpb24uYXBwbHkpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcHRpb248c3RyaW5nPihRdWVyeU9wdGlvbi5hcHBseSwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW5kIHJldHVybiBhIGhhbmRsZXIgZm9yIG1vZGlmeWluZyB0aGUgJGZvcm1hdCBvcHRpb24uXG4gICAqIElmIG9wdHMgaXMgZ2l2ZW4gdGhlbiBzZXQgdGUgdmFsdWUgYXMgbmV3IHZhbHVlIGZvciAkZm9ybWF0LlxuICAgKiBAbGluayBodHRwczovL2RvY3Mub2FzaXMtb3Blbi5vcmcvb2RhdGEvb2RhdGEvdjQuMDEvb2RhdGEtdjQuMDEtcGFydDItdXJsLWNvbnZlbnRpb25zLmh0bWwjc2VjX1N5c3RlbVF1ZXJ5T3B0aW9uZm9ybWF0XG4gICAqIEBwYXJhbSBvcHRzIHN0cmluZyB2YWx1ZSBmb3IgZm9ybWF0XG4gICAqL1xuICBmb3JtYXQob3B0czogc3RyaW5nKTogT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXI8VD47XG4gIGZvcm1hdCgpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgZm9ybWF0KG9wdHM/OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMub3B0aW9uPHN0cmluZz4oUXVlcnlPcHRpb24uZm9ybWF0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbmQgcmV0dXJuIGEgaGFuZGxlciBmb3IgbW9kaWZ5aW5nIHRoZSAkdHJhbnNmb3JtIG9wdGlvbi5cbiAgICogSWYgb3B0cyBpcyBnaXZlbiB0aGVuIHNldCB0ZSB2YWx1ZSBhcyBuZXcgdmFsdWUgZm9yICR0cmFuc2Zvcm0uXG4gICAqIEBwYXJhbSBvcHRzIHN0cmluZyB2YWx1ZSBmb3IgdHJhbnNmb3JtXG4gICAqL1xuICB0cmFuc2Zvcm0ob3B0czogVHJhbnNmb3JtPFQ+KTogT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXI8VD47XG4gIHRyYW5zZm9ybSgpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgdHJhbnNmb3JtKG9wdHM/OiBUcmFuc2Zvcm08VD4pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMub3B0aW9uPFRyYW5zZm9ybTxUPj4oUXVlcnlPcHRpb24udHJhbnNmb3JtLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbmQgcmV0dXJuIGEgaGFuZGxlciBmb3IgbW9kaWZ5aW5nIHRoZSAkc2VhcmNoIG9wdGlvbi5cbiAgICogSWYgb3B0cyBpcyBnaXZlbiB0aGVuIHNldCB0ZSB2YWx1ZSBhcyBuZXcgdmFsdWUgZm9yICRzZWFyY2guXG4gICAqIEBwYXJhbSBvcHRzIHN0cmluZyB2YWx1ZSBvciBidWlsZGVyIGZ1bmN0aW9uIGZvciBTZWFyY2hFeHByZXNzaW9uPFQ+XG4gICAqL1xuICBzZWFyY2goXG4gICAgb3B0czogKFxuICAgICAgYnVpbGRlcjogU2VhcmNoRXhwcmVzc2lvbkJ1aWxkZXI8VD4sXG4gICAgICBjdXJyZW50PzogU2VhcmNoRXhwcmVzc2lvbjxUPixcbiAgICApID0+IFNlYXJjaEV4cHJlc3Npb248VD4sXG4gICk6IFNlYXJjaEV4cHJlc3Npb248VD47XG4gIHNlYXJjaChvcHRzOiBzdHJpbmcpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgc2VhcmNoKCk6IE9EYXRhUXVlcnlPcHRpb25IYW5kbGVyPFQ+O1xuICBzZWFyY2gob3B0cz86IGFueSk6IGFueSB7XG4gICAgaWYgKFR5cGVzLmlzRnVuY3Rpb24ob3B0cykpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXhwcmVzc2lvbihcbiAgICAgICAgUXVlcnlPcHRpb24uc2VhcmNoLFxuICAgICAgICBTZWFyY2hFeHByZXNzaW9uLmZhY3RvcnkoXG4gICAgICAgICAgb3B0cyxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZXhwcmVzc2lvbihRdWVyeU9wdGlvbi5zZWFyY2gpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcHRpb248c3RyaW5nPihRdWVyeU9wdGlvbi5zZWFyY2gsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuZCByZXR1cm4gYSBoYW5kbGVyIGZvciBtb2RpZnlpbmcgdGhlICRmaWx0ZXIgb3B0aW9uLlxuICAgKiBJZiBvcHRzIGlzIGdpdmVuIHRoZW4gc2V0IHRlIHZhbHVlIGFzIG5ldyB2YWx1ZSBmb3IgJGZpbHRlci5cbiAgICogQHBhcmFtIG9wdHMgRmlsdGVyPFQ+IHZhbHVlIG9yIGJ1aWxkZXIgZnVuY3Rpb24gZm9yIEZpbHRlckV4cHJlc3Npb248VD5cbiAgICovXG4gIGZpbHRlcihcbiAgICBvcHRzOiAoXG4gICAgICBidWlsZGVyOiBGaWx0ZXJFeHByZXNzaW9uQnVpbGRlcjxUPixcbiAgICAgIGN1cnJlbnQ/OiBGaWx0ZXJFeHByZXNzaW9uPFQ+LFxuICAgICkgPT4gRmlsdGVyRXhwcmVzc2lvbjxUPixcbiAgKTogRmlsdGVyRXhwcmVzc2lvbjxUPjtcbiAgZmlsdGVyKG9wdHM6IEZpbHRlcjxUPik6IE9EYXRhUXVlcnlPcHRpb25IYW5kbGVyPFQ+O1xuICBmaWx0ZXIoKTogT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXI8VD47XG4gIGZpbHRlcihvcHRzPzogYW55KTogYW55IHtcbiAgICBpZiAoVHlwZXMuaXNGdW5jdGlvbihvcHRzKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHByZXNzaW9uKFxuICAgICAgICBRdWVyeU9wdGlvbi5maWx0ZXIsXG4gICAgICAgIEZpbHRlckV4cHJlc3Npb24uZmFjdG9yeShcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5leHByZXNzaW9uKFF1ZXJ5T3B0aW9uLmZpbHRlciksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9wdGlvbjxGaWx0ZXI8VD4+KFF1ZXJ5T3B0aW9uLmZpbHRlciwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW5kIHJldHVybiBhIGhhbmRsZXIgZm9yIG1vZGlmeWluZyB0aGUgJG9yZGVyYnkgb3B0aW9uLlxuICAgKiBJZiBvcHRzIGlzIGdpdmVuIHRoZW4gc2V0IHRlIHZhbHVlIGFzIG5ldyB2YWx1ZSBmb3IgJG9yZGVyYnkuXG4gICAqIEBwYXJhbSBvcHRzIE9yZGVyQnk8VD4gdmFsdWUgb3IgYnVpbGRlciBmdW5jdGlvbiBmb3IgT3JkZXJCeUV4cHJlc3Npb248VD5cbiAgICovXG4gIG9yZGVyQnkoXG4gICAgb3B0czogKFxuICAgICAgYnVpbGRlcjogT3JkZXJCeUV4cHJlc3Npb25CdWlsZGVyPFQ+LFxuICAgICAgY3VycmVudD86IE9yZGVyQnlFeHByZXNzaW9uPFQ+LFxuICAgICkgPT4gT3JkZXJCeUV4cHJlc3Npb248VD4sXG4gICk6IE9yZGVyQnlFeHByZXNzaW9uPFQ+O1xuICBvcmRlckJ5KG9wdHM6IE9yZGVyQnk8VD4pOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgb3JkZXJCeSgpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgb3JkZXJCeShvcHRzPzogYW55KTogYW55IHtcbiAgICBpZiAoVHlwZXMuaXNGdW5jdGlvbihvcHRzKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcHRpb24oXG4gICAgICAgIFF1ZXJ5T3B0aW9uLm9yZGVyQnksXG4gICAgICAgIE9yZGVyQnlFeHByZXNzaW9uLmZhY3RvcnkoXG4gICAgICAgICAgb3B0cyxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZXhwcmVzc2lvbihRdWVyeU9wdGlvbi5vcmRlckJ5KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMub3B0aW9uPE9yZGVyQnk8VD4+KFF1ZXJ5T3B0aW9uLm9yZGVyQnksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuZCByZXR1cm4gYSBoYW5kbGVyIGZvciBtb2RpZnlpbmcgdGhlICR0b3Agb3B0aW9uLlxuICAgKiBJZiBvcHRzIGlzIGdpdmVuIHRoZW4gc2V0IHRlIHZhbHVlIGFzIG5ldyB2YWx1ZSBmb3IgJHRvcC5cbiAgICogQHBhcmFtIG9wdHMgbnVtYmVyIHZhbHVlXG4gICAqL1xuICB0b3Aob3B0czogbnVtYmVyKTogT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXI8VD47XG4gIHRvcCgpOiBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlcjxUPjtcbiAgdG9wKG9wdHM/OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMub3B0aW9uPG51bWJlcj4oUXVlcnlPcHRpb24udG9wLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbmQgcmV0dXJuIGEgaGFuZGxlciBmb3IgbW9kaWZ5aW5nIHRoZSAkc2tpcCBvcHRpb24uXG4gICAqIElmIG9wdHMgaXMgZ2l2ZW4gdGhlbiBzZXQgdGUgdmFsdWUgYXMgbmV3IHZhbHVlIGZvciAkc2tpcC5cbiAgICogQHBhcmFtIG9wdHMgbnVtYmVyIHZhbHVlXG4gICAqL1x