ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
404 lines (344 loc) • 43.3 kB
JavaScript
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { CLASS_META } from '@glimmer/object-reference';
import { dict, assign } from '@glimmer/util';
import { ClassMeta, InstanceMeta, turbocharge } from './object';
import { ROOT } from './utils';
var isArray = Array.isArray;
export var DESCRIPTOR = "5d90f84f-908e-4a42-9749-3d0f523c262c";
export var BLUEPRINT = "8d97cf5f-db9e-48d8-a6b2-7a75b7170805";
export var Descriptor = function Descriptor() {
_classCallCheck(this, Descriptor);
this["5d90f84f-908e-4a42-9749-3d0f523c262c"] = true;
};
export var Blueprint = function Blueprint() {
_classCallCheck(this, Blueprint);
this["8d97cf5f-db9e-48d8-a6b2-7a75b7170805"] = true;
};
export var Mixin = function () {
function Mixin(extensions, mixins) {
var _dependencies;
_classCallCheck(this, Mixin);
this.extensions = null;
this.concatenatedProperties = [];
this.mergedProperties = [];
this.dependencies = [];
this.reopen(extensions);
(_dependencies = this.dependencies).push.apply(_dependencies, mixins);
}
Mixin.create = function create() {
for (var _len = arguments.length, args = Array(_len), _key2 = 0; _key2 < _len; _key2++) {
args[_key2] = arguments[_key2];
}
var extensions = args[args.length - 1];
if (args.length === 0) {
return new this({}, []);
} else if (extensions instanceof Mixin) {
return new this({}, args);
} else {
var deps = args.slice(0, -1).map(toMixin);
return new this(extensions, deps);
}
};
Mixin.mixins = function mixins(obj) {
if (typeof obj !== 'object' || obj === null) return [];
var meta = ClassMeta.for(obj);
if (!meta) return [];
return meta.getAppliedMixins();
};
Mixin.prototype.detect = function detect(obj) {
if (typeof obj !== 'object' || obj === null) return false;
if (obj instanceof Mixin) {
return obj.dependencies.indexOf(this) !== -1;
}
var meta = ClassMeta.for(obj);
return !!meta && meta.hasAppliedMixin(this);
};
Mixin.prototype.reopen = function reopen(extensions) {
if (this.extensions) {
this.dependencies.push(toMixin(this.extensions));
}
if (typeof extensions === 'object' && 'concatenatedProperties' in extensions) {
var concat = void 0;
var rawConcat = extensions.concatenatedProperties;
if (isArray(rawConcat)) {
concat = rawConcat.slice();
} else if (rawConcat === null || rawConcat === undefined) {
concat = [];
} else {
concat = [rawConcat];
}
delete extensions.concatenatedProperties;
this.concatenatedProperties = concat;
}
if (typeof extensions === 'object' && 'mergedProperties' in extensions) {
var merged = void 0;
var rawMerged = extensions.mergedProperties;
if (isArray(rawMerged)) {
merged = rawMerged.slice();
} else if (rawMerged === null || rawMerged === undefined) {
merged = [];
} else {
merged = [rawMerged];
}
delete extensions.mergedProperties;
this.mergedProperties = merged;
}
var normalized = Object.keys(extensions).reduce(function (obj, key) {
var value = extensions[key];
switch (typeof value) {
case 'function':
obj[key] = new MethodBlueprint({ value: value });
break;
case 'object':
if (value && BLUEPRINT in value) {
obj[key] = value;
break;
}
/* falls through */
default:
obj[key] = new DataBlueprint({ value: value });
}
return obj;
}, dict());
this.extensions = dict();
assign(this.extensions, turbocharge(normalized));
};
Mixin.prototype.apply = function apply(target) {
var meta = target[CLASS_META] = target[CLASS_META] || new ClassMeta();
this.dependencies.forEach(function (m) {
return m.apply(target);
});
this.mergeProperties(target, target, meta);
meta.addMixin(this);
meta.seal();
meta.reseal(target);
return target;
};
Mixin.prototype.extendPrototype = function extendPrototype(Original) {
Original.prototype = Object.create(Original.prototype);
this.dependencies.forEach(function (m) {
return m.extendPrototype(Original);
});
this.extendPrototypeOnto(Original, Original);
};
Mixin.prototype.extendPrototypeOnto = function extendPrototypeOnto(Subclass, Parent) {
this.dependencies.forEach(function (m) {
return m.extendPrototypeOnto(Subclass, Parent);
});
this.mergeProperties(Subclass.prototype, Parent.prototype, Subclass[CLASS_META]);
Subclass[CLASS_META].addMixin(this);
};
Mixin.prototype.extendStatic = function extendStatic(Target) {
this.dependencies.forEach(function (m) {
return m.extendStatic(Target);
});
this.mergeProperties(Target, Object.getPrototypeOf(Target), Target[CLASS_META][CLASS_META]);
Target[CLASS_META].addStaticMixin(this);
};
Mixin.prototype.mergeProperties = function mergeProperties(target, parent, meta) {
var _this = this;
if (meta.hasAppliedMixin(this)) return;
meta.addAppliedMixin(this);
this.mergedProperties.forEach(function (k) {
return meta.addMergedProperty(k, parent[k]);
});
this.concatenatedProperties.forEach(function (k) {
return meta.addConcatenatedProperty(k, []);
});
new ValueDescriptor({ value: meta.getConcatenatedProperties() }).define(target, 'concatenatedProperties');
new ValueDescriptor({ value: meta.getMergedProperties() }).define(target, 'mergedProperties');
Object.keys(this.extensions).forEach(function (key) {
var extension = _this.extensions[key];
var desc = extension.descriptor(target, key, meta);
desc.define(target, key, parent);
});
new ValueDescriptor({ value: ROOT }).define(target, '_super');
};
return Mixin;
}();
export function extend(Parent) {
var Super = Parent;
var Subclass = function (_Super) {
_inherits(Subclass, _Super);
function Subclass() {
_classCallCheck(this, Subclass);
return _possibleConstructorReturn(this, _Super.apply(this, arguments));
}
return Subclass;
}(Super);
Subclass[CLASS_META] = InstanceMeta.fromParent(Parent[CLASS_META]);
for (var _len2 = arguments.length, extensions = Array(_len2 > 1 ? _len2 - 1 : 0), _key3 = 1; _key3 < _len2; _key3++) {
extensions[_key3 - 1] = arguments[_key3];
}
var mixins = extensions.map(toMixin);
Parent[CLASS_META].addSubclass(Subclass);
mixins.forEach(function (m) {
return Subclass[CLASS_META].addMixin(m);
});
ClassMeta.applyAllMixins(Subclass, Parent);
return Subclass;
}
export function relinkSubclasses(Parent) {
Parent[CLASS_META].getSubclasses().forEach(function (Subclass) {
Subclass[CLASS_META].reset(Parent[CLASS_META]);
Subclass.prototype = Object.create(Parent.prototype);
ClassMeta.applyAllMixins(Subclass, Parent);
// recurse into sub-subclasses
relinkSubclasses(Subclass);
});
}
export function toMixin(extension) {
if (extension instanceof Mixin) return extension;else return new Mixin(extension, []);
}
var ValueDescriptor = function (_Descriptor) {
_inherits(ValueDescriptor, _Descriptor);
function ValueDescriptor(_ref) {
var _ref$enumerable = _ref.enumerable,
enumerable = _ref$enumerable === undefined ? true : _ref$enumerable,
_ref$configurable = _ref.configurable,
configurable = _ref$configurable === undefined ? true : _ref$configurable,
_ref$writable = _ref.writable,
writable = _ref$writable === undefined ? true : _ref$writable,
value = _ref.value;
_classCallCheck(this, ValueDescriptor);
var _this3 = _possibleConstructorReturn(this, _Descriptor.call(this));
_this3.enumerable = enumerable;
_this3.configurable = configurable;
_this3.writable = writable;
_this3.value = value;
return _this3;
}
ValueDescriptor.prototype.define = function define(target, key, _home) {
Object.defineProperty(target, key, {
enumerable: this.enumerable,
configurable: this.configurable,
writable: this.writable,
value: this.value
});
};
return ValueDescriptor;
}(Descriptor);
export var DataBlueprint = function (_Blueprint) {
_inherits(DataBlueprint, _Blueprint);
function DataBlueprint(_ref2) {
var _ref2$enumerable = _ref2.enumerable,
enumerable = _ref2$enumerable === undefined ? true : _ref2$enumerable,
_ref2$configurable = _ref2.configurable,
configurable = _ref2$configurable === undefined ? true : _ref2$configurable,
_ref2$writable = _ref2.writable,
writable = _ref2$writable === undefined ? true : _ref2$writable,
value = _ref2.value;
_classCallCheck(this, DataBlueprint);
var _this4 = _possibleConstructorReturn(this, _Blueprint.call(this));
_this4.enumerable = enumerable;
_this4.configurable = configurable;
_this4.value = value;
_this4.writable = writable;
return _this4;
}
DataBlueprint.prototype.descriptor = function descriptor(_target, key, classMeta) {
var enumerable = this.enumerable,
configurable = this.configurable,
writable = this.writable,
value = this.value;
if (classMeta.hasConcatenatedProperty(key)) {
classMeta.addConcatenatedProperty(key, value);
value = classMeta.getConcatenatedProperty(key);
} else if (classMeta.hasMergedProperty(key)) {
classMeta.addMergedProperty(key, value);
value = classMeta.getMergedProperty(key);
}
return new ValueDescriptor({ enumerable: enumerable, configurable: configurable, writable: writable, value: value });
};
return DataBlueprint;
}(Blueprint);
export var AccessorBlueprint = function (_Blueprint2) {
_inherits(AccessorBlueprint, _Blueprint2);
function AccessorBlueprint(_ref3) {
var _ref3$enumerable = _ref3.enumerable,
enumerable = _ref3$enumerable === undefined ? true : _ref3$enumerable,
_ref3$configurable = _ref3.configurable,
configurable = _ref3$configurable === undefined ? true : _ref3$configurable,
get = _ref3.get,
set = _ref3.set;
_classCallCheck(this, AccessorBlueprint);
var _this5 = _possibleConstructorReturn(this, _Blueprint2.call(this));
_this5.enumerable = enumerable;
_this5.configurable = configurable;
_this5.get = get;
_this5.set = set;
return _this5;
}
AccessorBlueprint.prototype.descriptor = function descriptor(_target, _key, _classMeta) {
return new ValueDescriptor({
enumerable: this.enumerable,
configurable: this.configurable,
get: this.get,
set: this.set
});
};
return AccessorBlueprint;
}(Blueprint);
var MethodDescriptor = function (_ValueDescriptor) {
_inherits(MethodDescriptor, _ValueDescriptor);
function MethodDescriptor() {
_classCallCheck(this, MethodDescriptor);
return _possibleConstructorReturn(this, _ValueDescriptor.apply(this, arguments));
}
MethodDescriptor.prototype.define = function define(target, key, home) {
this.value = wrapMethod(home, key, this.value);
_ValueDescriptor.prototype.define.call(this, target, key, home);
};
return MethodDescriptor;
}(ValueDescriptor);
var MethodBlueprint = function (_DataBlueprint) {
_inherits(MethodBlueprint, _DataBlueprint);
function MethodBlueprint() {
_classCallCheck(this, MethodBlueprint);
return _possibleConstructorReturn(this, _DataBlueprint.apply(this, arguments));
}
MethodBlueprint.prototype.descriptor = function descriptor(target, key, classMeta) {
var desc = _DataBlueprint.prototype.descriptor.call(this, target, key, classMeta);
return new MethodDescriptor(desc);
};
return MethodBlueprint;
}(DataBlueprint);
export function wrapMethod(home, methodName, original) {
if (!(methodName in home)) return maybeWrap(original);
var superMethod = home[methodName];
var func = function () {
for (var _len3 = arguments.length, args = Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {
args[_key4] = arguments[_key4];
}
if (!this) return original.apply(this, args);
var lastSuper = this._super;
this._super = superMethod;
try {
return original.apply(this, args);
} finally {
this._super = lastSuper;
}
};
func.__wrapped = true;
return func;
}
function maybeWrap(original) {
if ('__wrapped' in original) return original;
return function () {
for (var _len4 = arguments.length, args = Array(_len4), _key5 = 0; _key5 < _len4; _key5++) {
args[_key5] = arguments[_key5];
}
if (!this) return original.apply(this, args);
var lastSuper = this._super;
this._super = ROOT;
try {
return original.apply(this, args);
} finally {
this._super = lastSuper;
}
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9taXhpbi5qcyJdLCJuYW1lcyI6WyJDTEFTU19NRVRBIiwiZGljdCIsImFzc2lnbiIsIkNsYXNzTWV0YSIsIkluc3RhbmNlTWV0YSIsInR1cmJvY2hhcmdlIiwiUk9PVCIsImlzQXJyYXkiLCJBcnJheSIsIkRFU0NSSVBUT1IiLCJCTFVFUFJJTlQiLCJEZXNjcmlwdG9yIiwiQmx1ZXByaW50IiwiTWl4aW4iLCJleHRlbnNpb25zIiwibWl4aW5zIiwiY29uY2F0ZW5hdGVkUHJvcGVydGllcyIsIm1lcmdlZFByb3BlcnRpZXMiLCJkZXBlbmRlbmNpZXMiLCJyZW9wZW4iLCJwdXNoIiwiY3JlYXRlIiwiYXJncyIsImxlbmd0aCIsImRlcHMiLCJzbGljZSIsIm1hcCIsInRvTWl4aW4iLCJvYmoiLCJtZXRhIiwiZm9yIiwiZ2V0QXBwbGllZE1peGlucyIsImRldGVjdCIsImluZGV4T2YiLCJoYXNBcHBsaWVkTWl4aW4iLCJjb25jYXQiLCJyYXdDb25jYXQiLCJ1bmRlZmluZWQiLCJtZXJnZWQiLCJyYXdNZXJnZWQiLCJub3JtYWxpemVkIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImtleSIsInZhbHVlIiwiTWV0aG9kQmx1ZXByaW50IiwiRGF0YUJsdWVwcmludCIsImFwcGx5IiwidGFyZ2V0IiwiZm9yRWFjaCIsIm0iLCJtZXJnZVByb3BlcnRpZXMiLCJhZGRNaXhpbiIsInNlYWwiLCJyZXNlYWwiLCJleHRlbmRQcm90b3R5cGUiLCJPcmlnaW5hbCIsInByb3RvdHlwZSIsImV4dGVuZFByb3RvdHlwZU9udG8iLCJTdWJjbGFzcyIsIlBhcmVudCIsImV4dGVuZFN0YXRpYyIsIlRhcmdldCIsImdldFByb3RvdHlwZU9mIiwiYWRkU3RhdGljTWl4aW4iLCJwYXJlbnQiLCJhZGRBcHBsaWVkTWl4aW4iLCJhZGRNZXJnZWRQcm9wZXJ0eSIsImsiLCJhZGRDb25jYXRlbmF0ZWRQcm9wZXJ0eSIsIlZhbHVlRGVzY3JpcHRvciIsImdldENvbmNhdGVuYXRlZFByb3BlcnRpZXMiLCJkZWZpbmUiLCJnZXRNZXJnZWRQcm9wZXJ0aWVzIiwiZXh0ZW5zaW9uIiwiZGVzYyIsImRlc2NyaXB0b3IiLCJleHRlbmQiLCJTdXBlciIsImZyb21QYXJlbnQiLCJhZGRTdWJjbGFzcyIsImFwcGx5QWxsTWl4aW5zIiwicmVsaW5rU3ViY2xhc3NlcyIsImdldFN1YmNsYXNzZXMiLCJyZXNldCIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl9ob21lIiwiZGVmaW5lUHJvcGVydHkiLCJfdGFyZ2V0IiwiY2xhc3NNZXRhIiwiaGFzQ29uY2F0ZW5hdGVkUHJvcGVydHkiLCJnZXRDb25jYXRlbmF0ZWRQcm9wZXJ0eSIsImhhc01lcmdlZFByb3BlcnR5IiwiZ2V0TWVyZ2VkUHJvcGVydHkiLCJBY2Nlc3NvckJsdWVwcmludCIsImdldCIsInNldCIsIl9rZXkiLCJfY2xhc3NNZXRhIiwiTWV0aG9kRGVzY3JpcHRvciIsImhvbWUiLCJ3cmFwTWV0aG9kIiwibWV0aG9kTmFtZSIsIm9yaWdpbmFsIiwibWF5YmVXcmFwIiwic3VwZXJNZXRob2QiLCJmdW5jIiwibGFzdFN1cGVyIiwiX3N1cGVyIiwiX193cmFwcGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLFNBQVNBLFVBQVQsUUFBMkIsMkJBQTNCO0FBQ0EsU0FBU0MsSUFBVCxFQUFlQyxNQUFmLFFBQTZCLGVBQTdCO0FBQ0EsU0FBU0MsU0FBVCxFQUFvQkMsWUFBcEIsRUFBa0NDLFdBQWxDLFFBQXFELFVBQXJEO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixTQUFyQjtJQUNRQyxPLEdBQVlDLEssQ0FBWkQsTzs7QUFDUixPQUFPLElBQU1FLGFBQWEsc0NBQW5CO0FBQ1AsT0FBTyxJQUFNQyxZQUFZLHNDQUFsQjtBQUNQLFdBQWFDLFVBQWIsR0FDSSxzQkFBYztBQUFBOztBQUNWLFNBQUssc0NBQUwsSUFBK0MsSUFBL0M7QUFDSCxDQUhMO0FBS0EsV0FBYUMsU0FBYixHQUNJLHFCQUFjO0FBQUE7O0FBQ1YsU0FB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O0FBQUEsMkNBQU5wRixJQUFNO0FBQU5BLGdCQUFNO0FBQUE7O0FBQ3RCLFlBQUksQ0FBQyxJQUFMLEVBQVcsT0FBT29GLFNBQVMxRCxLQUFULENBQWUsSUFBZixFQUFxQjFCLElBQXJCLENBQVA7QUFDWCxZQUFJd0YsWUFBWSxLQUFLQyxNQUFyQjtBQUNBLGFBQUtBLE1BQUwsR0FBY3pHLElBQWQ7QUFDQSxZQUFJO0FBQ0EsbUJBQU9vRyxTQUFTMUQsS0FBVCxDQUFlLElBQWYsRUFBcUIxQixJQUFyQixDQUFQO0FBQ0gsU0FGRCxTQUVVO0FBQ04saUJBQUt5RixNQUFMLEdBQWNELFNBQWQ7QUFDSDtBQUNKLEtBVEQ7QUFVSCIsImZpbGUiOiJsaWIvbWl4aW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDTEFTU19NRVRBIH0gZnJvbSAnQGdsaW1tZXIvb2JqZWN0LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBkaWN0LCBhc3NpZ24gfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IENsYXNzTWV0YSwgSW5zdGFuY2VNZXRhLCB0dXJib2NoYXJnZSB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCB7IFJPT1QgfSBmcm9tICcuL3V0aWxzJztcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5leHBvcnQgY29uc3QgREVTQ1JJUFRPUiA9IFwiNWQ5MGY4NGYtOTA4ZS00YTQyLTk3NDktM2QwZjUyM2MyNjJjXCI7XG5leHBvcnQgY29uc3QgQkxVRVBSSU5UID0gXCI4ZDk3Y2Y1Zi1kYjllLTQ4ZDgtYTZiMi03YTc1YjcxNzA4MDVcIjtcbmV4cG9ydCBjbGFzcyBEZXNjcmlwdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1tcIjVkOTBmODRmLTkwOGUtNGE0Mi05NzQ5LTNkMGY1MjNjMjYyY1wiXSA9IHRydWU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEJsdWVwcmludCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbXCI4ZDk3Y2Y1Zi1kYjllLTQ4ZDgtYTZiMi03YTc1YjcxNzA4MDVcIl0gPSB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBNaXhpbiB7XG4gICAgY29uc3RydWN0b3IoZXh0ZW5zaW9ucywgbWl4aW5zKSB7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IFtdO1xuICAgICAgICB0aGlzLm1lcmdlZFByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yZW9wZW4oZXh0ZW5zaW9ucyk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLnB1c2goLi4ubWl4aW5zKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZSguLi5hcmdzKSB7XG4gICAgICAgIGxldCBleHRlbnNpb25zID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyh7fSwgW10pO1xuICAgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbnMgaW5zdGFuY2VvZiBNaXhpbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHt9LCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkZXBzID0gYXJncy5zbGljZSgwLCAtMSkubWFwKHRvTWl4aW4pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKGV4dGVuc2lvbnMsIGRlcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBtaXhpbnMob2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBbXTtcbiAgICAgICAgbGV0IG1ldGEgPSBDbGFzc01ldGEuZm9yKG9iaik7XG4gICAgICAgIGlmICghbWV0YSkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gbWV0YS5nZXRBcHBsaWVkTWl4aW5zKCk7XG4gICAgfVxuICAgIGRldGVjdChvYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWl4aW4pIHtcbiAgICAgICAgICAgIHJldHVybiBvYmouZGVwZW5kZW5jaWVzLmluZGV4T2YodGhpcykgIT09IC0xO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtZXRhID0gQ2xhc3NNZXRhLmZvcihvYmopO1xuICAgICAgICByZXR1cm4gISFtZXRhICYmIG1ldGEuaGFzQXBwbGllZE1peGluKHRoaXMpO1xuICAgIH1cbiAgICByZW9wZW4oZXh0ZW5zaW9ucykge1xuICAgICAgICBpZiAodGhpcy5leHRlbnNpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcy5wdXNoKHRvTWl4aW4odGhpcy5leHRlbnNpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnb2JqZWN0JyAmJiAnY29uY2F0ZW5hdGVkUHJvcGVydGllcycgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgbGV0IGNvbmNhdDtcbiAgICAgICAgICAgIGxldCByYXdDb25jYXQgPSBleHRlbnNpb25zLmNvbmNhdGVuYXRlZFByb3BlcnRpZXM7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyYXdDb25jYXQpKSB7XG4gICAgICAgICAgICAgICAgY29uY2F0ID0gcmF3Q29uY2F0LnNsaWNlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJhd0NvbmNhdCA9PT0gbnVsbCB8fCByYXdDb25jYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbmNhdCA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25jYXQgPSBbcmF3Q29uY2F0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBleHRlbnNpb25zLmNvbmNhdGVuYXRlZFByb3BlcnRpZXM7XG4gICAgICAgICAgICB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMgPSBjb25jYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnb2JqZWN0JyAmJiAnbWVyZ2VkUHJvcGVydGllcycgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgbGV0IG1lcmdlZDtcbiAgICAgICAgICAgIGxldCByYXdNZXJnZWQgPSBleHRlbnNpb25zLm1lcmdlZFByb3BlcnRpZXM7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyYXdNZXJnZWQpKSB7XG4gICAgICAgICAgICAgICAgbWVyZ2VkID0gcmF3TWVyZ2VkLnNsaWNlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJhd01lcmdlZCA9PT0gbnVsbCB8fCByYXdNZXJnZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lcmdlZCA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXJnZWQgPSBbcmF3TWVyZ2VkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBleHRlbnNpb25zLm1lcmdlZFByb3BlcnRpZXM7XG4gICAgICAgICAgICB0aGlzLm1lcmdlZFByb3BlcnRpZXMgPSBtZXJnZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSBPYmplY3Qua2V5cyhleHRlbnNpb25zKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBleHRlbnNpb25zW2tleV07XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSBuZXcgTWV0aG9kQmx1ZXByaW50KHsgdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBCTFVFUFJJTlQgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IG5ldyBEYXRhQmx1ZXByaW50KHsgdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCBkaWN0KCkpO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBkaWN0KCk7XG4gICAgICAgIGFzc2lnbih0aGlzLmV4dGVuc2lvbnMsIHR1cmJvY2hhcmdlKG5vcm1hbGl6ZWQpKTtcbiAgICB9XG4gICAgYXBwbHkodGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXRhID0gdGFyZ2V0W0NMQVNTX01FVEFdID0gdGFyZ2V0W0NMQVNTX01FVEFdIHx8IG5ldyBDbGFzc01ldGEoKTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuZm9yRWFjaChtID0+IG0uYXBwbHkodGFyZ2V0KSk7XG4gICAgICAgIHRoaXMubWVyZ2VQcm9wZXJ0aWVzKHRhcmdldCwgdGFyZ2V0LCBtZXRhKTtcbiAgICAgICAgbWV0YS5hZGRNaXhpbih0aGlzKTtcbiAgICAgICAgbWV0YS5zZWFsKCk7XG4gICAgICAgIG1ldGEucmVzZWFsKHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGV4dGVuZFByb3RvdHlwZShPcmlnaW5hbCkge1xuICAgICAgICBPcmlnaW5hbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9yaWdpbmFsLnByb3RvdHlwZSk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmZvckVhY2gobSA9PiBtLmV4dGVuZFByb3RvdHlwZShPcmlnaW5hbCkpO1xuICAgICAgICB0aGlzLmV4dGVuZFByb3RvdHlwZU9udG8oT3JpZ2luYWwsIE9yaWdpbmFsKTtcbiAgICB9XG4gICAgZXh0ZW5kUHJvdG90eXBlT250byhTdWJjbGFzcywgUGFyZW50KSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmZvckVhY2gobSA9PiBtLmV4dGVuZFByb3RvdHlwZU9udG8oU3ViY2xhc3MsIFBhcmVudCkpO1xuICAgICAgICB0aGlzLm1lcmdlUHJvcGVydGllcyhTdWJjbGFzcy5wcm90b3R5cGUsIFBhcmVudC5wcm90b3R5cGUsIFN1YmNsYXNzW0NMQVNTX01FVEFdKTtcbiAgICAgICAgU3ViY2xhc3NbQ0xBU1NfTUVUQV0uYWRkTWl4aW4odGhpcyk7XG4gICAgfVxuICAgIGV4dGVuZFN0YXRpYyhUYXJnZXQpIHtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuZm9yRWFjaChtID0+IG0uZXh0ZW5kU3RhdGljKFRhcmdldCkpO1xuICAgICAgICB0aGlzLm1lcmdlUHJvcGVydGllcyhUYXJnZXQsIE9iamVjdC5nZXRQcm90b3R5cGVPZihUYXJnZXQpLCBUYXJnZXRbQ0xBU1NfTUVUQV1bQ0xBU1NfTUVUQV0pO1xuICAgICAgICBUYXJnZXRbQ0xBU1NfTUVUQV0uYWRkU3RhdGljTWl4aW4odGhpcyk7XG4gICAgfVxuICAgIG1lcmdlUHJvcGVydGllcyh0YXJnZXQsIHBhcmVudCwgbWV0YSkge1xuICAgICAgICBpZiAobWV0YS5oYXNBcHBsaWVkTWl4aW4odGhpcykpIHJldHVybjtcbiAgICAgICAgbWV0YS5hZGRBcHBsaWVkTWl4aW4odGhpcyk7XG4gICAgICAgIHRoaXMubWVyZ2VkUHJvcGVydGllcy5mb3JFYWNoKGsgPT4gbWV0YS5hZGRNZXJnZWRQcm9wZXJ0eShrLCBwYXJlbnRba10pKTtcbiAgICAgICAgdGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzLmZvckVhY2goayA9PiBtZXRhLmFkZENvbmNhdGVuYXRlZFByb3BlcnR5KGssIFtdKSk7XG4gICAgICAgIG5ldyBWYWx1ZURlc2NyaXB0b3IoeyB2YWx1ZTogbWV0YS5nZXRDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKCkgfSkuZGVmaW5lKHRhcmdldCwgJ2NvbmNhdGVuYXRlZFByb3BlcnRpZXMnKTtcbiAgICAgICAgbmV3IFZhbHVlRGVzY3JpcHRvcih7IHZhbHVlOiBtZXRhLmdldE1lcmdlZFByb3BlcnRpZXMoKSB9KS5kZWZpbmUodGFyZ2V0LCAnbWVyZ2VkUHJvcGVydGllcycpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmV4dGVuc2lvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGxldCBleHRlbnNpb24gPSB0aGlzLmV4dGVuc2lvbnNba2V5XTtcbiAgICAgICAgICAgIGxldCBkZXNjID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3IodGFyZ2V0LCBrZXksIG1ldGEpO1xuICAgICAgICAgICAgZGVzYy5kZWZpbmUodGFyZ2V0LCBrZXksIHBhcmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgVmFsdWVEZXNjcmlwdG9yKHsgdmFsdWU6IFJPT1QgfSkuZGVmaW5lKHRhcmdldCwgJ19zdXBlcicpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQoUGFyZW50LCAuLi5leHRlbnNpb25zKSB7XG4gICAgbGV0IFN1cGVyID0gUGFyZW50O1xuICAgIGxldCBTdWJjbGFzcyA9IGNsYXNzIGV4dGVuZHMgU3VwZXIge307XG4gICAgU3ViY2xhc3NbQ0xBU1NfTUVUQV0gPSBJbnN0YW5jZU1ldGEuZnJvbVBhcmVudChQYXJlbnRbQ0xBU1NfTUVUQV0pO1xuICAgIGxldCBtaXhpbnMgPSBleHRlbnNpb25zLm1hcCh0b01peGluKTtcbiAgICBQYXJlbnRbQ0xBU1NfTUVUQV0uYWRkU3ViY2xhc3MoU3ViY2xhc3MpO1xuICAgIG1peGlucy5mb3JFYWNoKG0gPT4gU3ViY2xhc3NbQ0xBU1NfTUVUQV0uYWRkTWl4aW4obSkpO1xuICAgIENsYXNzTWV0YS5hcHBseUFsbE1peGlucyhTdWJjbGFzcywgUGFyZW50KTtcbiAgICByZXR1cm4gU3ViY2xhc3M7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVsaW5rU3ViY2xhc3NlcyhQYXJlbnQpIHtcbiAgICBQYXJlbnRbQ0xBU1NfTUVUQV0uZ2V0U3ViY2xhc3NlcygpLmZvckVhY2goU3ViY2xhc3MgPT4ge1xuICAgICAgICBTdWJjbGFzc1tDTEFTU19NRVRBXS5yZXNldChQYXJlbnRbQ0xBU1NfTUVUQV0pO1xuICAgICAgICBTdWJjbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFBhcmVudC5wcm90b3R5cGUpO1xuICAgICAgICBDbGFzc01ldGEuYXBwbHlBbGxNaXhpbnMoU3ViY2xhc3MsIFBhcmVudCk7XG4gICAgICAgIC8vIHJlY3Vyc2UgaW50byBzdWItc3ViY2xhc3Nlc1xuICAgICAgICByZWxpbmtTdWJjbGFzc2VzKFN1YmNsYXNzKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b01peGluKGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24gaW5zdGFuY2VvZiBNaXhpbikgcmV0dXJuIGV4dGVuc2lvbjtlbHNlIHJldHVybiBuZXcgTWl4aW4oZXh0ZW5zaW9uLCBbXSk7XG59XG5jbGFzcyBWYWx1ZURlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGVudW1lcmFibGUgPSB0cnVlLCBjb25maWd1cmFibGUgPSB0cnVlLCB3cml0YWJsZSA9IHRydWUsIHZhbHVlIH0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lbnVtZXJhYmxlID0gZW51bWVyYWJsZTtcbiAgICAgICAgdGhpcy5jb25maWd1cmFibGUgPSBjb25maWd1cmFibGU7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBkZWZpbmUodGFyZ2V0LCBrZXksIF9ob21lKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdGhpcy5lbnVtZXJhYmxlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0aGlzLmNvbmZpZ3VyYWJsZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0aGlzLndyaXRhYmxlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIERhdGFCbHVlcHJpbnQgZXh0ZW5kcyBCbHVlcHJpbnQge1xuICAgIGNvbnN0cnVjdG9yKHsgZW51bWVyYWJsZSA9IHRydWUsIGNvbmZpZ3VyYWJsZSA9IHRydWUsIHdyaXRhYmxlID0gdHJ1ZSwgdmFsdWUgfSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVudW1lcmFibGUgPSBlbnVtZXJhYmxlO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYWJsZSA9IGNvbmZpZ3VyYWJsZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gd3JpdGFibGU7XG4gICAgfVxuICAgIGRlc2NyaXB0b3IoX3RhcmdldCwga2V5LCBjbGFzc01ldGEpIHtcbiAgICAgICAgbGV0IHsgZW51bWVyYWJsZSwgY29uZmlndXJhYmxlLCB3cml0YWJsZSwgdmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGlmIChjbGFzc01ldGEuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgY2xhc3NNZXRhLmFkZENvbmNhdGVuYXRlZFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgdmFsdWUgPSBjbGFzc01ldGEuZ2V0Q29uY2F0ZW5hdGVkUHJvcGVydHkoa2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChjbGFzc01ldGEuaGFzTWVyZ2VkUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgY2xhc3NNZXRhLmFkZE1lcmdlZFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgdmFsdWUgPSBjbGFzc01ldGEuZ2V0TWVyZ2VkUHJvcGVydHkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFZhbHVlRGVzY3JpcHRvcih7IGVudW1lcmFibGUsIGNvbmZpZ3VyYWJsZSwgd3JpdGFibGUsIHZhbHVlIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBY2Nlc3NvckJsdWVwcmludCBleHRlbmRzIEJsdWVwcmludCB7XG4gICAgY29uc3RydWN0b3IoeyBlbnVtZXJhYmxlID0gdHJ1ZSwgY29uZmlndXJhYmxlID0gdHJ1ZSwgZ2V0LCBzZXQgfSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVudW1lcmFibGUgPSBlbnVtZXJhYmxlO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYWJsZSA9IGNvbmZpZ3VyYWJsZTtcbiAgICAgICAgdGhpcy5nZXQgPSBnZXQ7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgIH1cbiAgICBkZXNjcmlwdG9yKF90YXJnZXQsIF9rZXksIF9jbGFzc01ldGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZURlc2NyaXB0b3Ioe1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdGhpcy5lbnVtZXJhYmxlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0aGlzLmNvbmZpZ3VyYWJsZSxcbiAgICAgICAgICAgIGdldDogdGhpcy5nZXQsXG4gICAgICAgICAgICBzZXQ6IHRoaXMuc2V0XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIE1ldGhvZERlc2NyaXB0b3IgZXh0ZW5kcyBWYWx1ZURlc2NyaXB0b3Ige1xuICAgIGRlZmluZSh0YXJnZXQsIGtleSwgaG9tZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gd3JhcE1ldGhvZChob21lLCBrZXksIHRoaXMudmFsdWUpO1xuICAgICAgICBzdXBlci5kZWZpbmUodGFyZ2V0LCBrZXksIGhvbWUpO1xuICAgIH1cbn1cbmNsYXNzIE1ldGhvZEJsdWVwcmludCBleHRlbmRzIERhdGFCbHVlcHJpbnQge1xuICAgIGRlc2NyaXB0b3IodGFyZ2V0LCBrZXksIGNsYXNzTWV0YSkge1xuICAgICAgICBsZXQgZGVzYyA9IHN1cGVyLmRlc2NyaXB0b3IodGFyZ2V0LCBrZXksIGNsYXNzTWV0YSk7XG4gICAgICAgIHJldHVybiBuZXcgTWV0aG9kRGVzY3JpcHRvcihkZXNjKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1ldGhvZChob21lLCBtZXRob2ROYW1lLCBvcmlnaW5hbCkge1xuICAgIGlmICghKG1ldGhvZE5hbWUgaW4gaG9tZSkpIHJldHVybiBtYXliZVdyYXAob3JpZ2luYWwpO1xuICAgIGxldCBzdXBlck1ldGhvZCA9IGhvbWVbbWV0aG9kTmFtZV07XG4gICAgbGV0IGZ1bmMgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAoIXRoaXMpIHJldHVybiBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgbGV0IGxhc3RTdXBlciA9IHRoaXMuX3N1cGVyO1xuICAgICAgICB0aGlzLl9zdXBlciA9IHN1cGVyTWV0aG9kO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIgPSBsYXN0U3VwZXI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmMuX193cmFwcGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gZnVuYztcbn1cbmZ1bmN0aW9uIG1heWJlV3JhcChvcmlnaW5hbCkge1xuICAgIGlmICgnX193cmFwcGVkJyBpbiBvcmlnaW5hbCkgcmV0dXJuIG9yaWdpbmFsO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAoIXRoaXMpIHJldHVybiBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgbGV0IGxhc3RTdXBlciA9IHRoaXMuX3N1cGVyO1xuICAgICAgICB0aGlzLl9zdXBlciA9IFJPT1Q7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlciA9IGxhc3RTdXBlcjtcbiAgICAgICAgfVxuICAgIH07XG59Il19