@kephas/core
Version:
Provides a common infrastructure for all the other Kephas Framework components: ambient services, dynamic reflection, composition, application management, and others.
142 lines • 14.7 kB
JavaScript
import 'reflect-metadata';
import { Requires } from '../diagnostics/contracts/requires';
/**
* Base class for serializable objects.
*
* @export
* @abstract
* @class Serializable
*/
export class Serializable {
/**
* Gets or sets the name of the key holding the type's full name.
*
* @static
* @type {string}
* @memberof Serializable
*/
static get TypeFullNameKey() {
return Serializable._typeFullNameKey;
}
static set TypeFullNameKey(value) {
Requires.HasValue(value, 'value');
Serializable._typeFullNameKey = value;
}
/**
* Sets the type name for serialization/deserialization purposes.
*
* @static
* @template T
* @param {AbstractType} type The type where the full name should be set.
* @param {string} typeFullName The type's full name.
*
* @memberOf Serializable
*/
static setTypeFullName(type, typeFullName) {
Requires.HasValue(typeFullName, 'typeFullName');
Reflect.defineMetadata(Serializable._typeFullNameKey, typeFullName, type);
}
/**
* Sets the type namespace for serialization/deserialization purposes.
*
* @static
* @template T
* @param {AbstractType} type The type where the type name should be set.
* @param {string} namespace The type namespace.
*
* @memberOf Serializable
*/
static setTypeNamespace(type, namespace) {
Reflect.defineMetadata(Serializable._typeNamespaceKey, namespace, type);
}
/**
* Gets the type's full name for serialization/deserialization purposes.
*
* @static
* @param {{} | AbstractType} typeOrInstance The type from where the type name should be retrieved.
* @returns {(string | undefined)} The type's full name.
*
* @memberOf Serializable
*/
static getTypeFullName(typeOrInstance) {
if (typeOrInstance instanceof Function) {
return Reflect.getOwnMetadata(Serializable._typeFullNameKey, typeOrInstance);
}
return Reflect.getOwnMetadata(Serializable._typeFullNameKey, typeOrInstance.constructor);
}
/**
* Gets the type namespace for serialization/deserialization purposes.
*
* @static
* @param {AbstractType} typeOrInstance The type from where the type name should be retrieved.
* @returns {(string | undefined)} The type name.
*
* @memberOf Serializable
*/
static getTypeNamespace(typeOrInstance) {
return Reflect.getOwnMetadata(Serializable._typeNamespaceKey, typeOrInstance);
}
/**
* Converts the provided object to a JSON representation.
*
* @static
* @param {object} obj The object to be converted.
* @returns {*} The object containing the JSON representation.
* @memberof Serializable
*/
static getJSON(obj) {
const json = {};
const type = obj.constructor;
let typeName = Serializable.getTypeFullName(type) || Serializable.getTypeFullName(obj);
if (!typeName) {
typeName = type.name;
const namespace = Serializable.getTypeNamespace(type);
if (namespace) {
typeName = `${namespace}.${typeName}`;
}
}
if (typeName) {
json[Serializable._typeFullNameKey] = typeName;
}
Object.keys(obj).forEach(propName => {
if (!propName.startsWith('_') && !propName.startsWith('#')) {
json[propName] = obj[propName];
}
});
return json;
}
/**
* Converts the provided object to a string.
*
* @static
* @param {object} obj The object to be converted.
* @returns {string} The object's string representation.
* @memberof Serializable
*/
static getString(obj) {
return JSON.stringify(Serializable.getJSON(obj));
}
/**
* Converts this object to a JSON representation.
*
* @returns {{}}
*
* @memberOf Serializable
*/
toJSON() {
return Serializable.getJSON(this);
}
/**
* Converts this object to a string.
*
* @returns {string}
*
* @memberOf Serializable
*/
toString() {
return JSON.stringify(this.toJSON());
}
}
Serializable._typeFullNameKey = '$type';
Serializable._typeNamespaceKey = 'kephas:namespace';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2VwaGFzL2NvcmUvc3JjL2xpYi9zZXJpYWxpemF0aW9uL3NlcmlhbGl6YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUk3RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQWdCLFlBQVk7SUFHOUI7Ozs7OztPQU1HO0lBQ0gsTUFBTSxLQUFLLGVBQWU7UUFDdEIsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sS0FBSyxlQUFlLENBQUMsS0FBYTtRQUNwQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQWtCLEVBQUUsWUFBb0I7UUFDM0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBa0IsRUFBRSxTQUFpQjtRQUN6RCxPQUFPLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxjQUFpQztRQUNwRCxJQUFJLGNBQWMsWUFBWSxRQUFRLEVBQUU7WUFDcEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUNoRjtRQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxjQUE0QjtRQUNoRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFXO1FBQzdCLE1BQU0sSUFBSSxHQUFZLEVBQUUsQ0FBQztRQUV6QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQzdCLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDckIsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELElBQUksU0FBUyxFQUFFO2dCQUNYLFFBQVEsR0FBRyxHQUFHLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQzthQUN6QztTQUNKO1FBQ0QsSUFBSSxRQUFRLEVBQUU7WUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsUUFBUSxDQUFDO1NBQ2xEO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUksR0FBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9DO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBVztRQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNO1FBQ1QsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxRQUFRO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0FBOUljLDZCQUFnQixHQUFXLE9BQU8sQ0FBQztBQUNuQyw4QkFBaUIsR0FBVyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IFJlcXVpcmVzIH0gZnJvbSAnLi4vZGlhZ25vc3RpY3MvY29udHJhY3RzL3JlcXVpcmVzJztcclxuaW1wb3J0IHsgRXhwYW5kbyB9IGZyb20gJy4uL2V4cGFuZG8nO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFR5cGUgfSBmcm9tICcuLi90eXBlJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBzZXJpYWxpemFibGUgb2JqZWN0cy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAYWJzdHJhY3RcclxuICogQGNsYXNzIFNlcmlhbGl6YWJsZVxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6YWJsZSB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfdHlwZUZ1bGxOYW1lS2V5OiBzdHJpbmcgPSAnJHR5cGUnO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3R5cGVOYW1lc3BhY2VLZXk6IHN0cmluZyA9ICdrZXBoYXM6bmFtZXNwYWNlJztcclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBuYW1lIG9mIHRoZSBrZXkgaG9sZGluZyB0aGUgdHlwZSdzIGZ1bGwgbmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIFNlcmlhbGl6YWJsZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0IFR5cGVGdWxsTmFtZUtleSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBTZXJpYWxpemFibGUuX3R5cGVGdWxsTmFtZUtleTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2V0IFR5cGVGdWxsTmFtZUtleSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgUmVxdWlyZXMuSGFzVmFsdWUodmFsdWUsICd2YWx1ZScpO1xyXG4gICAgICAgIFNlcmlhbGl6YWJsZS5fdHlwZUZ1bGxOYW1lS2V5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0eXBlIG5hbWUgZm9yIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIHB1cnBvc2VzLlxyXG4gICAgICpcclxuICAgICAqIEBzdGF0aWNcclxuICAgICAqIEB0ZW1wbGF0ZSBUXHJcbiAgICAgKiBAcGFyYW0ge0Fic3RyYWN0VHlwZX0gdHlwZSBUaGUgdHlwZSB3aGVyZSB0aGUgZnVsbCBuYW1lIHNob3VsZCBiZSBzZXQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZUZ1bGxOYW1lIFRoZSB0eXBlJ3MgZnVsbCBuYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJPZiBTZXJpYWxpemFibGVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNldFR5cGVGdWxsTmFtZSh0eXBlOiBBYnN0cmFjdFR5cGUsIHR5cGVGdWxsTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgUmVxdWlyZXMuSGFzVmFsdWUodHlwZUZ1bGxOYW1lLCAndHlwZUZ1bGxOYW1lJyk7XHJcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShTZXJpYWxpemFibGUuX3R5cGVGdWxsTmFtZUtleSwgdHlwZUZ1bGxOYW1lLCB0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHR5cGUgbmFtZXNwYWNlIGZvciBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cclxuICAgICAqXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAdGVtcGxhdGUgVFxyXG4gICAgICogQHBhcmFtIHtBYnN0cmFjdFR5cGV9IHR5cGUgVGhlIHR5cGUgd2hlcmUgdGhlIHR5cGUgbmFtZSBzaG91bGQgYmUgc2V0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSBUaGUgdHlwZSBuYW1lc3BhY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFNlcmlhbGl6YWJsZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2V0VHlwZU5hbWVzcGFjZSh0eXBlOiBBYnN0cmFjdFR5cGUsIG5hbWVzcGFjZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShTZXJpYWxpemFibGUuX3R5cGVOYW1lc3BhY2VLZXksIG5hbWVzcGFjZSwgdHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0eXBlJ3MgZnVsbCBuYW1lIGZvciBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cclxuICAgICAqXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAcGFyYW0ge3t9IHwgQWJzdHJhY3RUeXBlfSB0eXBlT3JJbnN0YW5jZSBUaGUgdHlwZSBmcm9tIHdoZXJlIHRoZSB0eXBlIG5hbWUgc2hvdWxkIGJlIHJldHJpZXZlZC5cclxuICAgICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgdW5kZWZpbmVkKX0gVGhlIHR5cGUncyBmdWxsIG5hbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFNlcmlhbGl6YWJsZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0VHlwZUZ1bGxOYW1lKHR5cGVPckluc3RhbmNlOiB7fSB8IEFic3RyYWN0VHlwZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHR5cGVPckluc3RhbmNlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoU2VyaWFsaXphYmxlLl90eXBlRnVsbE5hbWVLZXksIHR5cGVPckluc3RhbmNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFNlcmlhbGl6YWJsZS5fdHlwZUZ1bGxOYW1lS2V5LCB0eXBlT3JJbnN0YW5jZS5jb25zdHJ1Y3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0eXBlIG5hbWVzcGFjZSBmb3Igc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gcHVycG9zZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHN0YXRpY1xyXG4gICAgICogQHBhcmFtIHtBYnN0cmFjdFR5cGV9IHR5cGVPckluc3RhbmNlIFRoZSB0eXBlIGZyb20gd2hlcmUgdGhlIHR5cGUgbmFtZSBzaG91bGQgYmUgcmV0cmlldmVkLlxyXG4gICAgICogQHJldHVybnMgeyhzdHJpbmcgfCB1bmRlZmluZWQpfSBUaGUgdHlwZSBuYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJPZiBTZXJpYWxpemFibGVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldFR5cGVOYW1lc3BhY2UodHlwZU9ySW5zdGFuY2U6IEFic3RyYWN0VHlwZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoU2VyaWFsaXphYmxlLl90eXBlTmFtZXNwYWNlS2V5LCB0eXBlT3JJbnN0YW5jZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGUgcHJvdmlkZWQgb2JqZWN0IHRvIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkLlxyXG4gICAgICogQHJldHVybnMgeyp9IFRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgSlNPTiByZXByZXNlbnRhdGlvbi5cclxuICAgICAqIEBtZW1iZXJvZiBTZXJpYWxpemFibGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKU09OKG9iajogb2JqZWN0KToge30ge1xyXG4gICAgICAgIGNvbnN0IGpzb246IEV4cGFuZG8gPSB7fTtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IG9iai5jb25zdHJ1Y3RvcjtcclxuICAgICAgICBsZXQgdHlwZU5hbWUgPSBTZXJpYWxpemFibGUuZ2V0VHlwZUZ1bGxOYW1lKHR5cGUpIHx8IFNlcmlhbGl6YWJsZS5nZXRUeXBlRnVsbE5hbWUob2JqKTtcclxuICAgICAgICBpZiAoIXR5cGVOYW1lKSB7XHJcbiAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZS5uYW1lO1xyXG4gICAgICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBTZXJpYWxpemFibGUuZ2V0VHlwZU5hbWVzcGFjZSh0eXBlKTtcclxuICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICAgICAgICAgICAgdHlwZU5hbWUgPSBgJHtuYW1lc3BhY2V9LiR7dHlwZU5hbWV9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZU5hbWUpIHtcclxuICAgICAgICAgICAganNvbltTZXJpYWxpemFibGUuX3R5cGVGdWxsTmFtZUtleV0gPSB0eXBlTmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChwcm9wTmFtZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcHJvcE5hbWUuc3RhcnRzV2l0aCgnXycpICYmICFwcm9wTmFtZS5zdGFydHNXaXRoKCcjJykpIHtcclxuICAgICAgICAgICAgICAgIGpzb25bcHJvcE5hbWVdID0gKG9iaiBhcyBFeHBhbmRvKVtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGUgcHJvdmlkZWQgb2JqZWN0IHRvIGEgc3RyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBzdGF0aWNcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgb2JqZWN0J3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxyXG4gICAgICogQG1lbWJlcm9mIFNlcmlhbGl6YWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFN0cmluZyhvYmo6IG9iamVjdCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFNlcmlhbGl6YWJsZS5nZXRKU09OKG9iaikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBKU09OIHJlcHJlc2VudGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt7fX1cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyT2YgU2VyaWFsaXphYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0pTT04oKTogYW55IHtcclxuICAgICAgICByZXR1cm4gU2VyaWFsaXphYmxlLmdldEpTT04odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJPZiBTZXJpYWxpemFibGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==