UNPKG

ember-legacy-class-transform

Version:
151 lines (146 loc) 16.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.ComputedBlueprint = undefined; exports.computed = computed; exports.observer = observer; var _objectReference = require('@glimmer/object-reference'); var _object = require('./object'); var _mixin = require('./mixin'); class ComputedBlueprint extends _mixin.Blueprint { constructor(accessor, deps = []) { super(); this.metadata = {}; this.accessor = accessor; this.deps = deps; } descriptor(_target, key, classMeta) { classMeta.addReferenceTypeFor(key, (0, _objectReference.ComputedReferenceBlueprint)(key, this.deps)); classMeta.addPropertyMetadata(key, this.metadata); classMeta.addSlotFor(key); return new Computed(this.accessor); } property(...paths) { this.deps = paths.map(d => d.split('.')); return this; } meta(object) { this.metadata = object; return this; } volatile() { return this; } } exports.ComputedBlueprint = ComputedBlueprint; class Computed { constructor(accessor) { this["5d90f84f-908e-4a42-9749-3d0f523c262c"] = true; this.accessor = accessor; } define(prototype, key, home) { Object.defineProperty(prototype, key, wrapAccessor(home, key, this.accessor)); } } function wrapAccessor(home, accessorName, _desc) { let superDesc = getPropertyDescriptor(home, accessorName); let originalGet; let originalSet; let desc = { enumerable: true, configurable: true }; let get = _desc.get; if (get && get.length > 0) { originalGet = function () { return get.call(this, accessorName); }; } else { originalGet = _desc.get; } let set = _desc.set; if (set && set.length > 1) { originalSet = function (value) { return set.call(this, accessorName, value); }; } else { originalSet = _desc.set; } let cacheGet = function () { if (_objectReference.Meta.exists(this)) { let slot = _objectReference.Meta.for(this).getSlots()[accessorName]; if (slot !== _object.EMPTY_CACHE) return slot; } return originalGet.call(this); }; let cacheSet; if (originalSet) { cacheSet = function (value) { let meta = _objectReference.Meta.for(this); let slots = meta.getSlots(); let ret = originalSet.call(this, value); if (ret !== undefined) { slots[accessorName] = ret; } }; } else { cacheSet = function (value) { let meta = _objectReference.Meta.for(this); let slots = meta.getSlots(); if (value !== undefined) slots[accessorName] = value; }; } if (!superDesc || 'value' in superDesc) { desc.get = cacheGet; desc.set = cacheSet; return desc; } desc.get = function () { let lastSuper = this._super; this._super = function () { return superDesc.get.call(this); }; try { return cacheGet.call(this); } finally { this._super = lastSuper; } }; desc.set = function (val) { let lastSuper = this._super; this._super = function () { return superDesc.set.call(this, val); }; try { return cacheSet.call(this, val); } finally { this._super = lastSuper; } }; return desc; } function getPropertyDescriptor(subject, name) { let pd = Object.getOwnPropertyDescriptor(subject, name); let proto = Object.getPrototypeOf(subject); while (typeof pd === 'undefined' && proto !== null) { pd = Object.getOwnPropertyDescriptor(proto, name); proto = Object.getPrototypeOf(proto); } return pd; } function computed(...args) { let last = args.pop(); let deps = args; if (typeof last === 'function') { return new ComputedBlueprint({ get: last }).property(...deps); } else if (typeof last === 'object') { return new ComputedBlueprint(last).property(...deps); } else { throw new TypeError("computed expects a function or an object as last argument"); } } function observer(..._args) {} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21wdXRlZC5qcyJdLCJuYW1lcyI6WyJjb21wdXRlZCIsIm9ic2VydmVyIiwiQ29tcHV0ZWRCbHVlcHJpbnQiLCJjb25zdHJ1Y3RvciIsImFjY2Vzc29yIiwiZGVwcyIsIm1ldGFkYXRhIiwiZGVzY3JpcHRvciIsIl90YXJnZXQiLCJrZXkiLCJjbGFzc01ldGEiLCJhZGRSZWZlcmVuY2VUeXBlRm9yIiwiYWRkUHJvcGVydHlNZXRhZGF0YSIsImFkZFNsb3RGb3IiLCJDb21wdXRlZCIsInByb3BlcnR5IiwicGF0aHMiLCJtYXAiLCJkIiwic3BsaXQiLCJtZXRhIiwib2JqZWN0Iiwidm9sYXRpbGUiLCJkZWZpbmUiLCJwcm90b3R5cGUiLCJob21lIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ3cmFwQWNjZXNzb3IiLCJhY2Nlc3Nvck5hbWUiLCJfZGVzYyIsInN1cGVyRGVzYyIsImdldFByb3BlcnR5RGVzY3JpcHRvciIsIm9yaWdpbmFsR2V0Iiwib3JpZ2luYWxTZXQiLCJkZXNjIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsImdldCIsImxlbmd0aCIsImNhbGwiLCJzZXQiLCJ2YWx1ZSIsImNhY2hlR2V0IiwiZXhpc3RzIiwic2xvdCIsImZvciIsImdldFNsb3RzIiwiY2FjaGVTZXQiLCJzbG90cyIsInJldCIsInVuZGVmaW5lZCIsImxhc3RTdXBlciIsIl9zdXBlciIsInZhbCIsInN1YmplY3QiLCJuYW1lIiwicGQiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwiYXJncyIsImxhc3QiLCJwb3AiLCJUeXBlRXJyb3IiLCJfYXJncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1FBMkhnQkEsUSxHQUFBQSxRO1FBYUFDLFEsR0FBQUEsUTs7QUF4SWhCOztBQUNBOztBQUNBOztBQUNPLE1BQU1DLGlCQUFOLDBCQUEwQztBQUM3Q0MsZ0JBQVlDLFFBQVosRUFBc0JDLE9BQU8sRUFBN0IsRUFBaUM7QUFDN0I7QUFDQSxhQUFLQyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsYUFBS0YsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxhQUFLQyxJQUFMLEdBQVlBLElBQVo7QUFDSDtBQUNERSxlQUFXQyxPQUFYLEVBQW9CQyxHQUFwQixFQUF5QkMsU0FBekIsRUFBb0M7QUFDaENBLGtCQUFVQyxtQkFBVixDQUE4QkYsR0FBOUIsRUFBbUMsaURBQTJCQSxHQUEzQixFQUFnQyxLQUFLSixJQUFyQyxDQUFuQztBQUNBSyxrQkFBVUUsbUJBQVYsQ0FBOEJILEdBQTlCLEVBQW1DLEtBQUtILFFBQXhDO0FBQ0FJLGtCQUFVRyxVQUFWLENBQXFCSixHQUFyQjtBQUNBLGVBQU8sSUFBSUssUUFBSixDQUFhLEtBQUtWLFFBQWxCLENBQVA7QUFDSDtBQUNEVyxhQUFTLEdBQUdDLEtBQVosRUFBbUI7QUFDZixhQUFLWCxJQUFMLEdBQVlXLE1BQU1DLEdBQU4sQ0FBVUMsS0FBS0EsRUFBRUMsS0FBRixDQUFRLEdBQVIsQ0FBZixDQUFaO0FBQ0EsZUFBTyxJQUFQO0FBQ0g7QUFDREMsU0FBS0MsTUFBTCxFQUFhO0FBQ1QsYUFBS2YsUUFBTCxHQUFnQmUsTUFBaEI7QUFDQSxlQUFPLElBQVA7QUFDSDtBQUNEQyxlQUFXO0FBQ1AsZUFBTyxJQUFQO0FBQ0g7QUF2QjRDO1FBQXBDcEIsaUIsR0FBQUEsaUI7QUF5QmIsTUFBTVksUUFBTixDQUFlO0FBQ1hYLGdCQUFZQyxRQUFaLEVBQXNCO0FBQ2xCLGFBQUssc0NBQUwsSUFBK0MsSUFBL0M7QUFDQSxhQUFLQSxRQUFMLEdBQWdCQSxRQUFoQjtBQUNIO0FBQ0RtQixXQUFPQyxTQUFQLEVBQWtCZixHQUFsQixFQUF1QmdCLElBQXZCLEVBQTZCO0FBQ3pCQyxlQUFPQyxjQUFQLENBQXNCSCxTQUF0QixFQUFpQ2YsR0FBakMsRUFBc0NtQixhQUFhSCxJQUFiLEVBQW1CaEIsR0FBbkIsRUFBd0IsS0FBS0wsUUFBN0IsQ0FBdEM7QUFDSDtBQVBVO0FBU2YsU0FBU3dCLFlBQVQsQ0FBc0JILElBQXRCLEVBQTRCSSxZQUE1QixFQUEwQ0MsS0FBMUMsRUFBaUQ7QUFDN0MsUUFBSUMsWUFBWUMsc0JBQXNCUCxJQUF0QixFQUE0QkksWUFBNUIsQ0FBaEI7QUFDQSxRQUFJSSxXQUFKO0FBQ0EsUUFBSUMsV0FBSjtBQUNBLFFBQUlDLE9BQU87QUFDUEMsb0JBQVksSUFETDtBQUVQQyxzQkFBYztBQUZQLEtBQVg7QUFJQSxRQUFJQyxNQUFNUixNQUFNUSxHQUFoQjtBQUNBLFFBQUlBLE9BQU9BLElBQUlDLE1BQUosR0FBYSxDQUF4QixFQUEyQjtBQUN2Qk4sc0JBQWMsWUFBWTtBQUN0QixtQkFBT0ssSUFBSUUsSUFBSixDQUFTLElBQVQsRUFBZVgsWUFBZixDQUFQO0FBQ0gsU0FGRDtBQUdILEtBSkQsTUFJTztBQUNISSxzQkFBY0gsTUFBTVEsR0FBcEI7QUFDSDtBQUNELFFBQUlHLE1BQU1YLE1BQU1XLEdBQWhCO0FBQ0EsUUFBSUEsT0FBT0EsSUFBSUYsTUFBSixHQUFhLENBQXhCLEVBQTJCO0FBQ3ZCTCxzQkFBYyxVQUFVUSxLQUFWLEVBQWlCO0FBQzNCLG1CQUFPRCxJQUFJRCxJQUFKLENBQVMsSUFBVCxFQUFlWCxZQUFmLEVBQTZCYSxLQUE3QixDQUFQO0FBQ0gsU0FGRDtBQUdILEtBSkQsTUFJTztBQUNIUixzQkFBY0osTUFBTVcsR0FBcEI7QUFDSDtBQUNELFFBQUlFLFdBQVcsWUFBWTtBQUN2QixZQUFJLHNCQUFLQyxNQUFMLENBQVksSUFBWixDQUFKLEVBQXVCO0FBQ25CLGdCQUFJQyxPQUFPLHNCQUFLQyxHQUFMLENBQVMsSUFBVCxFQUFlQyxRQUFmLEdBQTBCbEIsWUFBMUIsQ0FBWDtBQUNBLGdCQUFJZ0IsNEJBQUosRUFBMEIsT0FBT0EsSUFBUDtBQUM3QjtBQUNELGVBQU9aLFlBQVlPLElBQVosQ0FBaUIsSUFBakIsQ0FBUDtBQUNILEtBTkQ7QUFPQSxRQUFJUSxRQUFKO0FBQ0EsUUFBSWQsV0FBSixFQUFpQjtBQUNiYyxtQkFBVyxVQUFVTixLQUFWLEVBQWlCO0FBQ3hCLGdCQUFJdEIsT0FBTyxzQkFBSzBCLEdBQUwsQ0FBUyxJQUFULENBQVg7QUFDQSxnQkFBSUcsUUFBUTdCLEtBQUsyQixRQUFMLEVBQVo7QUFDQSxnQkFBSUcsTUFBTWhCLFlBQVlNLElBQVosQ0FBaUIsSUFBakIsRUFBdUJFLEtBQXZCLENBQVY7QUFDQSxnQkFBSVEsUUFBUUMsU0FBWixFQUF1QjtBQUNuQkYsc0JBQU1wQixZQUFOLElBQXNCcUIsR0FBdEI7QUFDSDtBQUNKLFNBUEQ7QUFRSCxLQVRELE1BU087QUFDSEYsbUJBQVcsVUFBVU4sS0FBVixFQUFpQjtBQUN4QixnQkFBSXRCLE9BQU8sc0JBQUswQixHQUFMLENBQVMsSUFBVCxDQUFYO0FBQ0EsZ0JBQUlHLFFBQVE3QixLQUFLMkIsUUFBTCxFQUFaO0FBQ0EsZ0JBQUlMLFVBQVVTLFNBQWQsRUFBeUJGLE1BQU1wQixZQUFOLElBQXNCYSxLQUF0QjtBQUM1QixTQUpEO0FBS0g7QUFDRCxRQUFJLENBQUNYLFNBQUQsSUFBYyxXQUFXQSxTQUE3QixFQUF3QztBQUNwQ0ksYUFBS0csR0FBTCxHQUFXSyxRQUFYO0FBQ0FSLGFBQUtNLEdBQUwsR0FBV08sUUFBWDtBQUNBLGVBQU9iLElBQVA7QUFDSDtBQUNEQSxTQUFLRyxHQUFMLEdBQVcsWUFBWTtBQUNuQixZQUFJYyxZQUFZLEtBQUtDLE1BQXJCO0FBQ0EsYUFBS0EsTUFBTCxHQUFjLFlBQVk7QUFDdEIsbUJBQU90QixVQUFVTyxHQUFWLENBQWNFLElBQWQsQ0FBbUIsSUFBbkIsQ0FBUDtBQUNILFNBRkQ7QUFHQSxZQUFJO0FBQ0EsbUJBQU9HLFNBQVNILElBQVQsQ0FBYyxJQUFkLENBQVA7QUFDSCxTQUZELFNBRVU7QUFDTixpQkFBS2EsTUFBTCxHQUFjRCxTQUFkO0FBQ0g7QUFDSixLQVZEO0FBV0FqQixTQUFLTSxHQUFMLEdBQVcsVUFBVWEsR0FBVixFQUFlO0FBQ3RCLFlBQUlGLFlBQVksS0FBS0MsTUFBckI7QUFDQSxhQUFLQSxNQUFMLEdBQWMsWUFBWTtBQUN0QixtQkFBT3RCLFVBQVVVLEdBQVYsQ0FBY0QsSUFBZCxDQUFtQixJQUFuQixFQUF5QmMsR0FBekIsQ0FBUDtBQUNILFNBRkQ7QUFHQSxZQUFJO0FBQ0EsbUJBQU9OLFNBQVNSLElBQVQsQ0FBYyxJQUFkLEVBQW9CYyxHQUFwQixDQUFQO0FBQ0gsU0FGRCxTQUVVO0FBQ04saUJBQUtELE1BQUwsR0FBY0QsU0FBZDtBQUNIO0FBQ0osS0FWRDtBQVdBLFdBQU9qQixJQUFQO0FBQ0g7QUFDRCxTQUFTSCxxQkFBVCxDQUErQnVCLE9BQS9CLEVBQXdDQyxJQUF4QyxFQUE4QztBQUMxQyxRQUFJQyxLQUFLL0IsT0FBT2dDLHdCQUFQLENBQWdDSCxPQUFoQyxFQUF5Q0MsSUFBekMsQ0FBVDtBQUNBLFFBQUlHLFFBQVFqQyxPQUFPa0MsY0FBUCxDQUFzQkwsT0FBdEIsQ0FBWjtBQUNBLFdBQU8sT0FBT0UsRUFBUCxLQUFjLFdBQWQsSUFBNkJFLFVBQVUsSUFBOUMsRUFBb0Q7QUFDaERGLGFBQUsvQixPQUFPZ0Msd0JBQVAsQ0FBZ0NDLEtBQWhDLEVBQXVDSCxJQUF2QyxDQUFMO0FBQ0FHLGdCQUFRakMsT0FBT2tDLGNBQVAsQ0FBc0JELEtBQXRCLENBQVI7QUFDSDtBQUNELFdBQU9GLEVBQVA7QUFDSDtBQUNNLFNBQVN6RCxRQUFULENBQWtCLEdBQUc2RCxJQUFyQixFQUEyQjtBQUM5QixRQUFJQyxPQUFPRCxLQUFLRSxHQUFMLEVBQVg7QUFDQSxRQUFJMUQsT0FBT3dELElBQVg7QUFDQSxRQUFJLE9BQU9DLElBQVAsS0FBZ0IsVUFBcEIsRUFBZ0M7QUFDNUIsZUFBTyxJQUFJNUQsaUJBQUosQ0FBc0I7QUFDekJvQyxpQkFBS3dCO0FBRG9CLFNBQXRCLEVBRUovQyxRQUZJLENBRUssR0FBR1YsSUFGUixDQUFQO0FBR0gsS0FKRCxNQUlPLElBQUksT0FBT3lELElBQVAsS0FBZ0IsUUFBcEIsRUFBOEI7QUFDakMsZUFBTyxJQUFJNUQsaUJBQUosQ0FBc0I0RCxJQUF0QixFQUE0Qi9DLFFBQTVCLENBQXFDLEdBQUdWLElBQXhDLENBQVA7QUFDSCxLQUZNLE1BRUE7QUFDSCxjQUFNLElBQUkyRCxTQUFKLENBQWMsMkRBQWQsQ0FBTjtBQUNIO0FBQ0o7QUFDTSxTQUFTL0QsUUFBVCxDQUFrQixHQUFHZ0UsS0FBckIsRUFBNEIsQ0FBRSIsImZpbGUiOiJsaWIvY29tcHV0ZWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wdXRlZFJlZmVyZW5jZUJsdWVwcmludCwgTWV0YSB9IGZyb20gJ0BnbGltbWVyL29iamVjdC1yZWZlcmVuY2UnO1xuaW1wb3J0IHsgRU1QVFlfQ0FDSEUgfSBmcm9tICcuL29iamVjdCc7XG5pbXBvcnQgeyBCbHVlcHJpbnQgfSBmcm9tICcuL21peGluJztcbmV4cG9ydCBjbGFzcyBDb21wdXRlZEJsdWVwcmludCBleHRlbmRzIEJsdWVwcmludCB7XG4gICAgY29uc3RydWN0b3IoYWNjZXNzb3IsIGRlcHMgPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0ge307XG4gICAgICAgIHRoaXMuYWNjZXNzb3IgPSBhY2Nlc3NvcjtcbiAgICAgICAgdGhpcy5kZXBzID0gZGVwcztcbiAgICB9XG4gICAgZGVzY3JpcHRvcihfdGFyZ2V0LCBrZXksIGNsYXNzTWV0YSkge1xuICAgICAgICBjbGFzc01ldGEuYWRkUmVmZXJlbmNlVHlwZUZvcihrZXksIENvbXB1dGVkUmVmZXJlbmNlQmx1ZXByaW50KGtleSwgdGhpcy5kZXBzKSk7XG4gICAgICAgIGNsYXNzTWV0YS5hZGRQcm9wZXJ0eU1ldGFkYXRhKGtleSwgdGhpcy5tZXRhZGF0YSk7XG4gICAgICAgIGNsYXNzTWV0YS5hZGRTbG90Rm9yKGtleSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcHV0ZWQodGhpcy5hY2Nlc3Nvcik7XG4gICAgfVxuICAgIHByb3BlcnR5KC4uLnBhdGhzKSB7XG4gICAgICAgIHRoaXMuZGVwcyA9IHBhdGhzLm1hcChkID0+IGQuc3BsaXQoJy4nKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBtZXRhKG9iamVjdCkge1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb2JqZWN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdm9sYXRpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmNsYXNzIENvbXB1dGVkIHtcbiAgICBjb25zdHJ1Y3RvcihhY2Nlc3Nvcikge1xuICAgICAgICB0aGlzW1wiNWQ5MGY4NGYtOTA4ZS00YTQyLTk3NDktM2QwZjUyM2MyNjJjXCJdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yO1xuICAgIH1cbiAgICBkZWZpbmUocHJvdG90eXBlLCBrZXksIGhvbWUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwga2V5LCB3cmFwQWNjZXNzb3IoaG9tZSwga2V5LCB0aGlzLmFjY2Vzc29yKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcEFjY2Vzc29yKGhvbWUsIGFjY2Vzc29yTmFtZSwgX2Rlc2MpIHtcbiAgICBsZXQgc3VwZXJEZXNjID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGhvbWUsIGFjY2Vzc29yTmFtZSk7XG4gICAgbGV0IG9yaWdpbmFsR2V0O1xuICAgIGxldCBvcmlnaW5hbFNldDtcbiAgICBsZXQgZGVzYyA9IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfTtcbiAgICBsZXQgZ2V0ID0gX2Rlc2MuZ2V0O1xuICAgIGlmIChnZXQgJiYgZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3JpZ2luYWxHZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcywgYWNjZXNzb3JOYW1lKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbEdldCA9IF9kZXNjLmdldDtcbiAgICB9XG4gICAgbGV0IHNldCA9IF9kZXNjLnNldDtcbiAgICBpZiAoc2V0ICYmIHNldC5sZW5ndGggPiAxKSB7XG4gICAgICAgIG9yaWdpbmFsU2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0LmNhbGwodGhpcywgYWNjZXNzb3JOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3JpZ2luYWxTZXQgPSBfZGVzYy5zZXQ7XG4gICAgfVxuICAgIGxldCBjYWNoZUdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKE1ldGEuZXhpc3RzKHRoaXMpKSB7XG4gICAgICAgICAgICBsZXQgc2xvdCA9IE1ldGEuZm9yKHRoaXMpLmdldFNsb3RzKClbYWNjZXNzb3JOYW1lXTtcbiAgICAgICAgICAgIGlmIChzbG90ICE9PSBFTVBUWV9DQUNIRSkgcmV0dXJuIHNsb3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsR2V0LmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBsZXQgY2FjaGVTZXQ7XG4gICAgaWYgKG9yaWdpbmFsU2V0KSB7XG4gICAgICAgIGNhY2hlU2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbWV0YSA9IE1ldGEuZm9yKHRoaXMpO1xuICAgICAgICAgICAgbGV0IHNsb3RzID0gbWV0YS5nZXRTbG90cygpO1xuICAgICAgICAgICAgbGV0IHJldCA9IG9yaWdpbmFsU2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2xvdHNbYWNjZXNzb3JOYW1lXSA9IHJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjYWNoZVNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IG1ldGEgPSBNZXRhLmZvcih0aGlzKTtcbiAgICAgICAgICAgIGxldCBzbG90cyA9IG1ldGEuZ2V0U2xvdHMoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzbG90c1thY2Nlc3Nvck5hbWVdID0gdmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICghc3VwZXJEZXNjIHx8ICd2YWx1ZScgaW4gc3VwZXJEZXNjKSB7XG4gICAgICAgIGRlc2MuZ2V0ID0gY2FjaGVHZXQ7XG4gICAgICAgIGRlc2Muc2V0ID0gY2FjaGVTZXQ7XG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgIH1cbiAgICBkZXNjLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGxhc3RTdXBlciA9IHRoaXMuX3N1cGVyO1xuICAgICAgICB0aGlzLl9zdXBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlckRlc2MuZ2V0LmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVHZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyID0gbGFzdFN1cGVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBkZXNjLnNldCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgbGV0IGxhc3RTdXBlciA9IHRoaXMuX3N1cGVyO1xuICAgICAgICB0aGlzLl9zdXBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlckRlc2Muc2V0LmNhbGwodGhpcywgdmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVNldC5jYWxsKHRoaXMsIHZhbCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBlciA9IGxhc3RTdXBlcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGRlc2M7XG59XG5mdW5jdGlvbiBnZXRQcm9wZXJ0eURlc2NyaXB0b3Ioc3ViamVjdCwgbmFtZSkge1xuICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3ViamVjdCwgbmFtZSk7XG4gICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHN1YmplY3QpO1xuICAgIHdoaWxlICh0eXBlb2YgcGQgPT09ICd1bmRlZmluZWQnICYmIHByb3RvICE9PSBudWxsKSB7XG4gICAgICAgIHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbmFtZSk7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gICAgcmV0dXJuIHBkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVkKC4uLmFyZ3MpIHtcbiAgICBsZXQgbGFzdCA9IGFyZ3MucG9wKCk7XG4gICAgbGV0IGRlcHMgPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgbGFzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXB1dGVkQmx1ZXByaW50KHtcbiAgICAgICAgICAgIGdldDogbGFzdFxuICAgICAgICB9KS5wcm9wZXJ0eSguLi5kZXBzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYXN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXB1dGVkQmx1ZXByaW50KGxhc3QpLnByb3BlcnR5KC4uLmRlcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wdXRlZCBleHBlY3RzIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IGFzIGxhc3QgYXJndW1lbnRcIik7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVyKC4uLl9hcmdzKSB7fSJdfQ==