UNPKG

ngx-modialog-11

Version:
204 lines 24.6 kB
const PRIVATE_PREFIX = '$$'; const RESERVED_REGEX = /^(\$\$).*/; function validateMethodName(name) { if (!name) { throw new Error(`Illegal method name. Empty method name is not allowed`); } else if (name in this) { throw new Error(`A member name '${name}' already defined.`); } } /** * Returns a list of assigned property names (non private) * @param subject */ function getAssignedPropertyNames(subject) { return Object.getOwnPropertyNames(subject) .filter(name => RESERVED_REGEX.test(name)) .map(name => name.substr(2)); } export function privateKey(name) { return PRIVATE_PREFIX + name; } function objectDefinePropertyValue(obj, propertyName, value) { Object.defineProperty(obj, propertyName, { configurable: false, enumerable: false, writable: false, value }); } /** * Given a FluentAssign instance, apply all of the supplied default values so calling * instance.toJSON will return those values (does not create a setter function) * @param instance * @param defaultValues */ function applyDefaultValues(instance, defaultValues) { Object.getOwnPropertyNames(defaultValues) .forEach(name => instance[privateKey(name)] = defaultValues[name]); } /** * Create a function for setting a value for a property on a given object. * @param obj The object to apply the key & setter on. * @param propertyName The name of the property on the object * @param writeOnce If true will allow writing once (default: false) * * Example: * let obj = new FluentAssign<any>; * setAssignMethod(obj, 'myProp'); * obj.myProp('someValue'); * const result = obj.toJSON(); * console.log(result); //{ myProp: 'someValue' } * * * let obj = new FluentAssign<any>; * setAssignMethod(obj, 'myProp', true); // applying writeOnce * obj.myProp('someValue'); * obj.myProp('someValue'); // ERROR: Overriding config property 'myProp' is not allowed. */ export function setAssignMethod(obj, propertyName, writeOnce = false) { validateMethodName.call(obj, propertyName); const key = privateKey(propertyName); objectDefinePropertyValue(obj, propertyName, (value) => { if (writeOnce && this.hasOwnProperty(key)) { throw new Error(`Overriding config property '${propertyName}' is not allowed.`); } obj[key] = value; return obj; }); } /** * Create a function for setting a value that is an alias to an other setter function. * @param obj The object to apply the key & setter on. * @param propertyName The name of the property on the object * @param srcPropertyName The name of the property on the object this alias points to * @param hard If true, will set a readonly property on the object that returns * the value of the source property. Default: false * * Example: * let obj = new FluentAssign<any> ; * setAssignMethod(obj, 'myProp'); * setAssignAlias(obj, 'myPropAlias', 'myProp'); * obj.myPropAlias('someValue'); * const result = obj.toJSON(); * console.log(result); //{ myProp: 'someValue' } * result.myPropAlias // undefined * * * let obj = new FluentAssign<any> ; * setAssignMethod(obj, 'myProp'); * setAssignAlias(obj, 'myPropAlias', 'myProp', true); // setting a hard alias. * obj.myPropAlias('someValue'); * const result = obj.toJSON(); * console.log(result); //{ myProp: 'someValue' } * result.myPropAlias // someValue */ export function setAssignAlias(obj, propertyName, srcPropertyName, hard = false) { validateMethodName.call(obj, propertyName); objectDefinePropertyValue(obj, propertyName, (value) => { obj[srcPropertyName](value); return obj; }); if (hard === true) { const key = privateKey(propertyName), srcKey = privateKey(srcPropertyName); Object.defineProperty(obj, key, { configurable: false, enumerable: false, get: () => obj[srcKey] }); } } /** * Represent a fluent API factory wrapper for defining FluentAssign instances. */ export class FluentAssignFactory { constructor(fluentAssign) { this._fluentAssign = fluentAssign instanceof FluentAssign ? fluentAssign : new FluentAssign(); } /** * Create a setter method on the FluentAssign instance. * @param name The name of the setter function. * @param defaultValue If set (not undefined) set's the value on the instance immediately. */ setMethod(name, defaultValue) { setAssignMethod(this._fluentAssign, name); if (defaultValue !== undefined) { this._fluentAssign[name](defaultValue); } return this; } /** * The FluentAssign instance. */ get fluentAssign() { return this._fluentAssign; } } /** * Represent an object where every property is a function representing an assignment function. * Calling each function with a value will assign the value to the object and return the object. * Calling 'toJSON' returns an object with the same properties but this time representing the * assigned values. * * This allows setting an object in a fluent API manner. * Example: let fluent = new FluentAssign<any>(undefined, ['some', 'went']); fluent.some('thing').went('wrong').toJSON(); // { some: 'thing', went: 'wrong' } */ export class FluentAssign { /** * * @param defaultValues An object representing default values for the underlying object. * @param initialSetters A list of initial setters for this FluentAssign. * @param baseType the class/type to create a new base. optional, {} is used if not supplied. */ constructor(defaultValues, initialSetters, baseType) { if (Array.isArray(defaultValues)) { defaultValues.forEach(d => applyDefaultValues(this, d)); } else if (defaultValues) { applyDefaultValues(this, defaultValues); } if (Array.isArray(initialSetters)) { initialSetters.forEach(name => setAssignMethod(this, name)); } if (baseType) { this.__fluent$base__ = baseType; } } /** * Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type. * @param defaultValues An object representing default values for the instance. * @param initialSetters A list of initial setters for the instance. */ static compose(defaultValues, initialSetters) { return FluentAssign.composeWith(new FluentAssign(defaultValues, initialSetters)); } /** * Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived * class of it. * @param fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>. */ static composeWith(fluentAssign) { return new FluentAssignFactory(fluentAssign); } toJSON() { return getAssignedPropertyNames(this) .reduce((obj, name) => { const key = privateKey(name); // re-define property descriptors (we dont want their value) const propDesc = Object.getOwnPropertyDescriptor(this, key); if (propDesc) { Object.defineProperty(obj, name, propDesc); } else { obj[name] = this[key]; } return obj; }, this.__fluent$base__ ? new this.__fluent$base__() : {}); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1ZW50LWFzc2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tb2RpYWxvZy0xMS9zcmMvbGliL2ZyYW1ld29yay9mbHVlbnQtYXNzaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztBQUM1QixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUM7QUFFbkMsU0FBUyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7S0FDMUU7U0FBTSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO0tBQzdEO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsd0JBQXdCLENBQUMsT0FBWTtJQUM1QyxPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7U0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNyQyxPQUFPLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsR0FBUSxFQUFFLFlBQVksRUFBRSxLQUEyQjtJQUNwRixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQU87UUFDNUMsWUFBWSxFQUFFLEtBQUs7UUFDbkIsVUFBVSxFQUFFLEtBQUs7UUFDakIsUUFBUSxFQUFFLEtBQUs7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SUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNDLEdBQUksQ0FBQyxJQUFJLENBQUMsR0FBUyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQU0sRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXh0ZW5kLCBhcnJheVVuaW9uIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCBQUklWQVRFX1BSRUZJWCA9ICckJCc7XHJcbmNvbnN0IFJFU0VSVkVEX1JFR0VYID0gL14oXFwkXFwkKS4qLztcclxuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kTmFtZShuYW1lOiBzdHJpbmcpIHtcclxuICBpZiAoIW5hbWUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgSWxsZWdhbCBtZXRob2QgbmFtZS4gRW1wdHkgbWV0aG9kIG5hbWUgaXMgbm90IGFsbG93ZWRgKTtcclxuICB9IGVsc2UgaWYgKG5hbWUgaW4gdGhpcykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBBIG1lbWJlciBuYW1lICcke25hbWV9JyBhbHJlYWR5IGRlZmluZWQuYCk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGxpc3Qgb2YgYXNzaWduZWQgcHJvcGVydHkgbmFtZXMgKG5vbiBwcml2YXRlKVxyXG4gKiBAcGFyYW0gc3ViamVjdFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXNzaWduZWRQcm9wZXJ0eU5hbWVzKHN1YmplY3Q6IGFueSk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3ViamVjdClcclxuICAgIC5maWx0ZXIobmFtZSA9PiBSRVNFUlZFRF9SRUdFWC50ZXN0KG5hbWUpKVxyXG4gICAgLm1hcChuYW1lID0+IG5hbWUuc3Vic3RyKDIpKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVLZXkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gUFJJVkFURV9QUkVGSVggKyBuYW1lO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvYmplY3REZWZpbmVQcm9wZXJ0eVZhbHVlKG9iajogYW55LCBwcm9wZXJ0eU5hbWUsIHZhbHVlOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwgPGFueT57XHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICB3cml0YWJsZTogZmFsc2UsXHJcbiAgICB2YWx1ZVxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogR2l2ZW4gYSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UsIGFwcGx5IGFsbCBvZiB0aGUgc3VwcGxpZWQgZGVmYXVsdCB2YWx1ZXMgc28gY2FsbGluZ1xyXG4gKiBpbnN0YW5jZS50b0pTT04gd2lsbCByZXR1cm4gdGhvc2UgdmFsdWVzIChkb2VzIG5vdCBjcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24pXHJcbiAqIEBwYXJhbSBpbnN0YW5jZVxyXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlc1xyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlEZWZhdWx0VmFsdWVzKGluc3RhbmNlOiBhbnksIGRlZmF1bHRWYWx1ZXM6IE9iamVjdCk6IHZvaWQge1xyXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRWYWx1ZXMpXHJcbiAgICAuZm9yRWFjaChuYW1lID0+ICg8YW55Pmluc3RhbmNlKVtwcml2YXRlS2V5KG5hbWUpXSA9ICg8YW55PmRlZmF1bHRWYWx1ZXMpW25hbWVdKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBnaXZlbiBvYmplY3QuXHJcbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBhcHBseSB0aGUga2V5ICYgc2V0dGVyIG9uLlxyXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0XHJcbiAqIEBwYXJhbSB3cml0ZU9uY2UgSWYgdHJ1ZSB3aWxsIGFsbG93IHdyaXRpbmcgb25jZSAoZGVmYXVsdDogZmFsc2UpXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGxldCBvYmogPSBuZXcgRmx1ZW50QXNzaWduPGFueT47XHJcbiAqIHNldEFzc2lnbk1ldGhvZChvYmosICdteVByb3AnKTtcclxuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IG9iai50b0pTT04oKTtcclxuICogY29uc29sZS5sb2cocmVzdWx0KTsgLy97IG15UHJvcDogJ3NvbWVWYWx1ZScgfVxyXG4gKlxyXG4gKlxyXG4gKiBsZXQgb2JqID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+O1xyXG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJywgdHJ1ZSk7IC8vIGFwcGx5aW5nIHdyaXRlT25jZVxyXG4gKiBvYmoubXlQcm9wKCdzb21lVmFsdWUnKTtcclxuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7IC8vIEVSUk9SOiBPdmVycmlkaW5nIGNvbmZpZyBwcm9wZXJ0eSAnbXlQcm9wJyBpcyBub3QgYWxsb3dlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRBc3NpZ25NZXRob2Q8VD4ob2JqOiBULCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgd3JpdGVPbmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICB2YWxpZGF0ZU1ldGhvZE5hbWUuY2FsbChvYmosIHByb3BlcnR5TmFtZSk7XHJcblxyXG4gIGNvbnN0IGtleSA9IHByaXZhdGVLZXkocHJvcGVydHlOYW1lKTtcclxuICBvYmplY3REZWZpbmVQcm9wZXJ0eVZhbHVlKG9iaiwgcHJvcGVydHlOYW1lLCAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgaWYgKHdyaXRlT25jZSAmJiB0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPdmVycmlkaW5nIGNvbmZpZyBwcm9wZXJ0eSAnJHtwcm9wZXJ0eU5hbWV9JyBpcyBub3QgYWxsb3dlZC5gKTtcclxuICAgIH1cclxuICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSB2YWx1ZSB0aGF0IGlzIGFuIGFsaWFzIHRvIGFuIG90aGVyIHNldHRlciBmdW5jdGlvbi5cclxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBrZXkgJiBzZXR0ZXIgb24uXHJcbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBvYmplY3RcclxuICogQHBhcmFtIHNyY1Byb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdCB0aGlzIGFsaWFzIHBvaW50cyB0b1xyXG4gKiBAcGFyYW0gaGFyZCBJZiB0cnVlLCB3aWxsIHNldCBhIHJlYWRvbmx5IHByb3BlcnR5IG9uIHRoZSBvYmplY3QgdGhhdCByZXR1cm5zXHJcbiAqICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHNvdXJjZSBwcm9wZXJ0eS4gRGVmYXVsdDogZmFsc2VcclxuICpcclxuICogRXhhbXBsZTpcclxuICogbGV0IG9iaiA9IG5ldyBGbHVlbnRBc3NpZ248YW55PiA7XHJcbiAqIHNldEFzc2lnbk1ldGhvZChvYmosICdteVByb3AnKTtcclxuICogc2V0QXNzaWduQWxpYXMob2JqLCAnbXlQcm9wQWxpYXMnLCAnbXlQcm9wJyk7XHJcbiAqIG9iai5teVByb3BBbGlhcygnc29tZVZhbHVlJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IG9iai50b0pTT04oKTtcclxuICogY29uc29sZS5sb2cocmVzdWx0KTsgLy97IG15UHJvcDogJ3NvbWVWYWx1ZScgfVxyXG4gKiByZXN1bHQubXlQcm9wQWxpYXMgLy8gdW5kZWZpbmVkXHJcbiAqXHJcbiAqXHJcbiAqIGxldCBvYmogPSBuZXcgRmx1ZW50QXNzaWduPGFueT4gO1xyXG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJyk7XHJcbiAqIHNldEFzc2lnbkFsaWFzKG9iaiwgJ215UHJvcEFsaWFzJywgJ215UHJvcCcsIHRydWUpOyAvLyBzZXR0aW5nIGEgaGFyZCBhbGlhcy5cclxuICogb2JqLm15UHJvcEFsaWFzKCdzb21lVmFsdWUnKTtcclxuICogY29uc3QgcmVzdWx0ID0gb2JqLnRvSlNPTigpO1xyXG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvL3sgbXlQcm9wOiAnc29tZVZhbHVlJyB9XHJcbiAqIHJlc3VsdC5teVByb3BBbGlhcyAvLyBzb21lVmFsdWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRBc3NpZ25BbGlhczxUPihvYmo6IFQsIHByb3BlcnR5TmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHJvcGVydHlOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICB2YWxpZGF0ZU1ldGhvZE5hbWUuY2FsbChvYmosIHByb3BlcnR5TmFtZSk7XHJcblxyXG4gIG9iamVjdERlZmluZVByb3BlcnR5VmFsdWUob2JqLCBwcm9wZXJ0eU5hbWUsICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICBvYmpbc3JjUHJvcGVydHlOYW1lXSh2YWx1ZSk7XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH0pO1xyXG5cclxuICBpZiAoaGFyZCA9PT0gdHJ1ZSkge1xyXG4gICAgY29uc3Qga2V5ID0gcHJpdmF0ZUtleShwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICBzcmNLZXkgPSBwcml2YXRlS2V5KHNyY1Byb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCA8YW55PntcclxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICAgIGdldDogKCkgPT4gb2JqW3NyY0tleV1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERlc2NyaWJlcyBhIGZsdWVudCBhc3NpZ24gbWV0aG9kLlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBhIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBpbnN0YW5jZSBpdCB3b3JrcyBvbi5cclxuICovXHJcbmV4cG9ydCB0eXBlIEZsdWVudEFzc2lnbk1ldGhvZDxULCBaPiA9ICh2YWx1ZTogVCkgPT4gWjtcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+IHtcclxuICBmbHVlbnRBc3NpZ246IFo7XHJcblxyXG4gIHNldE1ldGhvZChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+O1xyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50IGEgZmx1ZW50IEFQSSBmYWN0b3J5IHdyYXBwZXIgZm9yIGRlZmluaW5nIEZsdWVudEFzc2lnbiBpbnN0YW5jZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduRmFjdG9yeTxUPiB7XHJcbiAgcHJpdmF0ZSBfZmx1ZW50QXNzaWduOiBGbHVlbnRBc3NpZ248VD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGZsdWVudEFzc2lnbj86IEZsdWVudEFzc2lnbjxUPikge1xyXG4gICAgdGhpcy5fZmx1ZW50QXNzaWduID1cclxuICAgICAgZmx1ZW50QXNzaWduIGluc3RhbmNlb2YgRmx1ZW50QXNzaWduID8gZmx1ZW50QXNzaWduIDogPGFueT5uZXcgRmx1ZW50QXNzaWduKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBzZXR0ZXIgbWV0aG9kIG9uIHRoZSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UuXHJcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNldHRlciBmdW5jdGlvbi5cclxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIElmIHNldCAobm90IHVuZGVmaW5lZCkgc2V0J3MgdGhlIHZhbHVlIG9uIHRoZSBpbnN0YW5jZSBpbW1lZGlhdGVseS5cclxuICAgKi9cclxuICBzZXRNZXRob2QobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBGbHVlbnRBc3NpZ25GYWN0b3J5PFQ+IHtcclxuICAgIHNldEFzc2lnbk1ldGhvZCh0aGlzLl9mbHVlbnRBc3NpZ24sIG5hbWUpO1xyXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICg8YW55PnRoaXMuX2ZsdWVudEFzc2lnbilbbmFtZV0oZGVmYXVsdFZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIEZsdWVudEFzc2lnbiBpbnN0YW5jZS5cclxuICAgKi9cclxuICBnZXQgZmx1ZW50QXNzaWduKCk6IEZsdWVudEFzc2lnbjxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmx1ZW50QXNzaWduO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnQgYW4gb2JqZWN0IHdoZXJlIGV2ZXJ5IHByb3BlcnR5IGlzIGEgZnVuY3Rpb24gcmVwcmVzZW50aW5nIGFuIGFzc2lnbm1lbnQgZnVuY3Rpb24uXHJcbiAqIENhbGxpbmcgZWFjaCBmdW5jdGlvbiB3aXRoIGEgdmFsdWUgd2lsbCBhc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBvYmplY3QgYW5kIHJldHVybiB0aGUgb2JqZWN0LlxyXG4gKiBDYWxsaW5nICd0b0pTT04nIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBidXQgdGhpcyB0aW1lIHJlcHJlc2VudGluZyB0aGVcclxuICogYXNzaWduZWQgdmFsdWVzLlxyXG4gKlxyXG4gKiBUaGlzIGFsbG93cyBzZXR0aW5nIGFuIG9iamVjdCBpbiBhIGZsdWVudCBBUEkgbWFubmVyLlxyXG4gKiBFeGFtcGxlOlxyXG4gbGV0IGZsdWVudCA9IG5ldyBGbHVlbnRBc3NpZ248YW55Pih1bmRlZmluZWQsIFsnc29tZScsICd3ZW50J10pO1xyXG4gZmx1ZW50LnNvbWUoJ3RoaW5nJykud2VudCgnd3JvbmcnKS50b0pTT04oKTtcclxuIC8vIHsgc29tZTogJ3RoaW5nJywgd2VudDogJ3dyb25nJyB9XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduPFQ+IHtcclxuICBwcml2YXRlIF9fZmx1ZW50JGJhc2VfXzogbmV3ICgpID0+IFQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBGbHVlbnRBc3NpZ25GYWN0b3J5PEZsdWVudEFzc2lnbjxUPj4gcmVhZHkgdG8gZGVmaW5lIGEgRmx1ZW50QXNzaWduIHR5cGUuXHJcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZXMgQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGluc3RhbmNlLlxyXG4gICAqIEBwYXJhbSBpbml0aWFsU2V0dGVycyBBIGxpc3Qgb2YgaW5pdGlhbCBzZXR0ZXJzIGZvciB0aGUgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgc3RhdGljIGNvbXBvc2U8VD4oZGVmYXVsdFZhbHVlcz86IFQsIGluaXRpYWxTZXR0ZXJzPzogc3RyaW5nW10pOiBGbHVlbnRBc3NpZ25GYWN0b3J5PFQ+IHtcclxuXHJcbiAgICByZXR1cm4gPGFueT5GbHVlbnRBc3NpZ24uY29tcG9zZVdpdGg8Rmx1ZW50QXNzaWduPFQ+PihcclxuICAgICAgbmV3IEZsdWVudEFzc2lnbjxUPihkZWZhdWx0VmFsdWVzLCBpbml0aWFsU2V0dGVycykpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEZsdWVudEFzc2lnbkZhY3Rvcnk8Wj4gd2hlcmUgWiBpcyBhbiBpbnN0YW5jZSBvZiBGbHVlbnRBc3NpZ248Pz4gb3IgYSBkZXJpdmVkXHJcbiAgICogY2xhc3Mgb2YgaXQuXHJcbiAgICogQHBhcmFtIGZsdWVudEFzc2lnbiBBbiBpbnN0YW5jZSBvZiBGbHVlbnRBc3NpZ248Pz4gb3IgYSBkZXJpdmVkIGNsYXNzIG9mIEZsdWVudEFzc2lnbjw/Pi5cclxuICAgKi9cclxuICBzdGF0aWMgY29tcG9zZVdpdGg8Wj4oZmx1ZW50QXNzaWduOiBaKTogSUZsdWVudEFzc2lnbkZhY3Rvcnk8Wj4ge1xyXG4gICAgcmV0dXJuIDxhbnk+bmV3IEZsdWVudEFzc2lnbkZhY3Rvcnk8YW55Pig8YW55PmZsdWVudEFzc2lnbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB1bmRlcmx5aW5nIG9iamVjdC5cclxuICAgKiBAcGFyYW0gaW5pdGlhbFNldHRlcnMgQSBsaXN0IG9mIGluaXRpYWwgc2V0dGVycyBmb3IgdGhpcyBGbHVlbnRBc3NpZ24uXHJcbiAgICogQHBhcmFtIGJhc2VUeXBlIHRoZSBjbGFzcy90eXBlIHRvIGNyZWF0ZSBhIG5ldyBiYXNlLiBvcHRpb25hbCwge30gaXMgdXNlZCBpZiBub3Qgc3VwcGxpZWQuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlcz86IFQgfCBUW10sIGluaXRpYWxTZXR0ZXJzPzogc3RyaW5nW10sIGJhc2VUeXBlPzogbmV3ICgpID0+IFQpIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZXMpKSB7XHJcbiAgICAgIChkZWZhdWx0VmFsdWVzIGFzIEFycmF5PGFueT4pLmZvckVhY2goZCA9PiBhcHBseURlZmF1bHRWYWx1ZXModGhpcywgZCkpO1xyXG4gICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWVzKSB7XHJcbiAgICAgIGFwcGx5RGVmYXVsdFZhbHVlcyh0aGlzLCBkZWZhdWx0VmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0aWFsU2V0dGVycykpIHtcclxuXHJcbiAgICAgIGluaXRpYWxTZXR0ZXJzLmZvckVhY2gobmFtZSA9PiBzZXRBc3NpZ25NZXRob2QodGhpcywgbmFtZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiYXNlVHlwZSkge1xyXG4gICAgICB0aGlzLl9fZmx1ZW50JGJhc2VfXyA9IGJhc2VUeXBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9KU09OKCk6IFQge1xyXG4gICAgcmV0dXJuIGdldEFzc2lnbmVkUHJvcGVydHlOYW1lcyh0aGlzKVxyXG4gICAgICAucmVkdWNlKChvYmo6IFQsIG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHByaXZhdGVLZXkobmFtZSk7XHJcbiAgICAgICAgLy8gcmUtZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3JzICh3ZSBkb250IHdhbnQgdGhlaXIgdmFsdWUpXHJcbiAgICAgICAgY29uc3QgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIGtleSk7XHJcbiAgICAgICAgaWYgKHByb3BEZXNjKSB7XHJcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCBwcm9wRGVzYyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICg8YW55Pm9iailbbmFtZV0gPSAoPGFueT50aGlzKVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9LCB0aGlzLl9fZmx1ZW50JGJhc2VfXyA/IG5ldyB0aGlzLl9fZmx1ZW50JGJhc2VfXygpIDogPGFueT57fSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==