New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@fgv/ts-utils

Package Overview
Dependencies
Maintainers
1
Versions
95
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@fgv/ts-utils - npm Package Compare versions

Comparing version 0.3.4 to 0.3.5

36

converter.d.ts
import { Result } from './result';
declare type OnError = 'failOnError' | 'ignoreErrors';
export interface Converter<T> {
export interface Converter<T, TC = undefined> {
/**
* Converts from unknown to <T>
* @param from The unknown to be converted
* @param context An optional context applied to the conversion
* @returns An @see Result with a value or an error message
*/
convert(from: unknown): Result<T>;
convert(from: unknown, context?: TC): Result<T>;
/**

@@ -18,5 +19,6 @@ * Converts from unknown to <T> or undefined, as appropriate.

* @param from The unknown to be converted
* @param context Optional context for use by the converter
* @param onError Specifies handling of values that cannot be converted, default 'ignoreErrors'
*/
convertOptional(from: unknown, onError?: OnError): Result<T | undefined>;
convertOptional(from: unknown, context?: TC, onError?: OnError): Result<T | undefined>;
/**

@@ -32,3 +34,3 @@ * Creates a converter for an optional value. If 'onError'

* */
optional(onError?: OnError): Converter<T | undefined>;
optional(onError?: OnError): Converter<T | undefined, TC>;
/**

@@ -38,3 +40,3 @@ * Applies a (possibly) mapping conversion to the converted value.

*/
map<T2>(mapper: (from: T) => Result<T2>): Converter<T2>;
map<T2>(mapper: (from: T) => Result<T2>): Converter<T2, TC>;
/**

@@ -44,3 +46,3 @@ * Applies an additional converter to the converted value.

*/
mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2>;
mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2, TC>;
/**

@@ -54,3 +56,3 @@ * Creates a converter with an optional constraint. If the base converter

*/
withConstraint(constraint: (val: T) => boolean | Result<T>): Converter<T>;
withConstraint(constraint: (val: T) => boolean | Result<T>): Converter<T, TC>;
}

@@ -60,5 +62,6 @@ /**

*/
export declare class BaseConverter<T> implements Converter<T> {
private _converter;
constructor(converter: (from: unknown, self: Converter<T>) => Result<T>);
export declare class BaseConverter<T, TC = undefined> implements Converter<T, TC> {
protected readonly _defaultContext?: TC;
private readonly _converter;
constructor(converter: (from: unknown, self: Converter<T, TC>, context?: TC) => Result<T>, defaultContext?: TC);
/**

@@ -69,3 +72,3 @@ * Converts from unknown to <T>

*/
convert(from: unknown): Result<T>;
convert(from: unknown, context?: TC): Result<T>;
/**

@@ -81,3 +84,3 @@ * Converts from unknown to <T> or undefined, as appropriate.

*/
convertOptional(from: unknown, onError?: OnError): Result<T | undefined>;
convertOptional(from: unknown, context?: TC, onError?: OnError): Result<T | undefined>;
/**

@@ -93,3 +96,3 @@ * Creates a converter for an optional value. If 'onError'

* */
optional(onError?: OnError): Converter<T | undefined>;
optional(onError?: OnError): Converter<T | undefined, TC>;
/**

@@ -99,3 +102,3 @@ * Applies a (possibly) mapping conversion to the converted value.

*/
map<T2>(mapper: (from: T) => Result<T2>): Converter<T2>;
map<T2>(mapper: (from: T) => Result<T2>): Converter<T2, TC>;
/**

@@ -105,3 +108,3 @@ * Applies an additional converter to the converted value.

*/
mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2>;
mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2, TC>;
/**

@@ -115,4 +118,5 @@ * Creates a converter with an optional constraint. If the base converter

*/
withConstraint(constraint: (val: T) => boolean | Result<T>): Converter<T>;
withConstraint(constraint: (val: T) => boolean | Result<T>): Converter<T, TC>;
protected _context(supplied?: TC): TC | undefined;
}
export {};

@@ -30,4 +30,5 @@ "use strict";

class BaseConverter {
constructor(converter) {
constructor(converter, defaultContext) {
this._converter = converter;
this._defaultContext = defaultContext;
}

@@ -39,4 +40,4 @@ /**

*/
convert(from) {
return this._converter(from, this);
convert(from, context) {
return this._converter(from, this, context !== null && context !== void 0 ? context : this._defaultContext);
}

@@ -53,4 +54,4 @@ /**

*/
convertOptional(from, onError) {
const result = this._converter(from, this);
convertOptional(from, context, onError) {
const result = this._converter(from, this, this._context(context));
if (result.isFailure()) {

@@ -73,5 +74,5 @@ onError = onError !== null && onError !== void 0 ? onError : 'ignoreErrors';

optional(onError) {
return new BaseConverter((from) => {
return new BaseConverter((from, _self, context) => {
onError = onError !== null && onError !== void 0 ? onError : 'ignoreErrors';
return this.convertOptional(from, onError);
return this.convertOptional(from, this._context(context), onError);
});

@@ -84,4 +85,4 @@ }

map(mapper) {
return new BaseConverter((from) => {
const innerResult = this._converter(from, this);
return new BaseConverter((from, _self, context) => {
const innerResult = this._converter(from, this, this._context(context));
if (innerResult.isSuccess()) {

@@ -98,4 +99,4 @@ return mapper(innerResult.value);

mapConvert(mapConverter) {
return new BaseConverter((from) => {
const innerResult = this._converter(from, this);
return new BaseConverter((from, _self, context) => {
const innerResult = this._converter(from, this, this._context(context));
if (innerResult.isSuccess()) {

@@ -116,4 +117,4 @@ return mapConverter.convert(innerResult.value);

withConstraint(constraint) {
return new BaseConverter((from) => {
const result = this._converter(from, this);
return new BaseConverter((from, _self, context) => {
const result = this._converter(from, this, this._context(context));
if (result.isSuccess()) {

@@ -129,4 +130,7 @@ const constraintResult = constraint(result.value);

}
_context(supplied) {
return supplied !== null && supplied !== void 0 ? supplied : this._defaultContext;
}
}
exports.BaseConverter = BaseConverter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBaUQ7QUEyRGpEOztHQUVHO0FBQ0gsTUFBYSxhQUFhO0lBR3RCLFlBQW1CLFNBQTJEO1FBQzFFLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksT0FBTyxDQUFDLElBQWE7UUFDeEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksZUFBZSxDQUFDLElBQWEsRUFBRSxPQUFpQjtRQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksY0FBYyxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxPQUFPLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUM3RjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7O1NBU0s7SUFDRSxRQUFRLENBQUMsT0FBaUI7UUFDN0IsT0FBTyxJQUFJLGFBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxFQUFFO1lBQ3ZDLE9BQU8sR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxjQUFjLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSSxHQUFHLENBQUssTUFBK0I7UUFDMUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hELElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEM7WUFDRCxPQUFPLGFBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFLLFlBQTJCO1FBQzdDLE9BQU8sSUFBSSxhQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtZQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDekIsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsRDtZQUNELE9BQU8sYUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksY0FBYyxDQUFDLFVBQXlDO1FBQzNELE9BQU8sSUFBSSxhQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtZQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssU0FBUyxFQUFFO29CQUN2QyxPQUFPLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2lCQUM5RztnQkFDRCxPQUFPLGdCQUFnQixDQUFDO2FBQzNCO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFyR0Qsc0NBcUdDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5pbXBvcnQgeyBSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbnR5cGUgT25FcnJvciA9ICdmYWlsT25FcnJvcicgfCAnaWdub3JlRXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0ZXI8VD4ge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGZyb20gdW5rbm93biB0byA8VD5cbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdW5rbm93biB0byBiZSBjb252ZXJ0ZWRcbiAgICAgKiBAcmV0dXJucyBBbiBAc2VlIFJlc3VsdCB3aXRoIGEgdmFsdWUgb3IgYW4gZXJyb3IgbWVzc2FnZVxuICAgICAqL1xuICAgIGNvbnZlcnQoZnJvbTogdW5rbm93bik6IFJlc3VsdDxUPjtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGZyb20gdW5rbm93biB0byA8VD4gb3IgdW5kZWZpbmVkLCBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKiBJZiAnb25FcnJvcicgaXMgJ2ZhaWxPbkVycm9yJywgdGhlIGNvbnZlcnRlciBzdWNjZWVkcyBmb3JcbiAgICAgKiAndW5kZWZpbmVkJyBvciBhbnkgY29udmVydGlibGUgdmFsdWUsIGJ1dCByZXBvcnRzIGFuIGVycm9yXG4gICAgICogaWYgaXQgZW5jb3VudGVycyBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmICdvbkVycm9yJ1xuICAgICAqIGlzICdpZ25vcmVFcnJvcnMnIChkZWZhdWx0KSB0aGVuIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWRcbiAgICAgKiByZXN1bHQgaW4gYSBzdWNjZXNzZnVsIHJldHVybiBvZiAndW5kZWZpbmVkJy5cbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdW5rbm93biB0byBiZSBjb252ZXJ0ZWRcbiAgICAgKiBAcGFyYW0gb25FcnJvciBTcGVjaWZpZXMgaGFuZGxpbmcgb2YgdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCwgZGVmYXVsdCAnaWdub3JlRXJyb3JzJ1xuICAgICAqL1xuICAgIGNvbnZlcnRPcHRpb25hbChmcm9tOiB1bmtub3duLCBvbkVycm9yPzogT25FcnJvcik6IFJlc3VsdDxUfHVuZGVmaW5lZD47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29udmVydGVyIGZvciBhbiBvcHRpb25hbCB2YWx1ZS4gSWYgJ29uRXJyb3InXG4gICAgICogaXMgJ2ZhaWxPbkVycm9yJywgdGhlIGNvbnZlcnRlciBhY2NlcHRzICd1bmRlZmluZWQnIG9yIGFcbiAgICAgKiBjb252ZXJ0aWJsZSB2YWx1ZSwgYnV0IHJlcG9ydHMgYW4gZXJyb3IgaWYgaXQgZW5jb3VudGVyc1xuICAgICAqIGEgdmFsdWUgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgJ29uRXJyb3InIGlzICdpZ25vcmVFcnJvcnMnXG4gICAgICogKGRlZmF1bHQpIHRoZW4gdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCByZXN1bHQgaW4gYVxuICAgICAqIHN1Y2Nlc3NmdWwgcmV0dXJuIG9mICd1bmRlZmluZWQnLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uRXJyb3IgU3BlY2lmaWVzIGhhbmRsaW5nIG9mIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQsIGRlZmF1bHQgJ2lnbm9yZUVycm9ycydcbiAgICAgKiAqL1xuICAgIG9wdGlvbmFsKG9uRXJyb3I/OiBPbkVycm9yKTogQ29udmVydGVyPFR8dW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYSAocG9zc2libHkpIG1hcHBpbmcgY29udmVyc2lvbiB0byB0aGUgY29udmVydGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBtYXBwZXIgQSBmdW5jdGlvbiB3aGljaCBtYXBzIGZyb20gdGhlIGNvbnZlcnRlZCB0eXBlIHRvIHNvbWUgb3RoZXIgdHlwZS5cbiAgICAgKi9cbiAgICBtYXA8VDI+KG1hcHBlcjogKGZyb206IFQpID0+IFJlc3VsdDxUMj4pOiBDb252ZXJ0ZXI8VDI+O1xuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbiBhZGRpdGlvbmFsIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBtYXBDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBtYXBDb252ZXJ0PFQyPihtYXBDb252ZXJ0ZXI6IENvbnZlcnRlcjxUMj4pOiBDb252ZXJ0ZXI8VDI+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbnZlcnRlciB3aXRoIGFuIG9wdGlvbmFsIGNvbnN0cmFpbnQuICBJZiB0aGUgYmFzZSBjb252ZXJ0ZXJcbiAgICAgKiBzdWNjZWVkcywgY2FsbHMgYSBzdXBwbGllZCBjb25zdHJhaW50IGV2YWx1YXRpb24gZnVuY3Rpb24gd2l0aCB0aGVcbiAgICAgKiB2YWx1ZSBhbmQgZmFpbHMgdGhlIGNvbnZlcnNpb24gaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZWl0aGVyIGZhbHNlXG4gICAgICogb3IgRmFpbHVyZTxUPi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25zdHJhaW50IENvbnN0cmFpbnQgZXZhbHVhdGlvbiBmdW5jdGlvblxuICAgICAqL1xuICAgIHdpdGhDb25zdHJhaW50KGNvbnN0cmFpbnQ6ICh2YWw6IFQpID0+IGJvb2xlYW58UmVzdWx0PFQ+KTogQ29udmVydGVyPFQ+O1xufVxuXG4vKipcbiAqIFNpbXBsZSB0ZW1wbGF0ZWQgY29udmVydGVyIHdyYXBwZXIgdG8gc2ltcGxpZnkgdHlwZWQgY29udmVyc2lvbiBmcm9tIHVua25vd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQ29udmVydGVyPFQ+IGltcGxlbWVudHMgQ29udmVydGVyPFQ+IHtcbiAgICBwcml2YXRlIF9jb252ZXJ0ZXI6IChmcm9tOiB1bmtub3duLCBzZWxmOiBDb252ZXJ0ZXI8VD4pID0+IFJlc3VsdDxUPjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb252ZXJ0ZXI6IChmcm9tOiB1bmtub3duLCBzZWxmOiBDb252ZXJ0ZXI8VD4pID0+IFJlc3VsdDxUPikge1xuICAgICAgICB0aGlzLl9jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZnJvbSB1bmtub3duIHRvIDxUPlxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB1bmtub3duIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqIEByZXR1cm5zIEFuIEBzZWUgUmVzdWx0IHdpdGggYSB2YWx1ZSBvciBhbiBlcnJvciBtZXNzYWdlXG4gICAgICovXG4gICAgcHVibGljIGNvbnZlcnQoZnJvbTogdW5rbm93bik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZnJvbSB1bmtub3duIHRvIDxUPiBvciB1bmRlZmluZWQsIGFzIGFwcHJvcHJpYXRlLlxuICAgICAqIElmICdvbkVycm9yJyBpcyAnZmFpbE9uRXJyb3InLCB0aGUgY29udmVydGVyIHN1Y2NlZWRzIGZvclxuICAgICAqICd1bmRlZmluZWQnIG9yIGFueSBjb252ZXJ0aWJsZSB2YWx1ZSwgYnV0IHJlcG9ydHMgYW4gZXJyb3JcbiAgICAgKiBpZiBpdCBlbmNvdW50ZXJzIGEgdmFsdWUgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgJ29uRXJyb3InXG4gICAgICogaXMgJ2lnbm9yZUVycm9ycycgKGRlZmF1bHQpIHRoZW4gdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZFxuICAgICAqIHJlc3VsdCBpbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuIG9mICd1bmRlZmluZWQnLlxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB1bmtub3duIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyBoYW5kbGluZyBvZiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLCBkZWZhdWx0ICdpZ25vcmVFcnJvcnMnXG4gICAgICovXG4gICAgcHVibGljIGNvbnZlcnRPcHRpb25hbChmcm9tOiB1bmtub3duLCBvbkVycm9yPzogT25FcnJvcik6IFJlc3VsdDxUfHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgIG9uRXJyb3IgPSBvbkVycm9yID8/ICdpZ25vcmVFcnJvcnMnO1xuICAgICAgICAgICAgcmV0dXJuICgoZnJvbSA9PT0gdW5kZWZpbmVkKSB8fCBvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJykgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29udmVydGVyIGZvciBhbiBvcHRpb25hbCB2YWx1ZS4gSWYgJ29uRXJyb3InXG4gICAgICogaXMgJ2ZhaWxPbkVycm9yJywgdGhlIGNvbnZlcnRlciBhY2NlcHRzICd1bmRlZmluZWQnIG9yIGFcbiAgICAgKiBjb252ZXJ0aWJsZSB2YWx1ZSwgYnV0IHJlcG9ydHMgYW4gZXJyb3IgaWYgaXQgZW5jb3VudGVyc1xuICAgICAqIGEgdmFsdWUgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgJ29uRXJyb3InIGlzICdpZ25vcmVFcnJvcnMnXG4gICAgICogKGRlZmF1bHQpIHRoZW4gdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCByZXN1bHQgaW4gYVxuICAgICAqIHN1Y2Nlc3NmdWwgcmV0dXJuIG9mICd1bmRlZmluZWQnLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uRXJyb3IgU3BlY2lmaWVzIGhhbmRsaW5nIG9mIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQsIGRlZmF1bHQgJ2lnbm9yZUVycm9ycydcbiAgICAgKiAqL1xuICAgIHB1YmxpYyBvcHRpb25hbChvbkVycm9yPzogT25FcnJvcik6IENvbnZlcnRlcjxUfHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIG9uRXJyb3IgPSBvbkVycm9yID8/ICdpZ25vcmVFcnJvcnMnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydE9wdGlvbmFsKGZyb20sIG9uRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGEgKHBvc3NpYmx5KSBtYXBwaW5nIGNvbnZlcnNpb24gdG8gdGhlIGNvbnZlcnRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gbWFwcGVyIEEgZnVuY3Rpb24gd2hpY2ggbWFwcyBmcm9tIHRoZSBjb252ZXJ0ZWQgdHlwZSB0byBzb21lIG90aGVyIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIG1hcDxUMj4obWFwcGVyOiAoZnJvbTogVCkgPT4gUmVzdWx0PFQyPik6IENvbnZlcnRlcjxUMj4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVzdWx0ID0gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMpO1xuICAgICAgICAgICAgaWYgKGlubmVyUmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlcihpbm5lclJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFpbChpbm5lclJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbiBhZGRpdGlvbmFsIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBtYXBDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwQ29udmVydDxUMj4obWFwQ29udmVydGVyOiBDb252ZXJ0ZXI8VDI+KTogQ29udmVydGVyPFQyPiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJSZXN1bHQgPSB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcyk7XG4gICAgICAgICAgICBpZiAoaW5uZXJSZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwQ29udmVydGVyLmNvbnZlcnQoaW5uZXJSZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhaWwoaW5uZXJSZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgd2l0aCBhbiBvcHRpb25hbCBjb25zdHJhaW50LiAgSWYgdGhlIGJhc2UgY29udmVydGVyXG4gICAgICogc3VjY2VlZHMsIGNhbGxzIGEgc3VwcGxpZWQgY29uc3RyYWludCBldmFsdWF0aW9uIGZ1bmN0aW9uIHdpdGggdGhlXG4gICAgICogdmFsdWUgYW5kIGZhaWxzIHRoZSBjb252ZXJzaW9uIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVpdGhlciBmYWxzZVxuICAgICAqIG9yIEZhaWx1cmU8VD4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uc3RyYWludCBDb25zdHJhaW50IGV2YWx1YXRpb24gZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbnN0cmFpbnQoY29uc3RyYWludDogKHZhbDogVCkgPT4gYm9vbGVhbnxSZXN1bHQ8VD4pOiBDb252ZXJ0ZXI8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJhaW50UmVzdWx0ID0gY29uc3RyYWludChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RyYWludFJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJhaW50UmVzdWx0ID8gcmVzdWx0IDogZmFpbChgVmFsdWUgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQudmFsdWUpfSBkb2VzIG5vdCBtZWV0IGNvbnN0cmFpbnQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJhaW50UmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBaUQ7QUE2RGpEOztHQUVHO0FBQ0gsTUFBYSxhQUFhO0lBSXRCLFlBQW1CLFNBQTZFLEVBQUUsY0FBbUI7UUFDakgsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxPQUFPLENBQUMsSUFBYSxFQUFFLE9BQVk7UUFDdEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxlQUFlLENBQUMsSUFBYSxFQUFFLE9BQVksRUFBRSxPQUFpQjtRQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxjQUFjLENBQUM7WUFDcEMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLE9BQU8sS0FBSyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQzdGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7Ozs7U0FTSztJQUNFLFFBQVEsQ0FBQyxPQUFpQjtRQUM3QixPQUFPLElBQUksYUFBYSxDQUFDLENBQUMsSUFBYSxFQUFFLEtBQWlDLEVBQUUsT0FBWSxFQUFFLEVBQUU7WUFDeEYsT0FBTyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLGNBQWMsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksR0FBRyxDQUFLLE1BQStCO1FBQzFDLE9BQU8sSUFBSSxhQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBd0IsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUMvRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEM7WUFDRCxPQUFPLGFBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFLLFlBQTJCO1FBQzdDLE9BQU8sSUFBSSxhQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBd0IsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUMvRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxhQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxjQUFjLENBQUMsVUFBeUM7UUFDM0QsT0FBTyxJQUFJLGFBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxLQUF1QixFQUFFLE9BQVksRUFBRSxFQUFFO1lBQzlFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxPQUFPLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtvQkFDdkMsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztpQkFDOUc7Z0JBQ0QsT0FBTyxnQkFBZ0IsQ0FBQzthQUMzQjtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVTLFFBQVEsQ0FBQyxRQUFhO1FBQzVCLE9BQU8sUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM1QyxDQUFDO0NBQ0o7QUEzR0Qsc0NBMkdDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5pbXBvcnQgeyBSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbnR5cGUgT25FcnJvciA9ICdmYWlsT25FcnJvcicgfCAnaWdub3JlRXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0ZXI8VCwgVEM9dW5kZWZpbmVkPiB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZnJvbSB1bmtub3duIHRvIDxUPlxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB1bmtub3duIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IEFuIG9wdGlvbmFsIGNvbnRleHQgYXBwbGllZCB0byB0aGUgY29udmVyc2lvblxuICAgICAqIEByZXR1cm5zIEFuIEBzZWUgUmVzdWx0IHdpdGggYSB2YWx1ZSBvciBhbiBlcnJvciBtZXNzYWdlXG4gICAgICovXG4gICAgY29udmVydChmcm9tOiB1bmtub3duLCBjb250ZXh0PzogVEMpOiBSZXN1bHQ8VD47XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHVua25vd24gdG8gPFQ+IG9yIHVuZGVmaW5lZCwgYXMgYXBwcm9wcmlhdGUuXG4gICAgICogSWYgJ29uRXJyb3InIGlzICdmYWlsT25FcnJvcicsIHRoZSBjb252ZXJ0ZXIgc3VjY2VlZHMgZm9yXG4gICAgICogJ3VuZGVmaW5lZCcgb3IgYW55IGNvbnZlcnRpYmxlIHZhbHVlLCBidXQgcmVwb3J0cyBhbiBlcnJvclxuICAgICAqIGlmIGl0IGVuY291bnRlcnMgYSB2YWx1ZSB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiAnb25FcnJvcidcbiAgICAgKiBpcyAnaWdub3JlRXJyb3JzJyAoZGVmYXVsdCkgdGhlbiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkXG4gICAgICogcmVzdWx0IGluIGEgc3VjY2Vzc2Z1bCByZXR1cm4gb2YgJ3VuZGVmaW5lZCcuXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHVua25vd24gdG8gYmUgY29udmVydGVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjb252ZXJ0ZXJcbiAgICAgKiBAcGFyYW0gb25FcnJvciBTcGVjaWZpZXMgaGFuZGxpbmcgb2YgdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCwgZGVmYXVsdCAnaWdub3JlRXJyb3JzJ1xuICAgICAqL1xuICAgIGNvbnZlcnRPcHRpb25hbChmcm9tOiB1bmtub3duLCBjb250ZXh0PzogVEMsIG9uRXJyb3I/OiBPbkVycm9yKTogUmVzdWx0PFR8dW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgZm9yIGFuIG9wdGlvbmFsIHZhbHVlLiBJZiAnb25FcnJvcidcbiAgICAgKiBpcyAnZmFpbE9uRXJyb3InLCB0aGUgY29udmVydGVyIGFjY2VwdHMgJ3VuZGVmaW5lZCcgb3IgYVxuICAgICAqIGNvbnZlcnRpYmxlIHZhbHVlLCBidXQgcmVwb3J0cyBhbiBlcnJvciBpZiBpdCBlbmNvdW50ZXJzXG4gICAgICogYSB2YWx1ZSB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiAnb25FcnJvcicgaXMgJ2lnbm9yZUVycm9ycydcbiAgICAgKiAoZGVmYXVsdCkgdGhlbiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIHJlc3VsdCBpbiBhXG4gICAgICogc3VjY2Vzc2Z1bCByZXR1cm4gb2YgJ3VuZGVmaW5lZCcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25FcnJvciBTcGVjaWZpZXMgaGFuZGxpbmcgb2YgdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCwgZGVmYXVsdCAnaWdub3JlRXJyb3JzJ1xuICAgICAqICovXG4gICAgb3B0aW9uYWwob25FcnJvcj86IE9uRXJyb3IpOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYSAocG9zc2libHkpIG1hcHBpbmcgY29udmVyc2lvbiB0byB0aGUgY29udmVydGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBtYXBwZXIgQSBmdW5jdGlvbiB3aGljaCBtYXBzIGZyb20gdGhlIGNvbnZlcnRlZCB0eXBlIHRvIHNvbWUgb3RoZXIgdHlwZS5cbiAgICAgKi9cbiAgICBtYXA8VDI+KG1hcHBlcjogKGZyb206IFQpID0+IFJlc3VsdDxUMj4pOiBDb252ZXJ0ZXI8VDIsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYW4gYWRkaXRpb25hbCBjb252ZXJ0ZXIgdG8gdGhlIGNvbnZlcnRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gbWFwQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgY29udmVydGVkIHZhbHVlXG4gICAgICovXG4gICAgbWFwQ29udmVydDxUMj4obWFwQ29udmVydGVyOiBDb252ZXJ0ZXI8VDI+KTogQ29udmVydGVyPFQyLCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29udmVydGVyIHdpdGggYW4gb3B0aW9uYWwgY29uc3RyYWludC4gIElmIHRoZSBiYXNlIGNvbnZlcnRlclxuICAgICAqIHN1Y2NlZWRzLCBjYWxscyBhIHN1cHBsaWVkIGNvbnN0cmFpbnQgZXZhbHVhdGlvbiBmdW5jdGlvbiB3aXRoIHRoZVxuICAgICAqIHZhbHVlIGFuZCBmYWlscyB0aGUgY29udmVyc2lvbiBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBlaXRoZXIgZmFsc2VcbiAgICAgKiBvciBGYWlsdXJlPFQ+LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnN0cmFpbnQgQ29uc3RyYWludCBldmFsdWF0aW9uIGZ1bmN0aW9uXG4gICAgICovXG4gICAgd2l0aENvbnN0cmFpbnQoY29uc3RyYWludDogKHZhbDogVCkgPT4gYm9vbGVhbnxSZXN1bHQ8VD4pOiBDb252ZXJ0ZXI8VCwgVEM+O1xufVxuXG4vKipcbiAqIFNpbXBsZSB0ZW1wbGF0ZWQgY29udmVydGVyIHdyYXBwZXIgdG8gc2ltcGxpZnkgdHlwZWQgY29udmVyc2lvbiBmcm9tIHVua25vd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQ29udmVydGVyPFQsIFRDPXVuZGVmaW5lZD4gaW1wbGVtZW50cyBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2RlZmF1bHRDb250ZXh0PzogVEM7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udmVydGVyOiAoZnJvbTogdW5rbm93biwgc2VsZjogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiBSZXN1bHQ8VD47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29udmVydGVyOiAoZnJvbTogdW5rbm93biwgc2VsZjogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiBSZXN1bHQ8VD4sIGRlZmF1bHRDb250ZXh0PzogVEMpIHtcbiAgICAgICAgdGhpcy5fY29udmVydGVyID0gY29udmVydGVyO1xuICAgICAgICB0aGlzLl9kZWZhdWx0Q29udGV4dCA9IGRlZmF1bHRDb250ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGZyb20gdW5rbm93biB0byA8VD5cbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdW5rbm93biB0byBiZSBjb252ZXJ0ZWRcbiAgICAgKiBAcmV0dXJucyBBbiBAc2VlIFJlc3VsdCB3aXRoIGEgdmFsdWUgb3IgYW4gZXJyb3IgbWVzc2FnZVxuICAgICAqL1xuICAgIHB1YmxpYyBjb252ZXJ0KGZyb206IHVua25vd24sIGNvbnRleHQ/OiBUQyk6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcywgY29udGV4dCA/PyB0aGlzLl9kZWZhdWx0Q29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZnJvbSB1bmtub3duIHRvIDxUPiBvciB1bmRlZmluZWQsIGFzIGFwcHJvcHJpYXRlLlxuICAgICAqIElmICdvbkVycm9yJyBpcyAnZmFpbE9uRXJyb3InLCB0aGUgY29udmVydGVyIHN1Y2NlZWRzIGZvclxuICAgICAqICd1bmRlZmluZWQnIG9yIGFueSBjb252ZXJ0aWJsZSB2YWx1ZSwgYnV0IHJlcG9ydHMgYW4gZXJyb3JcbiAgICAgKiBpZiBpdCBlbmNvdW50ZXJzIGEgdmFsdWUgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgJ29uRXJyb3InXG4gICAgICogaXMgJ2lnbm9yZUVycm9ycycgKGRlZmF1bHQpIHRoZW4gdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZFxuICAgICAqIHJlc3VsdCBpbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuIG9mICd1bmRlZmluZWQnLlxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB1bmtub3duIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyBoYW5kbGluZyBvZiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLCBkZWZhdWx0ICdpZ25vcmVFcnJvcnMnXG4gICAgICovXG4gICAgcHVibGljIGNvbnZlcnRPcHRpb25hbChmcm9tOiB1bmtub3duLCBjb250ZXh0PzogVEMsIG9uRXJyb3I/OiBPbkVycm9yKTogUmVzdWx0PFR8dW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgb25FcnJvciA9IG9uRXJyb3IgPz8gJ2lnbm9yZUVycm9ycyc7XG4gICAgICAgICAgICByZXR1cm4gKChmcm9tID09PSB1bmRlZmluZWQpIHx8IG9uRXJyb3IgPT09ICdpZ25vcmVFcnJvcnMnKSA/IHN1Y2NlZWQodW5kZWZpbmVkKSA6IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgZm9yIGFuIG9wdGlvbmFsIHZhbHVlLiBJZiAnb25FcnJvcidcbiAgICAgKiBpcyAnZmFpbE9uRXJyb3InLCB0aGUgY29udmVydGVyIGFjY2VwdHMgJ3VuZGVmaW5lZCcgb3IgYVxuICAgICAqIGNvbnZlcnRpYmxlIHZhbHVlLCBidXQgcmVwb3J0cyBhbiBlcnJvciBpZiBpdCBlbmNvdW50ZXJzXG4gICAgICogYSB2YWx1ZSB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiAnb25FcnJvcicgaXMgJ2lnbm9yZUVycm9ycydcbiAgICAgKiAoZGVmYXVsdCkgdGhlbiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIHJlc3VsdCBpbiBhXG4gICAgICogc3VjY2Vzc2Z1bCByZXR1cm4gb2YgJ3VuZGVmaW5lZCcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25FcnJvciBTcGVjaWZpZXMgaGFuZGxpbmcgb2YgdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCwgZGVmYXVsdCAnaWdub3JlRXJyb3JzJ1xuICAgICAqICovXG4gICAgcHVibGljIG9wdGlvbmFsKG9uRXJyb3I/OiBPbkVycm9yKTogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgICAgICBvbkVycm9yID0gb25FcnJvciA/PyAnaWdub3JlRXJyb3JzJztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPcHRpb25hbChmcm9tLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpLCBvbkVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhIChwb3NzaWJseSkgbWFwcGluZyBjb252ZXJzaW9uIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIG1hcHBlciBBIGZ1bmN0aW9uIHdoaWNoIG1hcHMgZnJvbSB0aGUgY29udmVydGVkIHR5cGUgdG8gc29tZSBvdGhlciB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYXA8VDI+KG1hcHBlcjogKGZyb206IFQpID0+IFJlc3VsdDxUMj4pOiBDb252ZXJ0ZXI8VDIsIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUMiwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVzdWx0ID0gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMsIHRoaXMuX2NvbnRleHQoY29udGV4dCkpO1xuICAgICAgICAgICAgaWYgKGlubmVyUmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlcihpbm5lclJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFpbChpbm5lclJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbiBhZGRpdGlvbmFsIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBtYXBDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwQ29udmVydDxUMj4obWFwQ29udmVydGVyOiBDb252ZXJ0ZXI8VDI+KTogQ29udmVydGVyPFQyLCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VDIsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbm5lclJlc3VsdCA9IHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKTtcbiAgICAgICAgICAgIGlmIChpbm5lclJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXBDb252ZXJ0ZXIuY29udmVydChpbm5lclJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFpbChpbm5lclJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbnZlcnRlciB3aXRoIGFuIG9wdGlvbmFsIGNvbnN0cmFpbnQuICBJZiB0aGUgYmFzZSBjb252ZXJ0ZXJcbiAgICAgKiBzdWNjZWVkcywgY2FsbHMgYSBzdXBwbGllZCBjb25zdHJhaW50IGV2YWx1YXRpb24gZnVuY3Rpb24gd2l0aCB0aGVcbiAgICAgKiB2YWx1ZSBhbmQgZmFpbHMgdGhlIGNvbnZlcnNpb24gaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZWl0aGVyIGZhbHNlXG4gICAgICogb3IgRmFpbHVyZTxUPi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25zdHJhaW50IENvbnN0cmFpbnQgZXZhbHVhdGlvbiBmdW5jdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29uc3RyYWludChjb25zdHJhaW50OiAodmFsOiBUKSA9PiBib29sZWFufFJlc3VsdDxUPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJhaW50UmVzdWx0ID0gY29uc3RyYWludChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RyYWludFJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJhaW50UmVzdWx0ID8gcmVzdWx0IDogZmFpbChgVmFsdWUgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQudmFsdWUpfSBkb2VzIG5vdCBtZWV0IGNvbnN0cmFpbnQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJhaW50UmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jb250ZXh0KHN1cHBsaWVkPzogVEMpOiBUQ3x1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gc3VwcGxpZWQgPz8gdGhpcy5fZGVmYXVsdENvbnRleHQ7XG4gICAgfVxufVxuIl19

@@ -10,14 +10,20 @@ import { BaseConverter, Converter } from './converter';

*/
export declare const string: BaseConverter<string>;
export declare const string: BaseConverter<string, undefined>;
/**
*
* @param values A converter to convert unknown to one of a set of
* supplied enumerated values. Anything else fails.
* Helper function to create a converter which converts unknown to string, applying
* template conversions supplied at construction time or at runtime as context.
* @param defaultContext optional default context to use for template values
*/
export declare function enumeratedValue<T>(values: T[]): Converter<T>;
export declare function templateString(defaultContext?: unknown): Converter<string, unknown>;
/**
* A converter to convert unknown to one of a set of supplied enumerated values. Anything else fails.
* Allowed enumerated values can also be supplied as context at conversion time.
* @param values Array of allowed values
*/
export declare function enumeratedValue<T>(values: T[]): Converter<T, T[]>;
/**
* A converter to convert unknown to a number. Numbers and strings
* with a numeric format succeed. Anything else fails.
*/
export declare const number: BaseConverter<number>;
export declare const number: BaseConverter<number, undefined>;
/**

@@ -28,3 +34,3 @@ * A converter to convert unknown to boolean. Boolean values or the

*/
export declare const boolean: BaseConverter<boolean>;
export declare const boolean: BaseConverter<boolean, undefined>;
/**

@@ -34,13 +40,14 @@ * A converter to convert an optional string value. Values of type string

*/
export declare const optionalString: Converter<string | undefined>;
export declare const optionalString: Converter<string | undefined, undefined>;
/**
* Creates a converter which converts any string into an array of strings
* by separating at a supplied delimiter.
* by separating at a supplied delimiter. Delimeter may also be supplied
* as context at conversion time.
* @param delimiter The delimiter at which to split.
*/
export declare function delimitedString(delimiter: string, options?: 'filtered' | 'all'): Converter<string[]>;
export declare function delimitedString(delimiter: string, options?: 'filtered' | 'all'): Converter<string[], string>;
/**
* A converter to convert an iso formatted string, a number or a Date object to a Date object
*/
export declare const isoDate: BaseConverter<Date>;
export declare const isoDate: BaseConverter<Date, undefined>;
/**

@@ -51,3 +58,3 @@ * A converter to convert an optional number value. Values of type number

*/
export declare const optionalNumber: Converter<number | undefined>;
export declare const optionalNumber: Converter<number | undefined, undefined>;
/**

@@ -58,3 +65,3 @@ * A converter to convert an optional boolean value. Values of type boolean

*/
export declare const optionalBoolean: Converter<boolean | undefined>;
export declare const optionalBoolean: Converter<boolean | undefined, undefined>;
/**

@@ -81,3 +88,3 @@ * A helper wrapper for polymorphic fields. Invokes the wrapped converters

*/
export declare function arrayOf<T>(converter: Converter<T>, onError?: OnError): Converter<T[]>;
export declare function arrayOf<T, TC = undefined>(converter: Converter<T, TC>, onError?: OnError): Converter<T[], TC>;
/**

@@ -90,3 +97,3 @@ * A helper wrapper for converting to Itemrray<T>. If onError is 'failOnError' (default),

*/
export declare function extendedArrayOf<T>(label: string, converter: Converter<T>, onError?: OnError): Converter<ExtendedArray<T>>;
export declare function extendedArrayOf<T, TC = undefined>(label: string, converter: Converter<T, TC>, onError?: OnError): Converter<ExtendedArray<T>, TC>;
/**

@@ -99,3 +106,3 @@ * A helper wrapper to convert the string-keyed properties of an object to a Record of T.

*/
export declare function recordOf<T>(converter: Converter<T>, onError?: 'fail' | 'ignore'): Converter<Record<string, T>>;
export declare function recordOf<T, TC = undefined>(converter: Converter<T, TC>, onError?: 'fail' | 'ignore'): Converter<Record<string, T>, TC>;
/**

@@ -108,3 +115,3 @@ * A helper wrapper to convert the string-keyed properties of an object to a Map of T.

*/
export declare function mapOf<T>(converter: Converter<T>, onError?: 'fail' | 'ignore'): Converter<Map<string, T>>;
export declare function mapOf<T, TC = undefined>(converter: Converter<T, TC>, onError?: 'fail' | 'ignore'): Converter<Map<string, T>, TC>;
/**

@@ -117,3 +124,3 @@ * A helper function to extract and convert a field from an object. Succeeds and returns

*/
export declare function field<T>(name: string, converter: Converter<T>): Converter<T>;
export declare function field<T, TC = undefined>(name: string, converter: Converter<T, TC>): Converter<T, TC>;
/**

@@ -127,3 +134,3 @@ * A helper function to extract and convert an optional field from an object. Succeeds

*/
export declare function optionalField<T>(name: string, converter: Converter<T>): Converter<T | undefined>;
export declare function optionalField<T, TC = undefined>(name: string, converter: Converter<T, TC>): Converter<T | undefined, TC>;
export declare type FieldConverters<T> = {

@@ -130,0 +137,0 @@ [key in keyof T]: Converter<T[key]>;

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rangeOf = exports.rangeTypeOf = exports.transform = exports.object = exports.ObjectConverter = exports.optionalField = exports.field = exports.mapOf = exports.recordOf = exports.extendedArrayOf = exports.arrayOf = exports.oneOf = exports.optionalBoolean = exports.optionalNumber = exports.isoDate = exports.delimitedString = exports.optionalString = exports.boolean = exports.number = exports.enumeratedValue = exports.string = void 0;
exports.rangeOf = exports.rangeTypeOf = exports.transform = exports.object = exports.ObjectConverter = exports.optionalField = exports.field = exports.mapOf = exports.recordOf = exports.extendedArrayOf = exports.arrayOf = exports.oneOf = exports.optionalBoolean = exports.optionalNumber = exports.isoDate = exports.delimitedString = exports.optionalString = exports.boolean = exports.number = exports.enumeratedValue = exports.templateString = exports.string = void 0;
/*

@@ -30,2 +33,3 @@ * Copyright (c) 2020 Erik Fortune

const extendedArray_1 = require("./extendedArray");
const mustache_1 = __importDefault(require("mustache"));
const utils_1 = require("./utils");

@@ -42,10 +46,25 @@ /**

/**
*
* @param values A converter to convert unknown to one of a set of
* supplied enumerated values. Anything else fails.
* Helper function to create a converter which converts unknown to string, applying
* template conversions supplied at construction time or at runtime as context.
* @param defaultContext optional default context to use for template values
*/
function templateString(defaultContext) {
return new converter_1.BaseConverter((from, _self, context) => {
if (typeof from !== 'string') {
return result_1.fail(`Not a string: ${JSON.stringify(from)}`);
}
return result_1.captureResult(() => mustache_1.default.render(from, context));
}, defaultContext);
}
exports.templateString = templateString;
/**
* A converter to convert unknown to one of a set of supplied enumerated values. Anything else fails.
* Allowed enumerated values can also be supplied as context at conversion time.
* @param values Array of allowed values
*/
function enumeratedValue(values) {
return new converter_1.BaseConverter((from) => {
const index = values.indexOf(from);
return (index >= 0 ? result_1.succeed(values[index]) : result_1.fail(`Invalid enumerated value ${JSON.stringify(from)}`));
return new converter_1.BaseConverter((from, _self, context) => {
const v = context !== null && context !== void 0 ? context : values;
const index = v.indexOf(from);
return (index >= 0 ? result_1.succeed(v[index]) : result_1.fail(`Invalid enumerated value ${JSON.stringify(from)}`));
});

@@ -91,10 +110,11 @@ }

* Creates a converter which converts any string into an array of strings
* by separating at a supplied delimiter.
* by separating at a supplied delimiter. Delimeter may also be supplied
* as context at conversion time.
* @param delimiter The delimiter at which to split.
*/
function delimitedString(delimiter, options = 'filtered') {
return new converter_1.BaseConverter((from) => {
return new converter_1.BaseConverter((from, _self, context) => {
const result = exports.string.convert(from);
if (result.isSuccess()) {
let strings = result.value.split(delimiter);
let strings = result.value.split(context !== null && context !== void 0 ? context : delimiter);
if (options !== 'all') {

@@ -180,3 +200,3 @@ strings = strings.filter((s) => (s.trim().length > 0));

function arrayOf(converter, onError = 'failOnError') {
return new converter_1.BaseConverter((from) => {
return new converter_1.BaseConverter((from, _self, context) => {
if (!Array.isArray(from)) {

@@ -188,3 +208,3 @@ return result_1.fail(`Not an array: ${JSON.stringify(from)}`);

for (const item of from) {
const result = converter.convert(item);
const result = converter.convert(item, context);
if (result.isSuccess() && result.value !== undefined) {

@@ -224,3 +244,3 @@ successes.push(result.value);

function recordOf(converter, onError = 'fail') {
return new converter_1.BaseConverter((from) => {
return new converter_1.BaseConverter((from, _self, context) => {
if ((typeof from !== 'object') || Array.isArray(from)) {

@@ -233,3 +253,3 @@ return result_1.fail(`Not a string-keyed object: ${JSON.stringify(from)}`);

if (utils_1.isKeyOf(key, from)) {
const result = converter.convert(from[key]);
const result = converter.convert(from[key], context);
if (result.isSuccess()) {

@@ -257,3 +277,3 @@ record[key] = result.value;

function mapOf(converter, onError = 'fail') {
return new converter_1.BaseConverter((from) => {
return new converter_1.BaseConverter((from, _self, context) => {
if ((typeof from !== 'object') || Array.isArray(from)) {

@@ -266,3 +286,3 @@ return result_1.fail(`Not a string-keyed object: ${JSON.stringify(from)}`);

if (utils_1.isKeyOf(key, from)) {
const result = converter.convert(from[key]);
const result = converter.convert(from[key], context);
if (result.isSuccess()) {

@@ -290,6 +310,6 @@ map.set(key, result.value);

function field(name, converter) {
return new converter_1.BaseConverter((from) => {
return new converter_1.BaseConverter((from, _self, context) => {
if (typeof from === 'object' && from !== null) {
if (utils_1.isKeyOf(name, from)) {
return converter.convert(from[name]).onFailure((message) => {
return converter.convert(from[name], context).onFailure((message) => {
return result_1.fail(`Field ${name}: ${message}`);

@@ -313,6 +333,6 @@ });

function optionalField(name, converter) {
return new converter_1.BaseConverter((from) => {
return new converter_1.BaseConverter((from, _self, context) => {
if (typeof from === 'object' && from !== null) {
if (utils_1.isKeyOf(name, from)) {
const result = converter.convert(from[name]).onFailure((message) => {
const result = converter.convert(from[name], context).onFailure((message) => {
return result_1.fail(`${name}: ${message}`);

@@ -441,2 +461,2 @@ });

exports.rangeOf = rangeOf;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF1RDtBQUN2RCx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBRWhFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsbUNBQWtDO0FBSWxDOzs7R0FHRztBQUNVLFFBQUEsTUFBTSxHQUFHLElBQUkseUJBQWEsQ0FBUyxDQUFDLElBQWEsRUFBRSxFQUFFO0lBQzlELE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUTtRQUMzQixDQUFDLENBQUMsZ0JBQU8sQ0FBQyxJQUFjLENBQUM7UUFDekIsQ0FBQyxDQUFDLGFBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDLENBQUM7QUFFSDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFJLE1BQVc7SUFDMUMsT0FBTyxJQUFJLHlCQUFhLENBQUksQ0FBQyxJQUFhLEVBQWEsRUFBRTtRQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFJLENBQUMsNEJBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBTEQsMENBS0M7QUFFRDs7O0dBR0c7QUFDVSxRQUFBLE1BQU0sR0FBRyxJQUFJLHlCQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM5RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFB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SSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBckJELDhCQXFCQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQTJCLFNBQXVCLEVBQUUsV0FBdUQ7SUFDbEksT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDbEIsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztTQUNqQixFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDeEU7UUFDRCxPQUFPLGFBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBWEQsa0NBV0M7QUFFRCxTQUFnQixPQUFPLENBQUksU0FBdUI7SUFDOUMsT0FBTyxXQUFXLENBQWdCLFNBQVMsRUFBRSxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5pbXBvcnQgeyBCYXNlQ29udmVydGVyLCBDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcic7XG5pbXBvcnQgeyBSYW5nZU9mLCBSYW5nZU9mUHJvcGVydGllcyB9IGZyb20gJy4vcmFuZ2VPZic7XG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcnJheSB9IGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgT25FcnJvciA9ICdmYWlsT25FcnJvcicgfCAnaWdub3JlRXJyb3JzJztcblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IHVua25vd24gdG8gc3RyaW5nLiBWYWx1ZXMgb2YgdHlwZVxuICogc3RyaW5nIHN1Y2NlZWQuICBBbnl0aGluZyBlbHNlIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nID0gbmV3IEJhc2VDb252ZXJ0ZXI8c3RyaW5nPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBzdWNjZWVkKGZyb20gYXMgc3RyaW5nKVxuICAgICAgICA6IGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBvbmUgb2YgYSBzZXQgb2ZcbiAqIHN1cHBsaWVkIGVudW1lcmF0ZWQgdmFsdWVzLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmF0ZWRWYWx1ZTxUPih2YWx1ZXM6IFRbXSk6IENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFQ+KChmcm9tOiB1bmtub3duKTogUmVzdWx0PFQ+ID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB2YWx1ZXMuaW5kZXhPZihmcm9tIGFzIFQpO1xuICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgPyBzdWNjZWVkKHZhbHVlc1tpbmRleF0pIDogZmFpbChgSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBhIG51bWJlci4gIE51bWJlcnMgYW5kIHN0cmluZ3NcbiAqIHdpdGggYSBudW1lcmljIGZvcm1hdCBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IG5ldyBCYXNlQ29udmVydGVyPG51bWJlcj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bTogbnVtYmVyID0gKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyA/IE51bWJlcihmcm9tKSA6IE5hTik7XG4gICAgICAgIHJldHVybiBpc05hTihudW0pXG4gICAgICAgICAgICA/IGZhaWwoYE5vdCBhIG51bWJlcjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKVxuICAgICAgICAgICAgOiBzdWNjZWVkKG51bSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIGJvb2xlYW4uIEJvb2xlYW4gdmFsdWVzIG9yIHRoZVxuICogY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmdzICd0cnVlJyBhbmQgJ2ZhbHNlJyBzdWNjZWVkLiAgQW55dGhpbmdcbiAqIGVsc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuID0gbmV3IEJhc2VDb252ZXJ0ZXI8Ym9vbGVhbj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChmcm9tLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RydWUnOiByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzogcmV0dXJuIHN1Y2NlZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBOb3QgYSBib29sZWFuOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBzdHJpbmcgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICogYXJlIHJldHVybmVkLiAgQW55dGhpbmcgZWxzZSByZXR1cm5zIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbFN0cmluZyA9IHN0cmluZy5vcHRpb25hbCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgd2hpY2ggY29udmVydHMgYW55IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAqIGJ5IHNlcGFyYXRpbmcgYXQgYSBzdXBwbGllZCBkZWxpbWl0ZXIuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIFRoZSBkZWxpbWl0ZXIgYXQgd2hpY2ggdG8gc3BsaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZWRTdHJpbmcoZGVsaW1pdGVyOiBzdHJpbmcsIG9wdGlvbnM6ICdmaWx0ZXJlZCd8J2FsbCcgPSAnZmlsdGVyZWQnKTogQ29udmVydGVyPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPHN0cmluZ1tdPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdHJpbmcuY29udmVydChmcm9tKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgbGV0IHN0cmluZ3MgPSByZXN1bHQudmFsdWUuc3BsaXQoZGVsaW1pdGVyKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHN0cmluZ3MgPSBzdHJpbmdzLmZpbHRlcigocykgPT4gKHMudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHN0cmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IGFuIGlzbyBmb3JtYXR0ZWQgc3RyaW5nLCBhIG51bWJlciBvciBhIERhdGUgb2JqZWN0IHRvIGEgRGF0ZSBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGlzb0RhdGUgPSBuZXcgQmFzZUNvbnZlcnRlcjxEYXRlPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSVNPKGZyb20pO1xuICAgICAgICBpZiAoZHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZHQudG9KU0RhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYEludmFsaWQgZGF0ZTogJHtkdC5pbnZhbGlkRXhwbGFuYXRpb259YCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBmcm9tID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChuZXcgRGF0ZShmcm9tKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeShmcm9tKX0gdG8gRGF0ZWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBudW1iZXIgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIG51bWJlclxuICogb3IgbnVtZXJpYyBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkLiBBbnl0aGluZyBlbHNlIHJldHVybnNcbiAqIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbE51bWJlciA9IG51bWJlci5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYm9vbGVhbiB2YWx1ZS4gVmFsdWVzIG9mIHR5cGUgYm9vbGVhblxuICogb3Igc3RyaW5ncyB0aGF0IG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKSAndHJ1ZScgb3IgJ2ZhbHNlJyBhcmUgY29udmVydGVkXG4gKiBhbmQgcmV0dXJuZWQuICBBbnl0aGluZyBlbHNlIHJldHVybnMgc3VjY2VzcyB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsQm9vbGVhbiA9IGJvb2xlYW4ub3B0aW9uYWwoKTtcblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBwb2x5bW9ycGhpYyBmaWVsZHMuIEludm9rZXMgdGhlIHdyYXBwZWQgY29udmVydGVyc1xuICogaW4gc2VxdWVuY2UsIHJldHVybmluZyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHQuICBSZXR1cm5zIGFuIGVycm9yXG4gKiBpZiBub25lIG9mIHRoZSBzdXBwbGllZCBjb252ZXJ0ZXJzIGNhbiBjb252ZXJ0IHRoZSB2YWx1ZS5cbiAqXG4gKiBJZiBvbkVycm9yIGlzICdpZ25vcmVFcnJvcnMnIChkZWZhdWx0KSwgdGhlbiBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlXG4gKiBjb252ZXJ0ZXJzIGFyZSBpZ25vcmVkIHByb3ZpZGVkIHRoYXQgc29tZSBjb252ZXJ0ZXIgc3VjY2VlZHMuICBJZlxuICogb25FcnJvciBpcyAnZmFpbE9uRXJyb3InLCB0aGVuIGFuIGVycm9yIGZyb20gYW55IGNvbnZlcnRlciBmYWlscyB0aGUgZW50aXJlXG4gKiBjb252ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJzIEFuIG9yZGVyZWQgbGlzdCBvZiBjb252ZXJ0ZXJzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2Y8VD4oY29udmVydGVyczogQXJyYXk8Q29udmVydGVyPFQ+Piwgb25FcnJvcjogT25FcnJvciA9ICdpZ25vcmVFcnJvcnMnKTogQ29udmVydGVyPFQ+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvciA9PT0gJ2ZhaWxPbkVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYE5vIG1hdGNoaW5nIGNvbnZlcnRlciBmb3IgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06ICR7ZXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgZm9yIGNvbnZlcnRpbmcgYW4gYXJyYXkgb2YgPFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlPZjxUPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8VFtdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhbiBhcnJheTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NlczogVFtdID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZyb20pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3Nlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJylcbiAgICAgICAgICAgID8gc3VjY2VlZChzdWNjZXNzZXMpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBjb252ZXJ0aW5nIHRvIEl0ZW1ycmF5PFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kZWRBcnJheU9mPFQ+KGxhYmVsOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQ+LCBvbkVycm9yOiBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyk6IENvbnZlcnRlcjxFeHRlbmRlZEFycmF5PFQ+PiB7XG4gICAgcmV0dXJuIGFycmF5T2YoY29udmVydGVyLCBvbkVycm9yKS5tYXAoKGl0ZW1zOiBUW10pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IEV4dGVuZGVkQXJyYXkobGFiZWwsIC4uLml0ZW1zKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IHRoZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgdG8gYSBSZWNvcmQgb2YgVC5cbiAqIElmIG9uRXJyb3IgaXMgJ2ZhaWwnIChkZWZhdWx0KSwgIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvciBpcyAnaWdub3JlJyBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgcmVjb3JkXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT2Y8VD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VD4sIG9uRXJyb3I6ICdmYWlsJ3wnaWdub3JlJyA9ICdmYWlsJyk6IENvbnZlcnRlcjxSZWNvcmQ8c3RyaW5nLCBUPj4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFQ+ID0ge307XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihrZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoZnJvbVtrZXldIGFzIHVua25vd24pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob25FcnJvciA9PT0gJ2lnbm9yZScpXG4gICAgICAgICAgICA/IHN1Y2NlZWQocmVjb3JkKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IHRoZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgdG8gYSBNYXAgb2YgVC5cbiAqIElmIG9uRXJyb3IgaXMgJ2ZhaWwnIChkZWZhdWx0KSwgIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvciBpcyAnaWdub3JlJyBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgcmVjb3JkXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VD4sIG9uRXJyb3I6ICdmYWlsJ3wnaWdub3JlJyA9ICdmYWlsJyk6IENvbnZlcnRlcjxNYXA8c3RyaW5nLCBUPj4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKGtleSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW2tleV0gYXMgdW5rbm93bik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgcmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlJylcbiAgICAgICAgICAgID8gc3VjY2VlZChtYXApXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGFuZCBjb252ZXJ0IGEgZmllbGQgZnJvbSBhbiBvYmplY3QuIFN1Y2NlZWRzIGFuZCByZXR1cm5zXG4gKiB0aGUgY29udmVydGVkIHZhbHVlIGlmIHRoZSBmaWVsZCBleGlzdHMgaW4gdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBhbmQgY2FuIGJlIGNvbnZlcnRlZC5cbiAqIEZhaWxzIG90aGVyd2lzZS5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkPFQ+KG5hbWU6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VD4pOiBDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKG5hbWUsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0pLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgRmllbGQgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYEZpZWxkICR7bmFtZX0gbm90IGZvdW5kIGluOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGFuZCBjb252ZXJ0IGFuIG9wdGlvbmFsIGZpZWxkIGZyb20gYW4gb2JqZWN0LiBTdWNjZWVkc1xuICogYW5kIHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpZiB0aGUgZmllbGQgZXhpc3RzIGluIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgYW5kIGNhblxuICogYmUgY29udmVydGVkLiBTdWNjZWVkcyB3aXRoIHVuZGVmaW5lZCBpZiB0aGUgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBidXQgdGhlIG5hbWVkIGZpZWxkXG4gKiBpcyBub3QgcHJlc2VudC4gRmFpbHMgaWYgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxGaWVsZDxUPihuYW1lOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQ+KTogQ29udmVydGVyPFR8dW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcgJiYgZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2YobmFtZSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW25hbWVdKS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwgb3IgaW5wdXQgd2FzIHVuZGVmaW5lZCB3ZVxuICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWQgd2l0aCAndW5kZWZpbmVkJywgYnV0IHdlIHByb3BhZ2F0ZSBhY3R1YWxcbiAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpIHx8IChmcm9tW25hbWVdICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgZmllbGQgXCIke25hbWV9XCIgZnJvbSBub24tb2JqZWN0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkQ29udmVydGVyczxUPiA9IHsgWyBrZXkgaW4ga2V5b2YgVCBdOiBDb252ZXJ0ZXI8VFtrZXldPiB9O1xuXG5leHBvcnQgY2xhc3MgT2JqZWN0Q29udmVydGVyPFQ+IGV4dGVuZHMgQmFzZUNvbnZlcnRlcjxUPiB7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25hbEZpZWxkczogKGtleW9mIFQpW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD4sIG9wdGlvbmFsPzogKGtleW9mIFQpW10pIHtcbiAgICAgICAgc3VwZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHt9IGFzIHsgW2tleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9IG9wdGlvbmFsPy5pbmNsdWRlcyhrZXkpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpc09wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbmFsRmllbGQoa2V5LCBmaWVsZHNba2V5XSkuY29udmVydChmcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSA/IHN1Y2NlZWQoY29udmVydGVkKSA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIHRoaXMub3B0aW9uYWxGaWVsZHMgPSBvcHRpb25hbCA/PyBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFydGlhbChvcHRpb25hbD86IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4odGhpcy5maWVsZHMgYXMgRmllbGRDb252ZXJ0ZXJzPFBhcnRpYWw8VD4+LCBvcHRpb25hbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhcnRpYWwoYWRkT3B0aW9uYWxGaWVsZHM6IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbChbLi4udGhpcy5vcHRpb25hbEZpZWxkcywgLi4uYWRkT3B0aW9uYWxGaWVsZHNdKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgYW4gb2JqZWN0IHdpdGhvdXQgY2hhbmdpbmcgc2hhcGUuIFRoZSBzb3VyY2UgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB3aXRoXG4gKiBrZXkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCB0aGUgYXBwcm9wcmlhdGUgY29ycmVzcG9uZGluZyBjb252ZXJ0ZXJcbiAqIGFzIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gSWYgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgZmllbGRzIGV4aXN0IGFuZCBjYW4gYmUgY29udmVydGVkLCByZXR1cm5zIGFcbiAqIG5ldyBvYmplY3Qgd2l0aCB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUgb3JpZ2luYWwga2V5IG5hbWVzLiAgSWYgYW55IGZpZWxkcyBkbyBub3QgZXhpc3RcbiAqIG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gZmllbGRzIEFuIG9iamVjdCBjb250YWluaW5nIGRlZmluaW5nIHRoZSBzaGFwZSBhbmQgY29udmVydGVycyB0byBiZSBhcHBsaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0PFQ+KGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25hbD86IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFQ+IHtcbiAgICByZXR1cm4gbmV3IE9iamVjdENvbnZlcnRlcihmaWVsZHMsIG9wdGlvbmFsKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gY29udmVydCBhbiBvYmplY3QgdG8gYSBuZXcgb2JqZWN0IHdpdGggYSBkaWZmZXJlbnQgc2hhcGUuIFRoZSBzb3VyY2UgcGFyYW1ldGVyIGlzXG4gKiBhbiBvYmplY3Qgd2l0aCBrZXkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB0YXJnZXQgb2JqZWN0LCBhbmQgYW4gYXBwcm9yaWF0ZSBfZmllbGRfXG4gKiBjb252ZXJ0ZXIgdGhhdCB3aWxsIGV4dHJhY3QgYW5kIGNvbnZlcnQgYSBzaW5nbGUgZmllbGQgZnJvbSB0aGUgc291cmNlIG9iamVjdC5cbiAqXG4gKiBJZiBhbGwgb2YgdGhlIGV4dHJhY3RlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggdGhlXG4gKiBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgZmllbGRzIHRvIGJlIGV4dHJhY3RlZCBkbyBub3QgZXhpc3RcbiAqIG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKlxuICogQHBhcmFtIGZpZWxkcyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIHNoYXBlIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCB0aGUgZmllbGQgY29udmVydGVyc1xuICogdG8gYmUgdXNlZCB0byBjb25zdHJ1Y3QgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm08VD4oZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD4pOiBDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyBlc2xpbnQgYnVnIHRoaW5rcyBrZXkgaXMgdXNlZCBiZWZvcmUgZGVmaW5lZFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBbIGtleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpZWxkc1trZXldLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgPyBzdWNjZWVkKGNvbnZlcnRlZCkgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IGEgcmFuZ2Ugb2Ygc29tZSBvdGhlciBjb21wYXJhYmxlIHR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBtaW4gYW5kIG1heCBleHRlbnQgb2YgdGhlIHJhaWRcbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciBPcHRpb25hbCBzdGF0aWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VUeXBlT2Y8VCwgUlQgZXh0ZW5kcyBSYW5nZU9mPFQ+Pihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPiwgY29uc3RydWN0b3I6IChpbml0OiBSYW5nZU9mUHJvcGVydGllczxUPikgPT4gUmVzdWx0PFJUPik6IENvbnZlcnRlcjxSVD4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBvYmplY3Qoe1xuICAgICAgICAgICAgbWluOiBjb252ZXJ0ZXIsXG4gICAgICAgICAgICBtYXg6IGNvbnZlcnRlcixcbiAgICAgICAgfSwgWydtaW4nLCAnbWF4J10pLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvcih7IG1pbjogcmVzdWx0LnZhbHVlLm1pbiwgbWF4OiByZXN1bHQudmFsdWUubWF4IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlT2Y8VD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VD4pOiBDb252ZXJ0ZXI8UmFuZ2VPZjxUPj4ge1xuICAgIHJldHVybiByYW5nZVR5cGVPZjxULCBSYW5nZU9mPFQ+Pihjb252ZXJ0ZXIsIFJhbmdlT2YuY3JlYXRlUmFuZ2UpO1xufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF1RDtBQUN2RCx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBRWhFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsd0RBQWdDO0FBQ2hDLG1DQUFrQztBQUlsQzs7O0dBR0c7QUFDVSxRQUFBLE1BQU0sR0FBRyxJQUFJLHlCQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM5RCxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLGdCQUFPLENBQUMsSUFBYyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxhQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUF3QjtJQUNuRCxPQUFPLElBQUkseUJBQWEsQ0FBa0IsQ0FBQyxJQUFhLEVBQUUsS0FBaUMsRUFBRSxPQUFpQixFQUFFLEVBQUU7UUFDOUcsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDMUIsT0FBTyxhQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxzQkFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBUEQsd0NBT0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFJLE1BQVc7SUFDMUMsT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBd0IsRUFBRSxPQUFhLEVBQWEsRUFBRTtRQUMzRixNQUFNLENBQUMsR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxNQUFNLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFTLENBQUMsQ0FBQztRQUNuQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBSSxDQUFDLDRCQUE0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQU5ELDBDQU1DO0FBRUQ7OztHQUdHO0FBQ1UsUUFBQSxNQUFNLEdBQUcsSUFBSSx5QkFBYSxDQUFTLENBQUMsSUFBYSxFQUFFLEVBQUU7SUFDOUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDMUIsTUFBTSxHQUFHLEdBQVcsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLGFBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9DLENBQUMsQ0FBQyxnQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3RCO0lBQ0QsT0FBTyxnQkFBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNVLFFBQUEsT0FBTyxHQUFHLElBQUkseUJBQWEsQ0FBVSxDQUFDLElBQWEsRUFBRSxFQUFFO0lBQ2hFLElBQUksT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQzNCLE9BQU8sZ0JBQU8sQ0FBQyxJQUFlLENBQUMsQ0FBQztLQUNuQztTQUNJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQy9CLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3hCLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxnQkFBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxnQkFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO0tBQ0o7SUFDRCxPQUFPLGFBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQyxDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxjQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFFaEQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsU0FBaUIsRUFBRSxVQUE0QixVQUFVO0lBQ3JGLE9BQU8sSUFBSSx5QkFBYSxDQUFtQixDQUFDLElBQWEsRUFBRSxLQUFrQyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtRQUMvRyxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtnQkFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsT0FBTyxnQkFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxhQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVpELDBDQVlDO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLE9BQU8sR0FBRyxJQUFJLHlCQUFhLENBQU8sQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM3RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUMxQixNQUFNLEVBQUUsR0FBRyxnQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLGdCQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDakM7UUFDRCxPQUFPLGFBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztLQUN6RDtTQUNJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQy9CLE9BQU8sZ0JBQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO1NBQ0ksSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFO1FBQzNCLE9BQU8sZ0JBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sYUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUMsQ0FBQztBQUVIOzs7O0dBSUc7QUFDVSxRQUFBLGNBQWMsR0FBRyxjQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFFaEQ7Ozs7R0FJRztBQUNVLFFBQUEsZUFBZSxHQUFHLGVBQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixLQUFLLENBQUksVUFBK0IsRUFBRSxVQUFtQixjQUFjO0lBQ3ZGLE9BQU8sSUFBSSx5QkFBYSxDQUFDLENBQUMsSUFBYSxFQUFFLEVBQUU7UUFDdkMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxFQUFFO2dCQUNwRCxPQUFPLE1BQU0sQ0FBQzthQUNqQjtZQUVELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNwQixJQUFJLE9BQU8sS0FBSyxhQUFhLEVBQUU7b0JBQzNCLE9BQU8sTUFBTSxDQUFDO2lCQUNqQjtnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQjtTQUNKO1FBQ0QsT0FBTyxhQUFJLENBQUMsNkJBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBbEJELHNCQWtCQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLE9BQU8sQ0FBa0IsU0FBMkIsRUFBRSxVQUFtQixhQUFhO0lBQ2xHLE9BQU8sSUFBSSx5QkFBYSxDQUFDLENBQUMsSUFBYSxFQUFFLEtBQXlCLEVBQUUsT0FBWSxFQUFFLEVBQUU7UUFDaEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsT0FBTyxhQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsTUFBTSxTQUFTLEdBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRTtZQUNyQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDbEQsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEM7aUJBQ0ksSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9CO1NBQ0o7UUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxjQUFjLENBQUM7WUFDeEQsQ0FBQyxDQUFDLGdCQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxhQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQXRCRCwwQkFzQkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixlQUFlLENBQWtCLEtBQWEsRUFBRSxTQUEyQixFQUFFLFVBQW1CLGFBQWE7SUFDekgsT0FBTyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1FBQ2xELE9BQU8sc0JBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLDZCQUFhLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFKRCwwQ0FJQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFFBQVEsQ0FBa0IsU0FBMkIsRUFBRSxVQUEyQixNQUFNO0lBQ3BHLE9BQU8sSUFBSSx5QkFBYSxDQUFDLENBQUMsSUFBYSxFQUFFLEtBQXVDLEVBQUUsT0FBWSxFQUFFLEVBQUU7UUFDOUYsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkQsT0FBTyxhQUFJLENBQUMsOEJBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO1FBRUQsTUFBTSxNQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxlQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNwQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUM5QjtxQkFDSTtvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDL0I7YUFDSjtTQUNKO1FBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDO1lBQ2xELENBQUMsQ0FBQyxnQkFBTyxDQUFDLE1BQU0sQ0FBQztZQUNqQixDQUFDLENBQUMsYUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUF6QkQsNEJBeUJDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsS0FBSyxDQUFrQixTQUEyQixFQUFFLFVBQTJCLE1BQU07SUFDakcsT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBb0MsRUFBRSxPQUFZLEVBQUUsRUFBRTtRQUMzRixJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuRCxPQUFPLGFBQUksQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckU7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUU1QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUNwQixJQUFJLGVBQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM5QjtxQkFDSTtvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDL0I7YUFDSjtTQUNKO1FBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDO1lBQ2xELENBQUMsQ0FBQyxnQkFBTyxDQUFDLEdBQUcsQ0FBQztZQUNkLENBQUMsQ0FBQyxhQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQXpCRCxzQkF5QkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixLQUFLLENBQWtCLElBQVksRUFBRSxTQUEyQjtJQUM1RSxPQUFPLElBQUkseUJBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxLQUF1QixFQUFFLE9BQVksRUFBRSxFQUFFO1FBQzlFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDM0MsSUFBSSxlQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNyQixPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNoRSxPQUFPLGFBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLENBQUMsQ0FBQzthQUNOO1lBQ0QsT0FBTyxhQUFJLENBQUMsU0FBUyxJQUFJLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN0RTtRQUNELE9BQU8sYUFBSSxDQUFDLHlCQUF5QixJQUFJLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFaRCxzQkFZQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixhQUFhLENBQWtCLElBQVksRUFBRSxTQUEyQjtJQUNwRixPQUFPLElBQUkseUJBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxLQUFpQyxFQUFFLE9BQVksRUFBRSxFQUFFO1FBQ3hGLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDM0MsSUFBSSxlQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNyQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDeEUsT0FBTyxhQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgseURBQXlEO2dCQUN6RCxvREFBb0Q7Z0JBQ3BELFlBQVk7Z0JBQ1osSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQUU7b0JBQ2xELE9BQU8sTUFBTSxDQUFDO2lCQUNqQjthQUNKO1lBQ0QsT0FBTyxnQkFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxhQUFJLENBQUMseUJBQXlCLElBQUkscUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQW5CRCxzQ0FtQkM7QUFJRCxNQUFhLGVBQW1CLFNBQVEseUJBQWdCO0lBSXBELFlBQW1CLE1BQTBCLEVBQUUsUUFBc0I7UUFDakUsS0FBSyxDQUFDLENBQUMsSUFBYSxFQUFFLEVBQUU7O1lBQ3BCLCtDQUErQztZQUMvQyxnREFBZ0Q7WUFDaEQsTUFBTSxTQUFTLEdBQUcsRUFBa0MsQ0FBQztZQUNyRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7WUFDNUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUU7Z0JBQ3RCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNiLE1BQU0sVUFBVSxTQUFHLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxRQUFRLENBQUMsR0FBRyxvQ0FBSyxLQUFLLENBQUM7b0JBQ3BELE1BQU0sTUFBTSxHQUFHLFVBQVU7d0JBQ3JCLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQy9DLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxFQUFFO3dCQUNwRCxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztxQkFDakM7eUJBQ0ksSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7d0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUMvQjtpQkFDSjthQUNKO1lBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsYUFBUixRQUFRLGNBQVIsUUFBUSxHQUFJLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQXNCO1FBQ2pDLE9BQU8sSUFBSSxlQUFlLENBQWEsSUFBSSxDQUFDLE1BQXFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVNLFVBQVUsQ0FBQyxpQkFBOEI7UUFDNUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FDSjtBQXRDRCwwQ0FzQ0M7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsTUFBTSxDQUFJLE1BQTBCLEVBQUUsUUFBc0I7SUFDeEUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUZELHdCQUVDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFnQixTQUFTLENBQUksTUFBMEI7SUFDbkQsT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtRQUN2QywrQ0FBK0M7UUFDL0MsZ0RBQWdEO1FBQ2hELE1BQU0sU0FBUyxHQUFHLEVBQW1DLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFO1lBQ3RCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsRUFBRTtvQkFDcEQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7aUJBQ2pDO3FCQUNJLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDL0I7YUFDSjtTQUNKO1FBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBckJELDhCQXFCQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQTJCLFNBQXVCLEVBQUUsV0FBdUQ7SUFDbEksT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDbEIsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztTQUNqQixFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDeEU7UUFDRCxPQUFPLGFBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBWEQsa0NBV0M7QUFFRCxTQUFnQixPQUFPLENBQUksU0FBdUI7SUFDOUMsT0FBTyxXQUFXLENBQWdCLFNBQVMsRUFBRSxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5pbXBvcnQgeyBCYXNlQ29udmVydGVyLCBDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcic7XG5pbXBvcnQgeyBSYW5nZU9mLCBSYW5nZU9mUHJvcGVydGllcyB9IGZyb20gJy4vcmFuZ2VPZic7XG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcnJheSB9IGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IHsgaXNLZXlPZiB9IGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InIHwgJ2lnbm9yZUVycm9ycyc7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIHN0cmluZy4gVmFsdWVzIG9mIHR5cGVcbiAqIHN0cmluZyBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZyA9IG5ldyBCYXNlQ29udmVydGVyPHN0cmluZz4oKGZyb206IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIGZyb20gPT09ICdzdHJpbmcnXG4gICAgICAgID8gc3VjY2VlZChmcm9tIGFzIHN0cmluZylcbiAgICAgICAgOiBmYWlsKGBOb3QgYSBzdHJpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG59KTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgY29udmVydGVyIHdoaWNoIGNvbnZlcnRzIHVua25vd24gdG8gc3RyaW5nLCBhcHBseWluZ1xuICogdGVtcGxhdGUgY29udmVyc2lvbnMgc3VwcGxpZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgb3IgYXQgcnVudGltZSBhcyBjb250ZXh0LlxuICogQHBhcmFtIGRlZmF1bHRDb250ZXh0IG9wdGlvbmFsIGRlZmF1bHQgY29udGV4dCB0byB1c2UgZm9yIHRlbXBsYXRlIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVTdHJpbmcoZGVmYXVsdENvbnRleHQ/OiB1bmtub3duKTogQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxzdHJpbmcsIHVua25vd24+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4sIGNvbnRleHQ/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYSBzdHJpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gTXVzdGFjaGUucmVuZGVyKGZyb20sIGNvbnRleHQpKTtcbiAgICB9LCBkZWZhdWx0Q29udGV4dCk7XG59XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIG9uZSBvZiBhIHNldCBvZiBzdXBwbGllZCBlbnVtZXJhdGVkIHZhbHVlcy4gQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqIEFsbG93ZWQgZW51bWVyYXRlZCB2YWx1ZXMgY2FuIGFsc28gYmUgc3VwcGxpZWQgYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gdmFsdWVzIEFycmF5IG9mIGFsbG93ZWQgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhdGVkVmFsdWU8VD4odmFsdWVzOiBUW10pOiBDb252ZXJ0ZXI8VCwgVFtdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIFRbXT4sIGNvbnRleHQ/OiBUW10pOiBSZXN1bHQ8VD4gPT4ge1xuICAgICAgICBjb25zdCB2ID0gY29udGV4dCA/PyB2YWx1ZXM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdi5pbmRleE9mKGZyb20gYXMgVCk7XG4gICAgICAgIHJldHVybiAoaW5kZXggPj0gMCA/IHN1Y2NlZWQodltpbmRleF0pIDogZmFpbChgSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBhIG51bWJlci4gIE51bWJlcnMgYW5kIHN0cmluZ3NcbiAqIHdpdGggYSBudW1lcmljIGZvcm1hdCBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IG5ldyBCYXNlQ29udmVydGVyPG51bWJlcj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bTogbnVtYmVyID0gKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyA/IE51bWJlcihmcm9tKSA6IE5hTik7XG4gICAgICAgIHJldHVybiBpc05hTihudW0pXG4gICAgICAgICAgICA/IGZhaWwoYE5vdCBhIG51bWJlcjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKVxuICAgICAgICAgICAgOiBzdWNjZWVkKG51bSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIGJvb2xlYW4uIEJvb2xlYW4gdmFsdWVzIG9yIHRoZVxuICogY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmdzICd0cnVlJyBhbmQgJ2ZhbHNlJyBzdWNjZWVkLiAgQW55dGhpbmdcbiAqIGVsc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuID0gbmV3IEJhc2VDb252ZXJ0ZXI8Ym9vbGVhbj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChmcm9tLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RydWUnOiByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzogcmV0dXJuIHN1Y2NlZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBOb3QgYSBib29sZWFuOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBzdHJpbmcgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICogYXJlIHJldHVybmVkLiAgQW55dGhpbmcgZWxzZSByZXR1cm5zIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbFN0cmluZyA9IHN0cmluZy5vcHRpb25hbCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgd2hpY2ggY29udmVydHMgYW55IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAqIGJ5IHNlcGFyYXRpbmcgYXQgYSBzdXBwbGllZCBkZWxpbWl0ZXIuIERlbGltZXRlciBtYXkgYWxzbyBiZSBzdXBwbGllZFxuICogYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIFRoZSBkZWxpbWl0ZXIgYXQgd2hpY2ggdG8gc3BsaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZWRTdHJpbmcoZGVsaW1pdGVyOiBzdHJpbmcsIG9wdGlvbnM6ICdmaWx0ZXJlZCd8J2FsbCcgPSAnZmlsdGVyZWQnKTogQ29udmVydGVyPHN0cmluZ1tdLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8c3RyaW5nW10sIHN0cmluZz4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8c3RyaW5nW10sIHN0cmluZz4sIGNvbnRleHQ/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaW5nLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIGxldCBzdHJpbmdzID0gcmVzdWx0LnZhbHVlLnNwbGl0KGNvbnRleHQgPz8gZGVsaW1pdGVyKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHN0cmluZ3MgPSBzdHJpbmdzLmZpbHRlcigocykgPT4gKHMudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHN0cmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IGFuIGlzbyBmb3JtYXR0ZWQgc3RyaW5nLCBhIG51bWJlciBvciBhIERhdGUgb2JqZWN0IHRvIGEgRGF0ZSBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGlzb0RhdGUgPSBuZXcgQmFzZUNvbnZlcnRlcjxEYXRlPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSVNPKGZyb20pO1xuICAgICAgICBpZiAoZHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZHQudG9KU0RhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYEludmFsaWQgZGF0ZTogJHtkdC5pbnZhbGlkRXhwbGFuYXRpb259YCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBmcm9tID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChuZXcgRGF0ZShmcm9tKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeShmcm9tKX0gdG8gRGF0ZWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBudW1iZXIgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIG51bWJlclxuICogb3IgbnVtZXJpYyBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkLiBBbnl0aGluZyBlbHNlIHJldHVybnNcbiAqIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbE51bWJlciA9IG51bWJlci5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYm9vbGVhbiB2YWx1ZS4gVmFsdWVzIG9mIHR5cGUgYm9vbGVhblxuICogb3Igc3RyaW5ncyB0aGF0IG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKSAndHJ1ZScgb3IgJ2ZhbHNlJyBhcmUgY29udmVydGVkXG4gKiBhbmQgcmV0dXJuZWQuICBBbnl0aGluZyBlbHNlIHJldHVybnMgc3VjY2VzcyB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsQm9vbGVhbiA9IGJvb2xlYW4ub3B0aW9uYWwoKTtcblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBwb2x5bW9ycGhpYyBmaWVsZHMuIEludm9rZXMgdGhlIHdyYXBwZWQgY29udmVydGVyc1xuICogaW4gc2VxdWVuY2UsIHJldHVybmluZyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHQuICBSZXR1cm5zIGFuIGVycm9yXG4gKiBpZiBub25lIG9mIHRoZSBzdXBwbGllZCBjb252ZXJ0ZXJzIGNhbiBjb252ZXJ0IHRoZSB2YWx1ZS5cbiAqXG4gKiBJZiBvbkVycm9yIGlzICdpZ25vcmVFcnJvcnMnIChkZWZhdWx0KSwgdGhlbiBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlXG4gKiBjb252ZXJ0ZXJzIGFyZSBpZ25vcmVkIHByb3ZpZGVkIHRoYXQgc29tZSBjb252ZXJ0ZXIgc3VjY2VlZHMuICBJZlxuICogb25FcnJvciBpcyAnZmFpbE9uRXJyb3InLCB0aGVuIGFuIGVycm9yIGZyb20gYW55IGNvbnZlcnRlciBmYWlscyB0aGUgZW50aXJlXG4gKiBjb252ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJzIEFuIG9yZGVyZWQgbGlzdCBvZiBjb252ZXJ0ZXJzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2Y8VD4oY29udmVydGVyczogQXJyYXk8Q29udmVydGVyPFQ+Piwgb25FcnJvcjogT25FcnJvciA9ICdpZ25vcmVFcnJvcnMnKTogQ29udmVydGVyPFQ+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvciA9PT0gJ2ZhaWxPbkVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYE5vIG1hdGNoaW5nIGNvbnZlcnRlciBmb3IgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06ICR7ZXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgZm9yIGNvbnZlcnRpbmcgYW4gYXJyYXkgb2YgPFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlPZjxULCBUQz11bmRlZmluZWQ+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8VFtdLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUW10sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhbiBhcnJheTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NlczogVFtdID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZyb20pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGl0ZW0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3Nlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJylcbiAgICAgICAgICAgID8gc3VjY2VlZChzdWNjZXNzZXMpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBjb252ZXJ0aW5nIHRvIEl0ZW1ycmF5PFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kZWRBcnJheU9mPFQsIFRDPXVuZGVmaW5lZD4obGFiZWw6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LCBvbkVycm9yOiBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyk6IENvbnZlcnRlcjxFeHRlbmRlZEFycmF5PFQ+LCBUQz4ge1xuICAgIHJldHVybiBhcnJheU9mKGNvbnZlcnRlciwgb25FcnJvcikubWFwKChpdGVtczogVFtdKSA9PiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBFeHRlbmRlZEFycmF5KGxhYmVsLCAuLi5pdGVtcykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgdG8gY29udmVydCB0aGUgc3RyaW5nLWtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IHRvIGEgUmVjb3JkIG9mIFQuXG4gKiBJZiBvbkVycm9yIGlzICdmYWlsJyAoZGVmYXVsdCksICB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkgZWxlbWVudFxuICogY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIG9uRXJyb3IgaXMgJ2lnbm9yZScgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHJlY29yZFxuICogQHBhcmFtIGlnbm9yZUVycm9ycyBTcGVjaWZpZXMgdHJlYXRtZW50IG9mIHVuY29udmVydGFibGUgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE9mPFQsIFRDPXVuZGVmaW5lZD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LCBvbkVycm9yOiAnZmFpbCd8J2lnbm9yZScgPSAnZmFpbCcpOiBDb252ZXJ0ZXI8UmVjb3JkPHN0cmluZywgVD4sIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFJlY29yZDxzdHJpbmcsIFQ+LCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFQ+ID0ge307XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihrZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoZnJvbVtrZXldIGFzIHVua25vd24sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob25FcnJvciA9PT0gJ2lnbm9yZScpXG4gICAgICAgICAgICA/IHN1Y2NlZWQocmVjb3JkKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IHRoZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgdG8gYSBNYXAgb2YgVC5cbiAqIElmIG9uRXJyb3IgaXMgJ2ZhaWwnIChkZWZhdWx0KSwgIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvciBpcyAnaWdub3JlJyBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgcmVjb3JkXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VCwgVEM9dW5kZWZpbmVkPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sIG9uRXJyb3I6ICdmYWlsJ3wnaWdub3JlJyA9ICdmYWlsJyk6IENvbnZlcnRlcjxNYXA8c3RyaW5nLCBUPiwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8TWFwPHN0cmluZywgVD4sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICgodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB8fCBBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgc3RyaW5nLWtleWVkIG9iamVjdDogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21ba2V5XSBhcyB1bmtub3duLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCByZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgfHwgKG9uRXJyb3IgPT09ICdpZ25vcmUnKVxuICAgICAgICAgICAgPyBzdWNjZWVkKG1hcClcbiAgICAgICAgICAgIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgYW5kIGNvbnZlcnQgYSBmaWVsZCBmcm9tIGFuIG9iamVjdC4gU3VjY2VlZHMgYW5kIHJldHVybnNcbiAqIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaWYgdGhlIGZpZWxkIGV4aXN0cyBpbiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVyIGFuZCBjYW4gYmUgY29udmVydGVkLlxuICogRmFpbHMgb3RoZXJ3aXNlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGQ8VCwgVEM9dW5kZWZpbmVkPihuYW1lOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKG5hbWUsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0sIGNvbnRleHQpLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgRmllbGQgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYEZpZWxkICR7bmFtZX0gbm90IGZvdW5kIGluOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGFuZCBjb252ZXJ0IGFuIG9wdGlvbmFsIGZpZWxkIGZyb20gYW4gb2JqZWN0LiBTdWNjZWVkc1xuICogYW5kIHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpZiB0aGUgZmllbGQgZXhpc3RzIGluIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgYW5kIGNhblxuICogYmUgY29udmVydGVkLiBTdWNjZWVkcyB3aXRoIHVuZGVmaW5lZCBpZiB0aGUgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBidXQgdGhlIG5hbWVkIGZpZWxkXG4gKiBpcyBub3QgcHJlc2VudC4gRmFpbHMgaWYgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxGaWVsZDxULCBUQz11bmRlZmluZWQ+KG5hbWU6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JyAmJiBmcm9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihuYW1lLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0sIGNvbnRleHQpLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCBvciBpbnB1dCB3YXMgdW5kZWZpbmVkIHdlXG4gICAgICAgICAgICAgICAgLy8gc3VjY2VlZCB3aXRoICd1bmRlZmluZWQnLCBidXQgd2UgcHJvcGFnYXRlIGFjdHVhbFxuICAgICAgICAgICAgICAgIC8vIGZhaWx1cmVzLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgfHwgKGZyb21bbmFtZV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgRmllbGRDb252ZXJ0ZXJzPFQ+ID0geyBbIGtleSBpbiBrZXlvZiBUIF06IENvbnZlcnRlcjxUW2tleV0+IH07XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RDb252ZXJ0ZXI8VD4gZXh0ZW5kcyBCYXNlQ29udmVydGVyPFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD47XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbmFsRmllbGRzOiAoa2V5b2YgVClbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPiwgb3B0aW9uYWw/OiAoa2V5b2YgVClbXSkge1xuICAgICAgICBzdXBlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50IGJ1ZyB0aGlua3Mga2V5IGlzIHVzZWQgYmVmb3JlIGRlZmluZWRcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc09wdGlvbmFsID0gb3B0aW9uYWw/LmluY2x1ZGVzKGtleSkgPz8gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzT3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9uYWxGaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkKGtleSwgZmllbGRzW2tleV0pLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApID8gc3VjY2VlZChjb252ZXJ0ZWQpIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgdGhpcy5vcHRpb25hbEZpZWxkcyA9IG9wdGlvbmFsID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJ0aWFsKG9wdGlvbmFsPzogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4ge1xuICAgICAgICByZXR1cm4gbmV3IE9iamVjdENvbnZlcnRlcjxQYXJ0aWFsPFQ+Pih0aGlzLmZpZWxkcyBhcyBGaWVsZENvbnZlcnRlcnM8UGFydGlhbDxUPj4sIG9wdGlvbmFsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUGFydGlhbChhZGRPcHRpb25hbEZpZWxkczogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aWFsKFsuLi50aGlzLm9wdGlvbmFsRmllbGRzLCAuLi5hZGRPcHRpb25hbEZpZWxkc10pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gY29udmVydCBhbiBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBzaGFwZS4gVGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIGtleSBuYW1lcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBvYmplY3QgYW5kIHRoZSBhcHByb3ByaWF0ZSBjb3JyZXNwb25kaW5nIGNvbnZlcnRlclxuICogYXMgdGhlIHByb3BlcnR5IHZhbHVlLiBJZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMgYVxuICogbmV3IG9iamVjdCB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgZmllbGRzIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBmaWVsZHMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGVmaW5pbmcgdGhlIHNoYXBlIGFuZCBjb252ZXJ0ZXJzIHRvIGJlIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Q8VD4oZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD4sIG9wdGlvbmFsPzogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgT2JqZWN0Q29udmVydGVyKGZpZWxkcywgb3B0aW9uYWwpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBjb252ZXJ0IGFuIG9iamVjdCB0byBhIG5ldyBvYmplY3Qgd2l0aCBhIGRpZmZlcmVudCBzaGFwZS4gVGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXNcbiAqIGFuIG9iamVjdCB3aXRoIGtleSBuYW1lcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBvYmplY3QsIGFuZCBhbiBhcHByb3JpYXRlIF9maWVsZF9cbiAqIGNvbnZlcnRlciB0aGF0IHdpbGwgZXh0cmFjdCBhbmQgY29udmVydCBhIHNpbmdsZSBmaWVsZCBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICpcbiAqIElmIGFsbCBvZiB0aGUgZXh0cmFjdGVkIGZpZWxkcyBleGlzdCBhbmQgY2FuIGJlIGNvbnZlcnRlZCwgcmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aCB0aGVcbiAqIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIG9yaWdpbmFsIGtleSBuYW1lcy4gIElmIGFueSBmaWVsZHMgdG8gYmUgZXh0cmFjdGVkIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZmllbGRzIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgc2hhcGUgb2YgdGhlIHRhcmdldCBvYmplY3QgYW5kIHRoZSBmaWVsZCBjb252ZXJ0ZXJzXG4gKiB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybTxUPihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPik6IENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7fSBhcyB7IFsga2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmllbGRzW2tleV0uY29udmVydChmcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSA/IHN1Y2NlZWQoY29udmVydGVkKSA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnZlcnQgYSByYW5nZSBvZiBzb21lIG90aGVyIGNvbXBhcmFibGUgdHlwZVxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IG1pbiBhbmQgbWF4IGV4dGVudCBvZiB0aGUgcmFpZFxuICogQHBhcmFtIGNvbnN0cnVjdG9yIE9wdGlvbmFsIHN0YXRpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVR5cGVPZjxULCBSVCBleHRlbmRzIFJhbmdlT2Y8VD4+KGNvbnZlcnRlcjogQ29udmVydGVyPFQ+LCBjb25zdHJ1Y3RvcjogKGluaXQ6IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+KSA9PiBSZXN1bHQ8UlQ+KTogQ29udmVydGVyPFJUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9iamVjdCh7XG4gICAgICAgICAgICBtaW46IGNvbnZlcnRlcixcbiAgICAgICAgICAgIG1heDogY29udmVydGVyLFxuICAgICAgICB9LCBbJ21pbicsICdtYXgnXSkuY29udmVydChmcm9tKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKHsgbWluOiByZXN1bHQudmFsdWUubWluLCBtYXg6IHJlc3VsdC52YWx1ZS5tYXggfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0Lm1lc3NhZ2UpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VPZjxUPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPik6IENvbnZlcnRlcjxSYW5nZU9mPFQ+PiB7XG4gICAgcmV0dXJuIHJhbmdlVHlwZU9mPFQsIFJhbmdlT2Y8VD4+KGNvbnZlcnRlciwgUmFuZ2VPZi5jcmVhdGVSYW5nZSk7XG59XG4iXX0=
{
"name": "@fgv/ts-utils",
"version": "0.3.4",
"version": "0.3.5",
"description": "Assorted Typescript Utilities",

@@ -5,0 +5,0 @@ "main": "index.js",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc