ngx-modialog-7
Version:
Modal / Dialog for Angular
316 lines • 26.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/framework/fluent-assign.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
const PRIVATE_PREFIX = '$$';
/** @type {?} */
const RESERVED_REGEX = /^(\$\$).*/;
/**
* @param {?} name
* @return {?}
*/
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
* @return {?}
*/
function getAssignedPropertyNames(subject) {
return Object.getOwnPropertyNames(subject)
.filter((/**
* @param {?} name
* @return {?}
*/
name => RESERVED_REGEX.test(name)))
.map((/**
* @param {?} name
* @return {?}
*/
name => name.substr(2)));
}
/**
* @param {?} name
* @return {?}
*/
export function privateKey(name) {
return PRIVATE_PREFIX + name;
}
/**
* @param {?} obj
* @param {?} propertyName
* @param {?} value
* @return {?}
*/
function objectDefinePropertyValue(obj, propertyName, value) {
Object.defineProperty(obj, propertyName, (/** @type {?} */ ({
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
* @return {?}
*/
function applyDefaultValues(instance, defaultValues) {
Object.getOwnPropertyNames(defaultValues)
.forEach((/**
* @param {?} name
* @return {?}
*/
name => ((/** @type {?} */ (instance)))[privateKey(name)] = ((/** @type {?} */ (defaultValues)))[name]));
}
/**
* Create a function for setting a value for a property on a given object.
* @template T
* @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.
* @return {?}
*/
export function setAssignMethod(obj, propertyName, writeOnce = false) {
validateMethodName.call(obj, propertyName);
/** @type {?} */
const key = privateKey(propertyName);
objectDefinePropertyValue(obj, propertyName, (/**
* @param {?} value
* @return {?}
*/
(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.
* @template T
* @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
* @return {?}
*/
export function setAssignAlias(obj, propertyName, srcPropertyName, hard = false) {
validateMethodName.call(obj, propertyName);
objectDefinePropertyValue(obj, propertyName, (/**
* @param {?} value
* @return {?}
*/
(value) => {
obj[srcPropertyName](value);
return obj;
}));
if (hard === true) {
/** @type {?} */
const key = privateKey(propertyName);
/** @type {?} */
const srcKey = privateKey(srcPropertyName);
Object.defineProperty(obj, key, (/** @type {?} */ ({
configurable: false,
enumerable: false,
get: (/**
* @return {?}
*/
() => obj[srcKey])
})));
}
}
/**
* @record
* @template Z
*/
export function IFluentAssignFactory() { }
if (false) {
/** @type {?} */
IFluentAssignFactory.prototype.fluentAssign;
/**
* @param {?} name
* @param {?=} defaultValue
* @return {?}
*/
IFluentAssignFactory.prototype.setMethod = function (name, defaultValue) { };
}
/**
* Represent a fluent API factory wrapper for defining FluentAssign instances.
* @template T
*/
export class FluentAssignFactory {
/**
* @param {?=} fluentAssign
*/
constructor(fluentAssign) {
this._fluentAssign =
fluentAssign instanceof FluentAssign ? fluentAssign : (/** @type {?} */ (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.
* @return {?}
*/
setMethod(name, defaultValue) {
setAssignMethod(this._fluentAssign, name);
if (defaultValue !== undefined) {
((/** @type {?} */ (this._fluentAssign)))[name](defaultValue);
}
return this;
}
/**
* The FluentAssign instance.
* @return {?}
*/
get fluentAssign() {
return this._fluentAssign;
}
}
if (false) {
/**
* @type {?}
* @private
*/
FluentAssignFactory.prototype._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' }
* @template T
*/
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)) {
((/** @type {?} */ (defaultValues))).forEach((/**
* @param {?} d
* @return {?}
*/
d => applyDefaultValues(this, d)));
}
else if (defaultValues) {
applyDefaultValues(this, defaultValues);
}
if (Array.isArray(initialSetters)) {
initialSetters.forEach((/**
* @param {?} name
* @return {?}
*/
name => setAssignMethod(this, name)));
}
if (baseType) {
this.__fluent$base__ = baseType;
}
}
/**
* Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type.
* @template T
* @param {?=} defaultValues An object representing default values for the instance.
* @param {?=} initialSetters A list of initial setters for the instance.
* @return {?}
*/
static compose(defaultValues, initialSetters) {
return (/** @type {?} */ (FluentAssign.composeWith(new FluentAssign(defaultValues, initialSetters))));
}
/**
* Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived
* class of it.
* @template Z
* @param {?} fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>.
* @return {?}
*/
static composeWith(fluentAssign) {
return (/** @type {?} */ (new FluentAssignFactory((/** @type {?} */ (fluentAssign)))));
}
/**
* @return {?}
*/
toJSON() {
return getAssignedPropertyNames(this)
.reduce((/**
* @param {?} obj
* @param {?} name
* @return {?}
*/
(obj, name) => {
/** @type {?} */
const key = privateKey(name);
// re-define property descriptors (we dont want their value)
/** @type {?} */
const propDesc = Object.getOwnPropertyDescriptor(this, key);
if (propDesc) {
Object.defineProperty(obj, name, propDesc);
}
else {
((/** @type {?} */ (obj)))[name] = ((/** @type {?} */ (this)))[key];
}
return obj;
}), this.__fluent$base__ ? new this.__fluent$base__() : (/** @type {?} */ ({})));
}
}
if (false) {
/**
* @type {?}
* @private
*/
FluentAssign.prototype.__fluent$base__;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1ZW50LWFzc2lnbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tb2RpYWxvZy03LyIsInNvdXJjZXMiOlsibGliL2ZyYW1ld29yay9mbHVlbnQtYXNzaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztNQUVNLGNBQWMsR0FBRyxJQUFJOztNQUNyQixjQUFjLEdBQUcsV0FBVzs7Ozs7QUFFbEMsU0FBUyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7S0FDMUU7U0FBTSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO0tBQzdEO0FBQ0gsQ0FBQzs7Ozs7O0FBTUQsU0FBUyx3QkFBd0IsQ0FBQyxPQUFZO0lBQzVDLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztTQUN2QyxNQUFNOzs7O0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDO1NBQ3pDLEdBQUc7Ozs7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztBQUNqQyxDQUFDOzs7OztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNyQyxPQUFPLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDL0IsQ0FBQzs7Ozs7OztBQUVELFNBQVMseUJBQXlCLENBQUMsR0FBUSxFQUFFLFlBQVksRUFBRSxLQUEyQjtJQUNwRixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsbUJBQUs7UUFDNUMsWUFBWSxFQUFFLEtBQUs7UUFDbkIsVUFBVSxFQUFFLEtBQUs7UUFDakIsUUFBUSxFQUFFLEtBQUs7UUFDZixLQUFLO0tBQ04sRUFB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QUFFLEVBQUU7O2tCQUN6QixHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQzs7O2tCQUV0QixRQUFRLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFDM0QsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNMLENBQUMsbUJBQUssR0FBRyxFQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFLLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsR0FBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQUssRUFBRSxFQUFBLENBQUMsQ0FBQztJQUNwRSxDQUFDO0NBQ0Y7Ozs7OztJQTNEQyx1Q0FBcUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRlbmQsIGFycmF5VW5pb24gfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgUFJJVkFURV9QUkVGSVggPSAnJCQnO1xuY29uc3QgUkVTRVJWRURfUkVHRVggPSAvXihcXCRcXCQpLiovO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZE5hbWUobmFtZTogc3RyaW5nKSB7XG4gIGlmICghbmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSWxsZWdhbCBtZXRob2QgbmFtZS4gRW1wdHkgbWV0aG9kIG5hbWUgaXMgbm90IGFsbG93ZWRgKTtcbiAgfSBlbHNlIGlmIChuYW1lIGluIHRoaXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEEgbWVtYmVyIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZGVmaW5lZC5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGFzc2lnbmVkIHByb3BlcnR5IG5hbWVzIChub24gcHJpdmF0ZSlcbiAqIEBwYXJhbSBzdWJqZWN0XG4gKi9cbmZ1bmN0aW9uIGdldEFzc2lnbmVkUHJvcGVydHlOYW1lcyhzdWJqZWN0OiBhbnkpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzdWJqZWN0KVxuICAgIC5maWx0ZXIobmFtZSA9PiBSRVNFUlZFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBuYW1lLnN1YnN0cigyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlS2V5KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBQUklWQVRFX1BSRUZJWCArIG5hbWU7XG59XG5cbmZ1bmN0aW9uIG9iamVjdERlZmluZVByb3BlcnR5VmFsdWUob2JqOiBhbnksIHByb3BlcnR5TmFtZSwgdmFsdWU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwgPGFueT57XG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgdmFsdWVcbiAgfSk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UsIGFwcGx5IGFsbCBvZiB0aGUgc3VwcGxpZWQgZGVmYXVsdCB2YWx1ZXMgc28gY2FsbGluZ1xuICogaW5zdGFuY2UudG9KU09OIHdpbGwgcmV0dXJuIHRob3NlIHZhbHVlcyAoZG9lcyBub3QgY3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uKVxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlc1xuICovXG5mdW5jdGlvbiBhcHBseURlZmF1bHRWYWx1ZXMoaW5zdGFuY2U6IGFueSwgZGVmYXVsdFZhbHVlczogT2JqZWN0KTogdm9pZCB7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRWYWx1ZXMpXG4gICAgLmZvckVhY2gobmFtZSA9PiAoPGFueT5pbnN0YW5jZSlbcHJpdmF0ZUtleShuYW1lKV0gPSAoPGFueT5kZWZhdWx0VmFsdWVzKVtuYW1lXSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIGdpdmVuIG9iamVjdC5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBhcHBseSB0aGUga2V5ICYgc2V0dGVyIG9uLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdFxuICogQHBhcmFtIHdyaXRlT25jZSBJZiB0cnVlIHdpbGwgYWxsb3cgd3JpdGluZyBvbmNlIChkZWZhdWx0OiBmYWxzZSlcbiAqXG4gKiBFeGFtcGxlOlxuICogbGV0IG9iaiA9IG5ldyBGbHVlbnRBc3NpZ248YW55PjtcbiAqIHNldEFzc2lnbk1ldGhvZChvYmosICdteVByb3AnKTtcbiAqIG9iai5teVByb3AoJ3NvbWVWYWx1ZScpO1xuICogY29uc3QgcmVzdWx0ID0gb2JqLnRvSlNPTigpO1xuICogY29uc29sZS5sb2cocmVzdWx0KTsgLy97IG15UHJvcDogJ3NvbWVWYWx1ZScgfVxuICpcbiAqXG4gKiBsZXQgb2JqID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+O1xuICogc2V0QXNzaWduTWV0aG9kKG9iaiwgJ215UHJvcCcsIHRydWUpOyAvLyBhcHBseWluZyB3cml0ZU9uY2VcbiAqIG9iai5teVByb3AoJ3NvbWVWYWx1ZScpO1xuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7IC8vIEVSUk9SOiBPdmVycmlkaW5nIGNvbmZpZyBwcm9wZXJ0eSAnbXlQcm9wJyBpcyBub3QgYWxsb3dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEFzc2lnbk1ldGhvZDxUPihvYmo6IFQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB3cml0ZU9uY2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICB2YWxpZGF0ZU1ldGhvZE5hbWUuY2FsbChvYmosIHByb3BlcnR5TmFtZSk7XG5cbiAgY29uc3Qga2V5ID0gcHJpdmF0ZUtleShwcm9wZXJ0eU5hbWUpO1xuICBvYmplY3REZWZpbmVQcm9wZXJ0eVZhbHVlKG9iaiwgcHJvcGVydHlOYW1lLCAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlmICh3cml0ZU9uY2UgJiYgdGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE92ZXJyaWRpbmcgY29uZmlnIHByb3BlcnR5ICcke3Byb3BlcnR5TmFtZX0nIGlzIG5vdCBhbGxvd2VkLmApO1xuICAgIH1cbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBvYmo7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgdmFsdWUgdGhhdCBpcyBhbiBhbGlhcyB0byBhbiBvdGhlciBzZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gYXBwbHkgdGhlIGtleSAmIHNldHRlciBvbi5cbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBvYmplY3RcbiAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBvYmplY3QgdGhpcyBhbGlhcyBwb2ludHMgdG9cbiAqIEBwYXJhbSBoYXJkIElmIHRydWUsIHdpbGwgc2V0IGEgcmVhZG9ubHkgcHJvcGVydHkgb24gdGhlIG9iamVjdCB0aGF0IHJldHVybnNcbiAqICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHNvdXJjZSBwcm9wZXJ0eS4gRGVmYXVsdDogZmFsc2VcbiAqXG4gKiBFeGFtcGxlOlxuICogbGV0IG9iaiA9IG5ldyBGbHVlbnRBc3NpZ248YW55PiA7XG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJyk7XG4gKiBzZXRBc3NpZ25BbGlhcyhvYmosICdteVByb3BBbGlhcycsICdteVByb3AnKTtcbiAqIG9iai5teVByb3BBbGlhcygnc29tZVZhbHVlJyk7XG4gKiBjb25zdCByZXN1bHQgPSBvYmoudG9KU09OKCk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvL3sgbXlQcm9wOiAnc29tZVZhbHVlJyB9XG4gKiByZXN1bHQubXlQcm9wQWxpYXMgLy8gdW5kZWZpbmVkXG4gKlxuICpcbiAqIGxldCBvYmogPSBuZXcgRmx1ZW50QXNzaWduPGFueT4gO1xuICogc2V0QXNzaWduTWV0aG9kKG9iaiwgJ215UHJvcCcpO1xuICogc2V0QXNzaWduQWxpYXMob2JqLCAnbXlQcm9wQWxpYXMnLCAnbXlQcm9wJywgdHJ1ZSk7IC8vIHNldHRpbmcgYSBoYXJkIGFsaWFzLlxuICogb2JqLm15UHJvcEFsaWFzKCdzb21lVmFsdWUnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IG9iai50b0pTT04oKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8veyBteVByb3A6ICdzb21lVmFsdWUnIH1cbiAqIHJlc3VsdC5teVByb3BBbGlhcyAvLyBzb21lVmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEFzc2lnbkFsaWFzPFQ+KG9iajogVCwgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gIHZhbGlkYXRlTWV0aG9kTmFtZS5jYWxsKG9iaiwgcHJvcGVydHlOYW1lKTtcblxuICBvYmplY3REZWZpbmVQcm9wZXJ0eVZhbHVlKG9iaiwgcHJvcGVydHlOYW1lLCAodmFsdWU6IGFueSkgPT4ge1xuICAgIG9ialtzcmNQcm9wZXJ0eU5hbWVdKHZhbHVlKTtcbiAgICByZXR1cm4gb2JqO1xuICB9KTtcblxuICBpZiAoaGFyZCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IGtleSA9IHByaXZhdGVLZXkocHJvcGVydHlOYW1lKSxcbiAgICAgIHNyY0tleSA9IHByaXZhdGVLZXkoc3JjUHJvcGVydHlOYW1lKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgPGFueT57XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6ICgpID0+IG9ialtzcmNLZXldXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBmbHVlbnQgYXNzaWduIG1ldGhvZC5cbiAqIEEgZnVuY3Rpb24gdGhhdCBnZXRzIGEgdmFsdWUgYW5kIHJldHVybnMgdGhlIGluc3RhbmNlIGl0IHdvcmtzIG9uLlxuICovXG5leHBvcnQgdHlwZSBGbHVlbnRBc3NpZ25NZXRob2Q8VCwgWj4gPSAodmFsdWU6IFQpID0+IFo7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJRmx1ZW50QXNzaWduRmFjdG9yeTxaPiB7XG4gIGZsdWVudEFzc2lnbjogWjtcblxuICBzZXRNZXRob2QobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBJRmx1ZW50QXNzaWduRmFjdG9yeTxaPjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnQgYSBmbHVlbnQgQVBJIGZhY3Rvcnkgd3JhcHBlciBmb3IgZGVmaW5pbmcgRmx1ZW50QXNzaWduIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZsdWVudEFzc2lnbkZhY3Rvcnk8VD4ge1xuICBwcml2YXRlIF9mbHVlbnRBc3NpZ246IEZsdWVudEFzc2lnbjxUPjtcblxuICBjb25zdHJ1Y3RvcihmbHVlbnRBc3NpZ24/OiBGbHVlbnRBc3NpZ248VD4pIHtcbiAgICB0aGlzLl9mbHVlbnRBc3NpZ24gPVxuICAgICAgZmx1ZW50QXNzaWduIGluc3RhbmNlb2YgRmx1ZW50QXNzaWduID8gZmx1ZW50QXNzaWduIDogPGFueT5uZXcgRmx1ZW50QXNzaWduKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2V0dGVyIG1ldGhvZCBvbiB0aGUgRmx1ZW50QXNzaWduIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2V0dGVyIGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIElmIHNldCAobm90IHVuZGVmaW5lZCkgc2V0J3MgdGhlIHZhbHVlIG9uIHRoZSBpbnN0YW5jZSBpbW1lZGlhdGVseS5cbiAgICovXG4gIHNldE1ldGhvZChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IEZsdWVudEFzc2lnbkZhY3Rvcnk8VD4ge1xuICAgIHNldEFzc2lnbk1ldGhvZCh0aGlzLl9mbHVlbnRBc3NpZ24sIG5hbWUpO1xuICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgKDxhbnk+dGhpcy5fZmx1ZW50QXNzaWduKVtuYW1lXShkZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgRmx1ZW50QXNzaWduIGluc3RhbmNlLlxuICAgKi9cbiAgZ2V0IGZsdWVudEFzc2lnbigpOiBGbHVlbnRBc3NpZ248VD4ge1xuICAgIHJldHVybiB0aGlzLl9mbHVlbnRBc3NpZ247XG4gIH1cbn1cblxuXG4vKipcbiAqIFJlcHJlc2VudCBhbiBvYmplY3Qgd2hlcmUgZXZlcnkgcHJvcGVydHkgaXMgYSBmdW5jdGlvbiByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCBmdW5jdGlvbi5cbiAqIENhbGxpbmcgZWFjaCBmdW5jdGlvbiB3aXRoIGEgdmFsdWUgd2lsbCBhc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBvYmplY3QgYW5kIHJldHVybiB0aGUgb2JqZWN0LlxuICogQ2FsbGluZyAndG9KU09OJyByZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMgYnV0IHRoaXMgdGltZSByZXByZXNlbnRpbmcgdGhlXG4gKiBhc3NpZ25lZCB2YWx1ZXMuXG4gKlxuICogVGhpcyBhbGxvd3Mgc2V0dGluZyBhbiBvYmplY3QgaW4gYSBmbHVlbnQgQVBJIG1hbm5lci5cbiAqIEV4YW1wbGU6XG4gbGV0IGZsdWVudCA9IG5ldyBGbHVlbnRBc3NpZ248YW55Pih1bmRlZmluZWQsIFsnc29tZScsICd3ZW50J10pO1xuIGZsdWVudC5zb21lKCd0aGluZycpLndlbnQoJ3dyb25nJykudG9KU09OKCk7XG4gLy8geyBzb21lOiAndGhpbmcnLCB3ZW50OiAnd3JvbmcnIH1cbiAqL1xuZXhwb3J0IGNsYXNzIEZsdWVudEFzc2lnbjxUPiB7XG4gIHByaXZhdGUgX19mbHVlbnQkYmFzZV9fOiBuZXcgKCkgPT4gVDtcblxuICAvKipcbiAgICogUmV0dXJucyBhIEZsdWVudEFzc2lnbkZhY3Rvcnk8Rmx1ZW50QXNzaWduPFQ+PiByZWFkeSB0byBkZWZpbmUgYSBGbHVlbnRBc3NpZ24gdHlwZS5cbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZXMgQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaW5pdGlhbFNldHRlcnMgQSBsaXN0IG9mIGluaXRpYWwgc2V0dGVycyBmb3IgdGhlIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNvbXBvc2U8VD4oZGVmYXVsdFZhbHVlcz86IFQsIGluaXRpYWxTZXR0ZXJzPzogc3RyaW5nW10pOiBGbHVlbnRBc3NpZ25GYWN0b3J5PFQ+IHtcblxuICAgIHJldHVybiA8YW55PkZsdWVudEFzc2lnbi5jb21wb3NlV2l0aDxGbHVlbnRBc3NpZ248VD4+KFxuICAgICAgbmV3IEZsdWVudEFzc2lnbjxUPihkZWZhdWx0VmFsdWVzLCBpbml0aWFsU2V0dGVycykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBGbHVlbnRBc3NpZ25GYWN0b3J5PFo+IHdoZXJlIFogaXMgYW4gaW5zdGFuY2Ugb2YgRmx1ZW50QXNzaWduPD8+IG9yIGEgZGVyaXZlZFxuICAgKiBjbGFzcyBvZiBpdC5cbiAgICogQHBhcmFtIGZsdWVudEFzc2lnbiBBbiBpbnN0YW5jZSBvZiBGbHVlbnRBc3NpZ248Pz4gb3IgYSBkZXJpdmVkIGNsYXNzIG9mIEZsdWVudEFzc2lnbjw/Pi5cbiAgICovXG4gIHN0YXRpYyBjb21wb3NlV2l0aDxaPihmbHVlbnRBc3NpZ246IFopOiBJRmx1ZW50QXNzaWduRmFjdG9yeTxaPiB7XG4gICAgcmV0dXJuIDxhbnk+bmV3IEZsdWVudEFzc2lnbkZhY3Rvcnk8YW55Pig8YW55PmZsdWVudEFzc2lnbik7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZXMgQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHVuZGVybHlpbmcgb2JqZWN0LlxuICAgKiBAcGFyYW0gaW5pdGlhbFNldHRlcnMgQSBsaXN0IG9mIGluaXRpYWwgc2V0dGVycyBmb3IgdGhpcyBGbHVlbnRBc3NpZ24uXG4gICAqIEBwYXJhbSBiYXNlVHlwZSB0aGUgY2xhc3MvdHlwZSB0byBjcmVhdGUgYSBuZXcgYmFzZS4gb3B0aW9uYWwsIHt9IGlzIHVzZWQgaWYgbm90IHN1cHBsaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlcz86IFQgfCBUW10sIGluaXRpYWxTZXR0ZXJzPzogc3RyaW5nW10sIGJhc2VUeXBlPzogbmV3ICgpID0+IFQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWVzKSkge1xuICAgICAgKGRlZmF1bHRWYWx1ZXMgYXMgQXJyYXk8YW55PikuZm9yRWFjaChkID0+IGFwcGx5RGVmYXVsdFZhbHVlcyh0aGlzLCBkKSk7XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWVzKSB7XG4gICAgICBhcHBseURlZmF1bHRWYWx1ZXModGhpcywgZGVmYXVsdFZhbHVlcyk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdGlhbFNldHRlcnMpKSB7XG5cbiAgICAgIGluaXRpYWxTZXR0ZXJzLmZvckVhY2gobmFtZSA9PiBzZXRBc3NpZ25NZXRob2QodGhpcywgbmFtZSkpO1xuICAgIH1cblxuICAgIGlmIChiYXNlVHlwZSkge1xuICAgICAgdGhpcy5fX2ZsdWVudCRiYXNlX18gPSBiYXNlVHlwZTtcbiAgICB9XG4gIH1cblxuICB0b0pTT04oKTogVCB7XG4gICAgcmV0dXJuIGdldEFzc2lnbmVkUHJvcGVydHlOYW1lcyh0aGlzKVxuICAgICAgLnJlZHVjZSgob2JqOiBULCBuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gcHJpdmF0ZUtleShuYW1lKTtcbiAgICAgICAgLy8gcmUtZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3JzICh3ZSBkb250IHdhbnQgdGhlaXIgdmFsdWUpXG4gICAgICAgIGNvbnN0IHByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBrZXkpO1xuICAgICAgICBpZiAocHJvcERlc2MpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCBwcm9wRGVzYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKDxhbnk+b2JqKVtuYW1lXSA9ICg8YW55PnRoaXMpW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0sIHRoaXMuX19mbHVlbnQkYmFzZV9fID8gbmV3IHRoaXMuX19mbHVlbnQkYmFzZV9fKCkgOiA8YW55Pnt9KTtcbiAgfVxufVxuIl19