{"version":3,"file":"148.88a1b933.js","mappings":"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","sources":["webpack://mitt-nercia/../../../modapp/modapp-resource/src/SortedMap.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/Collection.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/utils.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/CollectionWrapper.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/CollectionToModel.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/JoinedCollection.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/Model.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/ModifyModel.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/ModelToCollection.js","webpack://mitt-nercia/../../../modapp/modapp-resource/src/ModelWrapper.js","webpack://mitt-nercia/./src/sentry.js","webpack://mitt-nercia/./src/modules/init/api/Api.js","webpack://mitt-nercia/../../../modapp/modapp-utils/src/anim.js","webpack://mitt-nercia/../../../modapp/modapp-utils/src/array.js","webpack://mitt-nercia/../../../modapp/modapp-utils/src/elem.js","webpack://mitt-nercia/../../../modapp/modapp-utils/src/uri.js","webpack://mitt-nercia/./src/utils/l10n.js","webpack://mitt-nercia/../../../modapp/modapp-l10n/src/class/LocaleStr.js","webpack://mitt-nercia/../../../modapp/modapp-l10n/src/class/L10n.js","webpack://mitt-nercia/../../../modapp/modapp-l10n/src/index.js","webpack://mitt-nercia/./src/classes/Err.js","webpack://mitt-nercia/../../../modapp/modapp-utils/src/obj.js","webpack://mitt-nercia/../../../modapp/modapp/src/error/BlockedError.js","webpack://mitt-nercia/../../../modapp/modapp/src/error/CircularDependencyError.js","webpack://mitt-nercia/../../../modapp/modapp/src/error/UnavailableError.js","webpack://mitt-nercia/../../../modapp/modapp/src/error/DeactivatedError.js","webpack://mitt-nercia/../../../modapp/modapp/src/error/UnknownError.js","webpack://mitt-nercia/../../../modapp/modapp/src/class/ModuleInstance.js","webpack://mitt-nercia/../../../modapp/modapp/src/class/App.js","webpack://mitt-nercia/../../../modapp/modapp/src/class/AppExt.js","webpack://mitt-nercia/./cfg/module.config.production.js","webpack://mitt-nercia/../../../res/resclient/src/class/CacheItem.js","webpack://mitt-nercia/../../../res/resclient/src/class/TypeList.js","webpack://mitt-nercia/../../../res/resclient/src/class/ResCollection.js","webpack://mitt-nercia/../../../res/resclient/src/class/equal.js","webpack://mitt-nercia/../../../res/resclient/src/class/ResModel.js","webpack://mitt-nercia/../../../res/resclient/src/class/ResError.js","webpack://mitt-nercia/../../../res/resclient/src/class/ResRef.js","webpack://mitt-nercia/../../../res/resclient/src/class/ResClient.js","webpack://mitt-nercia/./src/classes/LocaleStr.js","webpack://mitt-nercia/./src/classes/L10n.js","webpack://mitt-nercia/../../../modapp/modapp-eventbus/src/class/EventBus.js","webpack://mitt-nercia/../../../modapp/modapp-eventbus/src/index.js"],"sourcesContent":["import { array } from 'modapp-utils';\n\n/**\n * A map is an ordered list for key-value items. The map also allows for value lookup\n * by key name through the get() method.\n * @constructor\n * @alias module:class/SortedMap\n * @param {function} [compare] Sort compare function. Defaults to sort by order they are added.\n */\nexport default function(compare) {\n\t/** @lends module:class/SortedMap.prototype */\n\tvar list = [];\n\n\tvar map = {};\n\n\t/**\n\t * Adds a value to the map\n\t * @param {string} key Key of value to add\n\t * @param {*} value Value to add\n\t * @param {number} [idx] Index of position to insert value. Default is at the end. Ignored if a §ompare function is used\n\t * @returns {number} Index of insert position\n\t */\n\tlist.add = function(key, value, idx) {\n\t\tif (map[key]) throw \"Map key [\" + key + \"] already exists\";\n\n\t\tmap[key] = value;\n\n\t\tif (compare) {\n\t\t\tidx = array.binaryInsert(list, value, compare, true);\n\t\t} else {\n\t\t\tif (typeof idx != 'number' || idx >= list.length) {\n\t\t\t\tidx = list.length;\n\t\t\t\tlist.push(value);\n\t\t\t} else if (idx <= 0) {\n\t\t\t\tidx = 0;\n\t\t\t\tlist.unshift(value);\n\t\t\t} else {\n\t\t\t\tlist.splice(idx, 0, value);\n\t\t\t}\n\t\t}\n\n\t\treturn idx;\n\t};\n\n\t/**\n\t * Removes a value item from the map\n\t * @param {string} key Key of value to remove\n\t * @returns {number} Index of value position before removal. -1 if key doesn't exist\n\t */\n\tlist.remove = function(key) {\n\t\tvar idx, value = map[key];\n\t\tif (value === undefined) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tdelete map[key];\n\t\tidx = compare\n\t\t\t? array.binarySearch(list, value, compare)\n\t\t\t: list.indexOf(value);\n\n\t\tif (idx >= 0) {\n\t\t\tlist.splice(idx, 1);\n\t\t}\n\n\t\treturn idx;\n\t};\n\n\t/**\n\t * Gets a value from the map by key\n\t * @param {string} key Key of value to get\n\t * @returns {*} Stored value. Undefined if key doesn't exist\n\t */\n\tlist.get = function(key) {\n\t\treturn map[key];\n\t};\n\n\t/**\n\t * Retrieves the order index of a value in the map\n\t * @param {string} key Key of value to get index for\n\t * @returns {number} Index of value position. -1 if key doesn't exist\n\t */\n\tlist.indexOfKey = function(key) {\n\t\tvar value = map[key];\n\t\tif (!value) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn compare\n\t\t\t? array.binarySearch(list, value, compare)\n\t\t\t: list.indexOf(value);\n\t};\n\n\treturn list;\n};\n","import SortedMap from './SortedMap';\nimport eventBus from 'modapp-eventbus';\nimport { obj } from 'modapp-utils';\n\n/**\n * Collection is a generic data collection.\n * @implements {module:modapp~Collection}\n */\nclass Collection {\n\n\t/**\n\t * Creates a Collection instance\n\t * @param {object} [opt] Optional settings.\n\t * @param {Array.} [opt.data] Collection data array.\n\t * @param {function} [opt.compare] Compare function for sort order. Defaults to insert order.\n\t * @param {function} [opt.modelFactory] Model factory function. Defaults to using added objects as is.\n\t * @param {function} [opt.idAttribute] Id attribute callback function. Defaults to returning the object.id property.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'collection'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(opt) {\n\t\topt = obj.copy(opt, {\n\t\t\tcompare: { type: '?function' },\n\t\t\tmodelFactory: { type: '?function' },\n\t\t\tidAttribute: { type: '?function', default: m => m.id },\n\t\t\tdata: { type: '?object' },\n\t\t\tnamespace: { type: 'string', default: 'collection' },\n\t\t\teventBus: { type: 'object', default: eventBus }\n\t\t});\n\n\t\tthis._modelFactory = opt.modelFactory;\n\t\tthis._idAttribute = opt.idAttribute;\n\t\tthis._namespace = opt.namespace;\n\t\tthis._eventBus = opt.eventBus;\n\n\t\tthis._map = opt.idAttribute ? new SortedMap(opt.compare) : [];\n\n\t\t// Populate map with initial data\n\t\tif (opt.data) {\n\t\t\tfor (let item of opt.data) {\n\t\t\t\tthis._addItem(item, false);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more instance events.\n\t * Available events are 'add', 'remove', and 'move'.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {EventBus~eventCallback} [handler] A function to execute when the event is emitted.\n\t * @returns {this}\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t\treturn this;\n\t}\n\n\t /**\n\t * Remove an instance event handler.\n\t * Available events are 'add', 'remove', and 'move'.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {EventBus~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t * @returns {this}\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add an item to the collection.\n\t * @param {*} item Item to add\n\t * @param {idx} [idx] Index value of where to insert the item. Ignored if the collection has a compare function.\n\t * @returns {number} Index value of where the item was inserted in the list\n\t */\n\tadd(item, idx) {\n\t\treturn this._addItem(item, true, idx);\n\t}\n\n\t/**\n\t * Remove an item from the collection.\n\t * @param {string} id Id of the item.\n\t * @returns {number} Order index of the item before removal. -1 if the item id doesn't exist\n\t */\n\tremove(id) {\n\t\tif (!this._idAttribute) {\n\t\t\tthrow new Error(\"No id attribute set.\");\n\t\t}\n\t\tlet item = this.get(id);\n\t\tif (!item) return -1;\n\n\t\tlet idx = this._map.remove(id);\n\n\t\t// Emit event if an item was removed\n\t\tif (idx >= 0) {\n\t\t\tthis._eventBus.emit(this, this._namespace + '.remove', { item: item, idx: idx });\n\t\t}\n\n\t\treturn idx;\n\t}\n\n\t/**\n\t * Remove an item at a given index.\n\t * @param {*} idx Index value of the item to remove.\n\t * @returns {*} Removed item.\n\t */\n\tremoveAtIndex(idx) {\n\t\tif (idx < 0 || idx >= this._map.length) {\n\t\t\tthrow new Error(\"Index out of bounds.\");\n\t\t}\n\n\t\tlet item = this._map[idx];\n\t\tif (this._idAttribute) {\n\t\t\tthis._map.remove(this._idAttribute(item));\n\t\t} else {\n\t\t\tthis._map.splice(idx, 1);\n\t\t}\n\n\t\tthis._eventBus.emit(this, this._namespace + '.remove', { item: item, idx: idx });\n\n\t\treturn item;\n\t}\n\n\t/**\n\t * Get an item from the collection by id\n\t * @param {string} id Id of the item\n\t * @returns {*} Stored item. Undefined if key doesn't exist\n\t */\n\tget(id) {\n\t\tif (!this._idAttribute) {\n\t\t\tthrow new Error(\"No id attribute set.\");\n\t\t}\n\t\treturn this._map.get(id);\n\t}\n\n\t/**\n\t * Move an item within the collection.\n\t * Invalid if the collection has a compare function.\n\t * @param {string} id Id of the item\n\t * @param {*} idx Index to move the item to\n\t * returns {number} Order index of the item before moving. -1 if the item id doesn't exist.\n\t */\n\tmove(id, idx) {\n\t\tif (this.compare) throw \"Cannot use move in list with compare\";\n\n\t\tthrow \"Not implemented\";\n\t}\n\n\t/**\n\t * Retrieves the order index of an item.\n\t * @param {string|object} item Item or id of the item\n\t * @returns {number} Order index of the item. -1 if the item id doesn't exist.\n\t */\n\tindexOf(item) {\n\t\tif (typeof item === 'string') {\n\t\t\titem = this._map.get(item);\n\t\t\tif (!item) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t\treturn this._map.indexOf(item);\n\t}\n\n\tatIndex(idx) {\n\t\treturn this._map[idx];\n\t}\n\n\tget length() {\n\t\treturn this._map.length;\n\t}\n\n\ttoArray() {\n\t\treturn this._map.slice();\n\t}\n\n\t_addItem(item, emit, idx) {\n\t\tif (this._modelFactory) {\n\t\t\titem = this._modelFactory(item);\n\t\t}\n\n\t\tif (this._idAttribute) {\n\t\t\tidx = this._map.add(this._idAttribute(item), item, idx);\n\t\t} else {\n\t\t\tif (typeof idx != 'number') {\n\t\t\t\tidx = this._map.length;\n\t\t\t} else if (idx < 0 || idx > this._map.length) {\n\t\t\t\tthrow new Error(\"Index out of bounds.\");\n\t\t\t}\n\t\t\tthis._map.splice(idx, 0, item);\n\t\t}\n\t\tif (emit) {\n\t\t\tthis._eventBus.emit(this, this._namespace + '.add', { item: item, idx: idx });\n\t\t}\n\t\treturn idx;\n\t}\n\n\t[Symbol.iterator]() {\n\t\tlet i = 0,\n\t\t\ta = this._map,\n\t\t\tl = a.length;\n\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\treturn { value: a[i++], done: i > l };\n\t\t\t}\n\t\t};\n\t}\n}\n\nexport default Collection;\n\nexport function sortOrderCompare(a, b) {\n\treturn a.sortOrder - b.sortOrder;\n};\n","/**\n * Get the props object of a model, or a clone of the model with own properties\n * not prefixed with underscore.\n * @param {*} m Model.\n * @returns {object} Model props object.\n */\nexport function getProps(m) {\n\tif (!m) {\n\t\treturn null;\n\t}\n\tlet props = m && m.props;\n\tif (!props || typeof props !== 'object') {\n\t\tprops = {};\n\t\tfor (let k in m) {\n\t\t\tif (k && m.hasOwnProperty(k) && k[0] !== '_') {\n\t\t\t\tprops[k] = m[k];\n\t\t\t}\n\t\t}\n\t}\n\treturn props;\n}\n\n/**\n * Ensures the value is an array.\n * @param {*} a Array, null, iterable, or object with a toArray function.\n * @returns {Array} An array.\n */\nexport function toArray(a) {\n\tif (!a) {\n\t\treturn [];\n\t}\n\tif (Array.isArray(a)) {\n\t\treturn a;\n\t}\n\tif (typeof a.toArray == 'function') {\n\t\treturn a.toArray();\n\t}\n\n\treturn Array.from(a);\n}\n\n/**\n * Performs a LCS matric calculation\n * https://en.wikipedia.org/wiki/Longest_common_subsequence_problem\n * @param {Array} a Before array.\n * @param {Array} b After array.\n * @param {function} onAdd Called on add.\n * @param {function} onRemove Called on remove.\n */\nexport function patchDiff(a, b, onAdd, onRemove) {\n\tlet t, i, j, s = 0, aa, bb, m = a.length, n = b.length;\n\n\t// Trim of matches at the start and end\n\twhile (s < m && s < n && a[s] === b[s]) {\n\t\ts++;\n\t}\n\tif (s === m && s === n) {\n\t\treturn;\n\t}\n\twhile (s < m && s < n && a[m - 1] === b[n - 1]) {\n\t\tm--;\n\t\tn--;\n\t}\n\n\tif (s > 0 || m < a.length) {\n\t\taa = a.slice(s, m);\n\t\tm = aa.length;\n\t} else {\n\t\taa = a;\n\t}\n\tif (s > 0 || n < b.length) {\n\t\tbb = b.slice(s, n);\n\t\tn = bb.length;\n\t} else {\n\t\tbb = b;\n\t}\n\n\t// Create matrix and initialize it\n\tlet c = new Array(m + 1);\n\tfor (i = 0; i <= m; i++) {\n\t\tc[i] = t = new Array(n + 1);\n\t\tt[0] = 0;\n\t}\n\tt = c[0];\n\tfor (j = 1; j <= n; j++) {\n\t\tt[j] = 0;\n\t}\n\n\tfor (i = 0; i < m; i++) {\n\t\tfor (j = 0; j < n; j++) {\n\t\t\tc[i + 1][j + 1] = aa[i] === bb[j]\n\t\t\t\t? c[i][j] + 1\n\t\t\t\t: Math.max(c[i + 1][j], c[i][j + 1]);\n\t\t}\n\t}\n\n\tlet idx = m + s;\n\ti = m;\n\tj = n;\n\tlet r = 0;\n\tlet adds = [];\n\twhile (true) {\n\t\tm = i - 1;\n\t\tn = j - 1;\n\t\tif (i > 0 && j > 0 && aa[m] === bb[n]) {\n\t\t\t--idx;\n\t\t\ti--;\n\t\t\tj--;\n\t\t} else if (j > 0 && (i === 0 || c[i][n] >= c[m][j])) {\n\t\t\tadds.push([ n, idx, r ]);\n\t\t\tj--;\n\t\t} else if (i > 0 && (j === 0 || c[i][n] < c[m][j])) {\n\t\t\tonRemove(aa[m], m + s, --idx);\n\t\t\tr++;\n\t\t\ti--;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Do the adds\n\tlet len = adds.length - 1;\n\tfor (i = len; i >= 0; i--) {\n\t\t[ n, idx, j ] = adds[i];\n\t\tonAdd(bb[n], n + s, idx - r + j + len - i);\n\t}\n}\n","import eventBus from 'modapp-eventbus';\nimport { array, obj } from 'modapp-utils';\nimport { toArray, patchDiff } from './utils';\n\n/**\n * A wrapper for a {@link module:modapp~Collection}, exposing the underlaying\n * data but can provide a different sort order, mapping of items, filtering of\n * items, or slicing of the collection. It will transparently propagate emitted\n * add and remove events.\n * @implements {module:modapp~Collection}\n */\nclass CollectionWrapper {\n\n\t/**\n\t * Creates an CollectionWrapper instance.\n\t * @param {object} collection Collection object to wrap.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {function} [opt.map] Model map callback. If not provided, item objects will be stored as is.\n\t * @param {function} [opt.filter] Model filter callback. Parameter is a item of the underlying collection.\n\t * @param {number} [opt.begin] Zero-based index at which to begin extraction, similar to Array.slice.\n\t * @param {?number} [opt.end] Zero-based index before which to end extraction, similar to Array.slice. Null extracts until the end of the collection.\n\t * @param {function} [opt.compare] Sort compare function.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'collectionWrapper'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t * @param {?number} [opt.autoDispose] Milliseconds until dispose is called after the number of listeners reaches zero. Default is never.\n\t */\n\tconstructor(collection, opt = {}) {\n\t\tthis._collection = collection || null;\n\n\t\tobj.update(this, opt, {\n\t\t\tmap: { type: '?function', property: '_map' },\n\t\t\tfilter: { type: '?function', property: '_filter' },\n\t\t\tbegin: { type: 'number', default: 0, property: '_begin' },\n\t\t\tend: { type: '?number', property: '_end' },\n\t\t\tcompare: { type: '?function', property: '_compare' },\n\t\t\tnamespace: { type: 'string', default: 'collectionWrapper', property: '_namespace' },\n\t\t\teventBus: { type: 'object', default: eventBus, property: '_eventBus' },\n\t\t\tautoDispose: { type: '?number', property: '_autoDispose' }\n\t\t});\n\n\t\tif (this._map) {\n\t\t\tthis._weakMap = new WeakMap();\n\t\t}\n\n\t\t// Bind callbacks\n\t\tthis._onAdd = this._onAdd.bind(this);\n\t\tthis._onRemove = this._onRemove.bind(this);\n\t\tthis._listen = !!(this._filter || this._map || this._compare);\n\t\tif (this._listen) {\n\t\t\tthis._onChange = this._onChange.bind(this);\n\t\t}\n\n\t\tthis._onCount = 0;\n\t\tthis._timeout = null;\n\t\tthis._disposed = false;\n\n\t\tthis._initList();\n\t\tthis._setEventListeners(true);\n\t\tthis._checkAutoDispose(0);\n\t}\n\n\t_initList() {\n\t\tthis._list = [];\n\t\tthis._len = 0;\n\n\t\tif (!this._collection) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet getModel = this._map\n\t\t\t? item => {\n\t\t\t\tlet m = this._map(item, this._collection);\n\t\t\t\tthis._weakMap.set(item, m);\n\t\t\t\treturn m;\n\t\t\t}\n\t\t\t: item => item;\n\t\tlet add = this._filter\n\t\t\t? (item, m) => {\n\t\t\t\tlet c = this._wrapModel(m, item);\n\t\t\t\tif (c.f) this._len++;\n\t\t\t\tthis._list.push(c);\n\t\t\t}\n\t\t\t: (item, m) => {\n\t\t\t\tthis._list.push(this._wrapModel(m, item));\n\t\t\t\tthis._len++;\n\t\t\t};\n\n\t\tfor (let item of this._collection) {\n\t\t\tlet m = getModel(item);\n\t\t\tif (this._listen && item.on) {\n\t\t\t\titem.on('change', this._onChange);\n\t\t\t}\n\t\t\tadd(item, m);\n\t\t}\n\n\t\tif (this._compare) {\n\t\t\tthis._list.sort((a, b) => this._compare(a.m, b.m));\n\t\t}\n\t}\n\n\t/**\n\t * Length of the collection.\n\t */\n\tget length() {\n\t\tlet s = this._beginIdx();\n\t\tlet e = this._endIdx();\n\t\treturn s > e ? 0 : e - s;\n\t}\n\n\t/**\n\t * Returns the wrapped collection.\n\t * @returns {object}\n\t */\n\tgetCollection() {\n\t\treturn this._collection;\n\t}\n\n\ttoJSON() {\n\t\treturn this._array().map(m => m.toJSON ? m.toJSON() : m);\n\t}\n\n\t/**\n\t * Returns an array of the collection items.\n\t * @returns {Array.<*>} An array of items.\n\t */\n\ttoArray() {\n\t\treturn this._array();\n\t}\n\n\t/**\n\t * Creates an array filled with all array elements that pass a test.\n\t *\n\t * Short hand for CollectionWrapper.toArray().filter(filter).\n\t * @param {function} filter Filter predicate function.\n\t * @returns {Array} A new array with the elements that pass the test.\n\t */\n\tfilter(filter) {\n\t\treturn this._array().filter(filter);\n\t}\n\n\t/**\n\t * Creates a new array populated with the results of calling a provided\n\t * function on every element in the calling array.\n\t *\n\t * Short hand for CollectionWrapper.toArray().map(callback)\n\t * @param {function} callback Function that is called for every item of the collection.\n\t * @returns {Array} A new array with each element being the result of the callback function.\n\t */\n\tmap(callback) {\n\t\treturn this._array().map(callback);\n\t}\n\n\tsetCollection(collection) {\n\t\tcollection = collection || null;\n\t\tif (this._collection === collection) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet oldList = toArray(this._collection);\n\t\tlet newList = toArray(collection);\n\n\t\tthis._setEventListeners(false);\n\t\tthis._collection = collection || null;\n\t\tthis._setEventListeners(true);\n\n\t\tpatchDiff(oldList, newList,\n\t\t\t(item, n, idx) => this._onAdd({\n\t\t\t\titem,\n\t\t\t\tidx,\n\t\t\t}),\n\t\t\t(item, m, idx) => this._onRemove({\n\t\t\t\titem,\n\t\t\t\tidx,\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._checkAutoDispose(1);\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._checkAutoDispose(-1);\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Returns the item at a given index, or undefined if the index is out of bounds.\n\t * @param {number} idx Zero-based index.\n\t * @returns {*} Item located at the given index.\n\t */\n\tatIndex(idx) {\n\t\tlet s = this._beginIdx();\n\t\tlet e = this._endIdx();\n\t\t// Check out of bounds\n\t\tif (idx < 0 || idx >= e - s) return undefined;\n\n\t\t// Set idx to the filtered internal index\n\t\tidx += s;\n\t\tif (this._filter) {\n\t\t\t// Find the idx:th item\n\t\t\tfor (let c of this._list) {\n\t\t\t\tif (c.f) {\n\t\t\t\t\tif (!idx) {\n\t\t\t\t\t\treturn c.m;\n\t\t\t\t\t}\n\t\t\t\t\tidx--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this._list[idx].m;\n\t}\n\n\t/**\n\t * Returns a zero-based index value of an item in the collection.\n\t * @param {*} item Collection item.\n\t * @returns {number} Zero-based index of the item, or -1 if the item is not found.\n\t */\n\tindexOf(item) {\n\t\tlet s = this._beginIdx();\n\t\tlet e = this._endIdx();\n\t\tif (e > s) {\n\t\t\tif (this._filter) {\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (let c of this._list) {\n\t\t\t\t\tif (c.f) {\n\t\t\t\t\t\tif (c.m === item) {\n\t\t\t\t\t\t\treturn i >= s ? i - s : -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tif (i >= e) break;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (c.m === item) {\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = s; i < e; i++) {\n\t\t\t\t\tif (this._list[i].m === item) {\n\t\t\t\t\t\treturn i - s;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Refreshes the collection in case sorting, filtering, or mapping has been\n\t * affected by changes.\n\t */\n\trefresh() {\n\t\tif (this._collection) {\n\t\t\tfor (let item of this._collection) {\n\t\t\t\tthis._onChange(null, item);\n\t\t\t}\n\t\t}\n\t}\n\n\t_indexOf(item) {\n\t\tif (this._filter) {\n\t\t\treturn this._fIndexOf(item);\n\t\t}\n\t\tfor (let i = 0; i < this._list.length; i++) {\n\t\t\tlet c = this._list[i];\n\t\t\tif (c.m === item) {\n\t\t\t\treturn { cont: c, idx: i, fidx: i };\n\t\t\t}\n\t\t}\n\t\treturn { cont: null, idx: -1, fidx: -1 };\n\t}\n\n\t_fIndexOf(item) {\n\t\tlet fi = 0;\n\t\tfor (let i = 0; i < this._list.length; i++) {\n\t\t\tlet c = this._list[i];\n\t\t\tif (c.m === item) {\n\t\t\t\treturn { cont: c, idx: i, fidx: fi };\n\t\t\t}\n\t\t\tif (c.f) fi++;\n\t\t}\n\t\treturn { cont: null, idx: -1, fidx: -1 };\n\t}\n\n\t_atFIndex(fidx) {\n\t\tif (this._filter) {\n\t\t\t// Find the fidx:th item\n\t\t\tfor (let c of this._list) {\n\t\t\t\tif (c.f) {\n\t\t\t\t\tif (!fidx) {\n\t\t\t\t\t\treturn c.m;\n\t\t\t\t\t}\n\t\t\t\t\tfidx--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this._list[fidx].m;\n\t}\n\n\t// Returns the begin index based of the filtered internal list.\n\t// Optionally with the length to calculate from.\n\t_beginIdx(l) {\n\t\tif (l === undefined) l = this._len;\n\t\tlet o = this._begin;\n\t\treturn o < 0\n\t\t\t? Math.max(0, l + o)\n\t\t\t: Math.min(l, o);\n\t}\n\n\t// Returns the end index based of the filtered internal list.\n\t// Optionally with the length to calculate from.\n\t_endIdx(l) {\n\t\tif (l === undefined) l = this._len;\n\t\tlet o = this._end;\n\t\tif (o === null) return l;\n\t\treturn o < 0\n\t\t\t? Math.max(0, l + o)\n\t\t\t: Math.min(l, o);\n\t}\n\n\t_array() {\n\t\tlet arr = this._filter\n\t\t\t? this._list.filter(c => c.f)\n\t\t\t: this._list;\n\t\tlet s = this._beginIdx();\n\t\tlet e = this._endIdx();\n\t\tif (s == 0 && e == this._len) {\n\t\t\treturn arr.map(c => c.m);\n\t\t}\n\t\treturn arr.slice(s, e).map(c => c.m);\n\t}\n\n\t_wrapModel(m, item) {\n\t\treturn this._filter\n\t\t\t? { m: m, f: this._filter(item), i: item }\n\t\t\t: { m: m, i: item };\n\t}\n\n\t_setEventListeners(on) {\n\t\tlet c = this._collection;\n\t\tif (!c || typeof c.on !== 'function') {\n\t\t\treturn;\n\t\t}\n\t\tlet cb = on ? 'on' : 'off';\n\t\tc[cb]('add', this._onAdd);\n\t\tc[cb]('remove', this._onRemove);\n\t}\n\n\t_binarySearch(m) {\n\t\treturn array.binarySearch(this._list, { m }, (a, b) => this._compare(a.m, b.m));\n\t}\n\n\t_onChange(_, item) {\n\t\tlet m = this._weakMap\n\t\t\t? this._weakMap.get(item)\n\t\t\t: item;\n\n\t\t// Get current idx of the item.\n\t\tlet { cont, idx, fidx } = this._indexOf(m);\n\t\tif (!cont) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get filtered and new filter value\n\t\tlet f = true;\n\t\tlet nf = true;\n\t\tif (this._filter) {\n\t\t\tf = cont.f;\n\t\t\tnf = this._filter(item);\n\t\t\tcont.f = nf;\n\t\t}\n\n\t\t// Get new mapped item\n\t\tlet nm = m;\n\t\tif (this._map) {\n\t\t\tnm = this._map(item, this._collection);\n\t\t\tif (m !== nm) {\n\t\t\t\tcont.m = nm;\n\t\t\t\tthis._weakMap.set(item, nm);\n\t\t\t}\n\t\t}\n\n\t\t// Check if item moved\n\t\tlet nfidx = fidx;\n\t\tlet moved = this._compare && !(\n\t\t\t(idx === 0 || this._compare(this._list[idx - 1].m, nm) < 0) &&\n\t\t\t(idx === (this._list.length - 1) || this._compare(nm, this._list[idx + 1].m) < 0)\n\t\t);\n\t\tif (moved) {\n\t\t\t// Remove from last position\n\t\t\tthis._list.splice(idx, 1);\n\t\t\tidx = this._binarySearch(nm);\n\t\t\tif (idx < 0) {\n\t\t\t\t// If idx < 0, the value contains the bitwise compliment of where the\n\t\t\t\t// item would fit.\n\t\t\t\tidx = ~idx;\n\t\t\t}\n\t\t\t// Insert in new position\n\t\t\tthis._list.splice(idx, 0, cont);\n\t\t\tnfidx = this._filter\n\t\t\t\t? nf\n\t\t\t\t\t? this._fIndexOf(m).fidx\n\t\t\t\t\t: fidx\n\t\t\t\t: idx;\n\t\t}\n\n\t\t// Early exit if visibility, mapped value, and index is unchanged.\n\t\tif (f === nf && m === nm && fidx === nfidx) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove unless it was previously hidden\n\t\tif (f) {\n\t\t\tthis._len--;\n\t\t\tthis._trySendRemove(m, fidx);\n\t\t}\n\n\t\t// Add unless it is now hidden\n\t\tif (nf) {\n\t\t\tthis._len++;\n\t\t\tthis._trySendAdd(nm, nfidx);\n\t\t}\n\t}\n\n\t_trySendAdd(m, i) {\n\t\tlet l = this._len;\n\t\tlet cur_s = this._beginIdx(l);\n\t\tlet pre_s = this._beginIdx(l - 1);\n\t\tlet cur_e = this._endIdx(l);\n\t\tlet pre_e = this._endIdx(l - 1);\n\n\t\t// Quick escape\n\t\tif (pre_s >= pre_e && cur_s >= cur_e) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (cur_s > pre_s) {\n\t\t\tif (i >= cur_s) {\n\t\t\t\tthis._sendRemove(this._atFIndex(pre_s), 0);\n\t\t\t}\n\t\t} else {\n\t\t\tif (i < cur_s) {\n\t\t\t\tthis._sendAdd(this._atFIndex(cur_s), 0);\n\t\t\t}\n\t\t}\n\n\t\tif (i >= cur_s && i < cur_e) {\n\t\t\tthis._sendAdd(m, i - cur_s);\n\t\t}\n\n\t\tif (cur_e > pre_e) {\n\t\t\tif (i >= cur_e) {\n\t\t\t\tthis._sendAdd(this._atFIndex(cur_e - 1), cur_e - cur_s - 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (i < cur_e) {\n\t\t\t\tthis._sendRemove(this._atFIndex(cur_e), cur_e - cur_s);\n\t\t\t}\n\t\t}\n\t}\n\n\t_trySendRemove(m, i) {\n\t\tlet l = this._len;\n\t\tlet cur_s = this._beginIdx(l);\n\t\tlet pre_s = this._beginIdx(l + 1);\n\t\tlet cur_e = this._endIdx(l);\n\t\tlet pre_e = this._endIdx(l + 1);\n\n\t\t// Quick escape\n\t\tif (pre_s >= pre_e && cur_s >= cur_e) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (cur_e < pre_e) {\n\t\t\tif (i >= pre_e) {\n\t\t\t\tthis._sendRemove(this._atFIndex(pre_e - 1), pre_e - pre_s - 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (i < pre_e) {\n\t\t\t\tthis._sendAdd(this._atFIndex(pre_e - 1), pre_e - pre_s);\n\t\t\t}\n\t\t}\n\n\t\tif (i >= pre_s && i < pre_e) {\n\t\t\tthis._sendRemove(m, i - pre_s);\n\t\t}\n\n\t\tif (cur_s < pre_s) {\n\t\t\tif (i > cur_s) {\n\t\t\t\tthis._sendAdd(this._atFIndex(cur_s), 0);\n\t\t\t}\n\t\t} else {\n\t\t\tif (i < cur_s) {\n\t\t\t\tthis._sendRemove(this._atFIndex(cur_s - 1), 0);\n\t\t\t}\n\t\t}\n\t}\n\n\t_sendAdd(item, idx) {\n\t\tthis._eventBus.emit(this, this._namespace + '.add', {\n\t\t\titem,\n\t\t\tidx\n\t\t});\n\t}\n\n\t_sendRemove(item, idx) {\n\t\tthis._eventBus.emit(this, this._namespace + '.remove', {\n\t\t\titem,\n\t\t\tidx\n\t\t});\n\t}\n\n\t_onAdd(e) {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet m = this._map\n\t\t\t? this._map(e.item, this._collection)\n\t\t\t: e.item;\n\t\tlet idx = this._compare\n\t\t\t? this._binarySearch(m)\n\t\t\t: e.idx;\n\n\t\tif (this._weakMap) {\n\t\t\tthis._weakMap.set(e.item, m);\n\t\t}\n\n\t\tif (idx < 0) {\n\t\t\t// If idx < 0, the value contains the bitwise compliment of where the\n\t\t\t// item would fit.\n\t\t\tidx = ~idx;\n\t\t}\n\n\t\tlet cont = this._wrapModel(m, e.item);\n\t\tthis._list.splice(idx, 0, cont);\n\n\t\tif (this._listen && e.item.on) {\n\t\t\te.item.on('change', this._onChange);\n\t\t}\n\n\t\tif (this._filter) {\n\t\t\tif (!cont.f) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tidx = this._fIndexOf(m).fidx;\n\t\t}\n\n\t\tthis._len++;\n\t\tthis._trySendAdd(m, idx);\n\t}\n\n\t_onRemove(e) {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet m = this._weakMap && this._compare\n\t\t\t? this._weakMap.get(e.item)\n\t\t\t: e.item;\n\t\tlet idx = this._compare\n\t\t\t? this._binarySearch(m)\n\t\t\t: e.idx;\n\n\t\tlet cont = this._list[idx];\n\n\t\tif (this._weakMap) {\n\t\t\tthis._weakMap.delete(e.item);\n\t\t}\n\n\t\tlet fidx = idx;\n\t\tif (this._listen && e.item.on) {\n\t\t\te.item.off('change', this._onChange);\n\t\t}\n\n\t\tif (this._filter) {\n\t\t\t// Quick exit if a filtered item was removed.\n\t\t\tif (!cont.f) {\n\t\t\t\treturn this._list.splice(idx, 1);\n\t\t\t}\n\t\t\tlet r = this._fIndexOf(m);\n\t\t\tif (!r.cont) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfidx = r.fidx;\n\t\t}\n\n\t\tthis._list.splice(idx, 1);\n\t\tthis._len--;\n\t\tthis._trySendRemove(m, fidx);\n\t}\n\n\t_checkAutoDispose(dt) {\n\t\tlet ms = this._autoDispose;\n\t\tif (ms === null) {\n\t\t\treturn;\n\t\t}\n\t\tthis._onCount += dt;\n\t\tif (this._onCount > 0) {\n\t\t\tif (this._timeout) {\n\t\t\t\tclearTimeout(this._timeout);\n\t\t\t\tthis._timeout = null;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._timeout = setTimeout(() => this.dispose(), ms);\n\t\t}\n\t}\n\n\tdispose() {\n\t\tif (this._disposed) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._listen) {\n\t\t\tfor (let cont of this._list) {\n\t\t\t\tlet item = cont.i;\n\t\t\t\tif (item && item.on) {\n\t\t\t\t\titem.off('change', this._onChange);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._setEventListeners(false);\n\t\tdelete this._collection;\n\t\tdelete this._weakMap;\n\t\tthis.disposed = false;\n\t}\n\n\t[Symbol.iterator]() {\n\t\tlet i = 0;\n\t\tlet a;\n\t\tlet arr = this._list;\n\t\tlet done = { done: true };\n\t\tlet s = this._beginIdx();\n\t\tlet e = this._endIdx();\n\t\tlet si = 0;\n\n\t\tif (e <= s) {\n\t\t\treturn { next: function() { return done; } };\n\t\t}\n\n\t\tif (this._filter) {\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\twhile (si < e) {\n\t\t\t\t\t\ta = arr[i];\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tif (a.f) {\n\t\t\t\t\t\t\tsi++;\n\t\t\t\t\t\t\tif (si > s) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tvalue: a.m,\n\t\t\t\t\t\t\t\t\tdone: false\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn done;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\ti = s;\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\treturn i < e\n\t\t\t\t\t? { value: arr[i++].m, done: false }\n\t\t\t\t\t: done;\n\t\t\t}\n\t\t};\n\t}\n}\n\nexport default CollectionWrapper;\n","import eventBus from 'modapp-eventbus';\nimport { obj } from 'modapp-utils';\n\n/**\n * Model key callback\n * @callback CollectionToModel~modelKeyCallback\n * @param {*} item Collection item\n * @returns {string} Model key for the item. Must be unique for all items in the collection, and should be based on immutable values.\n */\n\n/**\n * A wrapper for a {@link module:modapp~Collection} that exposes an object that implements the {@link module:modapp~Model}\n * interface. It will transparently propagate emitted add and remove events and turn them to change events.\n * @implements {module:modapp~Model}\n */\nclass CollectionToModel {\n\n\t/**\n\t * Creates an CollectionToModel instance.\n\t * @param {object} collection Collection object to wrap.\n\t * @param {CollectionToModel~modelKeyCallback} keyCallback Model key callback function.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {function} [opt.map] Model value map callback. If not provided, model values will be the same as collection items: func(item) -> value\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'collectionToModel'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(collection, keyCallback, opt = {}) {\n\t\tthis._collection = null;\n\t\tthis._props = {};\n\t\tthis._keyCallback = keyCallback;\n\n\t\tobj.update(this, opt, {\n\t\t\tmap: { type: 'function', default: v => v, property: '_map' },\n\t\t\tnamespace: { type: 'string', default: 'collectionToModel', property: '_namespace' },\n\t\t\teventBus: { type: 'object', default: eventBus, property: '_eventBus' }\n\t\t});\n\n\t\t// Bind callbacks\n\t\tthis._onAdd = this._onAddRemove.bind(this, true);\n\t\tthis._onRemove = this._onAddRemove.bind(this, false);\n\n\t\tthis.setCollection(collection, true);\n\t}\n\n\t/**\n\t * Model properties.\n\t * @returns {object} Anonymous object with all model properties.\n\t */\n\tget props() {\n\t\treturn this._props;\n\t}\n\n\t/**\n\t * Set wrapped collection.\n\t * @param {Collection|Array?} collection Collection to wrap.\n\t * @param {boolean} noEvents If true, no events should be emitted.\n\t * @returns {this}\n\t */\n\tsetCollection(collection, noEvents) {\n\t\tcollection = collection || null;\n\t\tif (this._collection === collection) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._setEventListeners(false);\n\t\tthis._collection = collection;\n\n\t\t// Init props\n\t\tlet o = {};\n\t\tfor (let v of this._collection) {\n\t\t\tlet k = this._keyCallback(v);\n\t\t\to[k] = this._map(v);\n\t\t}\n\n\t\tlet change = {};\n\t\tfor (let k in o) {\n\t\t\tlet mv = o[k];\n\t\t\tif (mv !== this._props[k]) {\n\t\t\t\tchange[k] = this._props[k];\n\t\t\t\tthis._props[k] = mv;\n\t\t\t\tif (this._promote(k)) {\n\t\t\t\t\tthis[k] = mv;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let k in this._props) {\n\t\t\tif (!o.hasOwnProperty(k)) {\n\t\t\t\tchange[k] = this._props[k];\n\t\t\t\tdelete this._props[k];\n\t\t\t\tif (this._promote(k)) {\n\t\t\t\t\tdelete this[k];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._setEventListeners(true);\n\n\t\tif (!noEvents) {\n\t\t\tthis._eventBus.emit(this, this._namespace + '.change', change);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get wrapped collection\n\t * @returns {Collection?} Collection\n\t */\n\tgetCollection() {\n\t\treturn this._collection;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t_setEventListeners(on) {\n\t\tif (!this._collection || !this._collection.on) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (on) {\n\t\t\tthis._collection.on('add', this._onAdd);\n\t\t\tthis._collection.on('remove', this._onRemove);\n\t\t} else {\n\t\t\tthis._collection.off('add', this._onAdd);\n\t\t\tthis._collection.off('remove', this._onRemove);\n\t\t}\n\t}\n\n\t_onAddRemove(isAdd, e) {\n\t\tif (!this._collection) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet v = e.item;\n\t\tlet k = this._keyCallback(v);\n\t\tlet ov = this._props[k];\n\t\tlet mv = this._map(v);\n\n\t\tif (isAdd) {\n\t\t\tthis._props[k] = mv;\n\t\t\tif (this._promote(k)) {\n\t\t\t\tthis[k] = mv;\n\t\t\t}\n\t\t} else {\n\t\t\tdelete this._props[k];\n\t\t\tif (this._promote(k)) {\n\t\t\t\tdelete this[k];\n\t\t\t}\n\t\t}\n\n\t\tthis._eventBus.emit(this, this._namespace + '.change', { [k]: ov });\n\t}\n\n\t_promote(key) {\n\t\treturn (this.hasOwnProperty(key) || typeof this[key] == 'undefined') && key[0] !== '_';\n\t}\n\n\ttoJSON() {\n\t\tlet o = Object.assign({}, this._props);\n\t\tfor (let k in o) {\n\t\t\tvar v = o[k];\n\t\t\tif (typeof v === 'object' && v !== null && v.toJSON) {\n\t\t\t\to[k] = v.toJSON();\n\t\t\t}\n\t\t}\n\t\treturn o;\n\t}\n\n\tdispose() {\n\t\tif (!this._collection) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._setEventListeners(false);\n\t\tdelete this._props;\n\t\tdelete this._collection;\n\t}\n\n}\n\nexport default CollectionToModel;\n","import eventBus from 'modapp-eventbus';\n\n/**\n * Creates a single collection out of an array or collection of arrays or\n * collections, joining them one after the other.\n */\nclass JoinedCollection {\n\n\t/**\n\t * Creates a new JoinedCollection instance\n\t * @param {Collection.} collections Collection of collections.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'joinedCollection'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(collections, opt) {\n\t\topt = opt || {};\n\t\tthis._collections = collections;\n\t\tthis._namespace = opt.namespace || 'joinedCollection';\n\t\tthis._eventBus = opt.eventBus || eventBus;\n\n\t\t// Bind callbacks\n\t\tthis._onMainAdd = this._onMainAdd.bind(this);\n\t\tthis._onMainRemove = this._onMainRemove.bind(this);\n\n\t\tthis._subs = [];\n\n\t\tif (this._collections) {\n\t\t\tthis._setListeners(true);\n\t\t\tfor (let c of this._collections) {\n\t\t\t\tthis._subs.push(this._addSubListeners(c));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Length of the joined collection.\n\t */\n\tget length() {\n\t\tlet l = 0;\n\t\tfor (let sub of this._subs) {\n\t\t\tl += (sub.col && sub.col.length) || 0;\n\t\t}\n\t\treturn l;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Sets the collection of collections or arrays.\n\t * @param {?Collection.} collections Collection or array of collections or arrays.\n\t * @returns {this}\n\t */\n\tsetCollections(collections) {\n\t\tcollections = collections || null;\n\t\tif (collections == this._collections) return;\n\n\t\t// Send remove events for all items in previous collection.\n\t\tif (this._collections) {\n\t\t\tthis._setListeners(false);\n\t\t\tfor (let c of this._collections) {\n\t\t\t\tthis._onMainRemove({ item: c, idx: 0 });\n\t\t\t}\n\t\t}\n\n\t\tthis._collections = collections;\n\n\t\t// Send add events for all items in the new collection\n\t\tif (this._collections) {\n\t\t\tlet i = 0;\n\t\t\tfor (let c of this._collections) {\n\t\t\t\tthis._onMainAdd({ item: c, idx: i });\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tthis._setListeners(true);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the item at a given index, or undefined if the index is out of bounds.\n\t * @param {number} idx Zero-based index.\n\t * @returns {*} Item located at the given index.\n\t */\n\tatIndex(idx) {\n\t\tif (this._collections && idx >= 0) {\n\t\t\tlet i = 0;\n\t\t\tfor (let sub of this._subs) {\n\t\t\t\tlet l = (sub.col && sub.col.length) || 0;\n\t\t\t\ti += l;\n\t\t\t\tif (i > idx) {\n\t\t\t\t\ti -= l;\n\t\t\t\t\tfor (let item of sub.col) {\n\t\t\t\t\t\tif (i == idx) {\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t_setListeners(on) {\n\t\tlet cb = on ? 'on' : 'off';\n\t\tif (this._collections || typeof this._collections[cb] == 'function') {\n\t\t\treturn;\n\t\t}\n\t\tthis._collections[cb]('add', this._onMainAdd);\n\t\tthis._collections[cb]('remove', this._onMainRemove);\n\t}\n\n\t_addSubListeners(c) {\n\t\tif (!c || typeof c.on == 'function') {\n\t\t\treturn { col: c };\n\t\t}\n\t\tlet sub = {};\n\t\tsub.add = this._onSubAdd.bind(this, sub);\n\t\tsub.remove = this._onSubRemove.bind(this, sub);\n\t\tc.on('add', sub.add);\n\t\tc.on('remove', sub.remove);\n\t\treturn sub;\n\t}\n\n\t_removeSubListeners(sub) {\n\t\tlet c = sub.col;\n\t\tif (c && typeof c.off == 'function') {\n\t\t\tc.off('add', sub.add);\n\t\t\tc.off('remove', sub.remove);\n\t\t}\n\t}\n\n\t_onMainAdd(ev) {\n\t\tlet idx = ev.idx;\n\t\tlet c = ev.item;\n\n\t\t// Create a new sub and add it to our list.\n\t\tlet sub = this._addSubListeners(c, true);\n\t\tthis._subs.splice(idx, 0, sub);\n\n\t\t// Then we loop over it, emitting a lot of add events.\n\t\tif (c && c.length) {\n\t\t\tlet i = this._getIdxStart(idx);\n\t\t\tfor (let item of c) {\n\t\t\t\tthis._eventBus.emit(this, this._namespace + '.add', {\n\t\t\t\t\titem,\n\t\t\t\t\tidx: i\n\t\t\t\t});\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\n\t_onMainRemove(ev) {\n\t\tlet idx = ev.idx;\n\n\t\t// Get the sub, remove it from our list, and stop listening to it.\n\t\tlet sub = this._subs[idx];\n\t\tthis._sub.splice(idx, 1);\n\t\tthis._removeSubListeners(sub);\n\t\tlet c = sub.col;\n\n\t\t// Then we loop over it, emitting a lot of remove events.\n\t\tif (c && c.length) {\n\t\t\tlet i = this._getIdxStart(idx);\n\t\t\tfor (let item of c) {\n\t\t\t\tthis._eventBus.emit(this, this._namespace + '.remove', {\n\t\t\t\t\titem,\n\t\t\t\t\tidx: i\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t_onSubAdd(sub, ev) {\n\t\tlet i = this._getSubStart(sub);\n\t\tthis._eventBus.emit(this, this._namespace + '.add', {\n\t\t\titem: ev.item,\n\t\t\tidx: i + ev.idx\n\t\t});\n\t}\n\n\t_onSubRemove(sub, ev) {\n\t\tlet i = this._getSubStart(sub);\n\t\tthis._eventBus.emit(this, this._namespace + '.remove', {\n\t\t\titem: ev.item,\n\t\t\tidx: i + ev.idx\n\t\t});\n\t}\n\n\t_getIdxStart(idx) {\n\t\tlet i = 0;\n\t\tfor (let j = 0; j < idx; j++) {\n\t\t\tlet s = this._subs[j];\n\t\t\ti += (s.col && s.col.length) || 0;\n\t\t}\n\t\treturn i;\n\t}\n\n\t_getSubStart(sub) {\n\t\tlet i = 0;\n\t\tfor (let s of this._subs) {\n\t\t\tif (s === sub) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\ti += (s.col && s.col.length) || 0;\n\t\t}\n\t\tthrow new Error(\"Collection not found: \", sub.col);\n\t}\n\n\n\tdispose() {\n\t\tif (this._subs) {\n\t\t\tfor (let sub of this._subs) {\n\t\t\t\tthis._removeSubListeners(sub);\n\t\t\t}\n\t\t\tthis._subs = [];\n\t\t}\n\t\tthis._setListeners(false);\n\t\tthis._collections = null;\n\t}\n\n\t[Symbol.iterator]() {\n\t\tlet done = { done: true };\n\t\tif (!this._collections) {\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\treturn done;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tlet arr = this._subs;\n\t\tlet i = 0;\n\t\tlet len = this._subs.length;\n\t\tlet it = null;\n\t\tlet r = null;\n\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\twhile (true) {\n\t\t\t\t\t// Get next iterator\n\t\t\t\t\twhile (!it) {\n\t\t\t\t\t\tif (i >= len) return done;\n\t\t\t\t\t\tit = arr[i].col[Symbol.iterator]();\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\n\t\t\t\t\tr = it.next();\n\t\t\t\t\tif (!r.done) {\n\t\t\t\t\t\treturn r;\n\t\t\t\t\t}\n\t\t\t\t\t// Iterator depleted\n\t\t\t\t\tit = null;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n}\n\nexport default JoinedCollection;\n","import eventBus from 'modapp-eventbus';\nimport { obj } from 'modapp-utils';\n\n/**\n * Model is a generic data model.\n * @implements {module:modapp~Model}\n */\nclass Model {\n\n\t/**\n\t * Creates a Model instance\n\t * @param {object} [opt] Optional parameters.\n\t * @param {object} [opt.definition] Object definition. If not provided, any value will be allowed.\n\t * @param {object} [opt.data] Initial data.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'model'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(opt = {}) {\n\t\tthis._definition = opt.definition || null;\n\t\tthis._namespace = opt.namespace || 'model';\n\t\tthis._eventBus = opt.eventBus || eventBus;\n\n\t\tthis._props = {};\n\t\tif (opt.data) {\n\t\t\tthis._update(opt.data, false);\n\t\t}\n\t}\n\n\t/**\n\t * Model properties.\n\t * @returns {object} Anonymous object with all model properties.\n\t */\n\tget props() {\n\t\treturn this._props;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Sets model properties\n\t * If any property where changed, this will trigger a change event.\n\t * @param {object} props Properties to set\n\t * @returns {Promise} Promise to the setting of the properties.\n\t */\n\tset(props) {\n\t\treturn Promise.resolve(this._update(props, true));\n\t}\n\n\t/**\n\t * Resets all model properties to the given props. If any property where\n\t * changed or is missing, this will trigger a change event.\n\t * @param {object} props Properties to reset the model to.\n\t * @returns {Promise} Promise to the setting of the properties.\n\t */\n\treset(props) {\n\t\treturn Promise.resolve(this._update(props, true, true));\n\t}\n\n\t/**\n\t * Returns the model definition, or null if none is set.\n\t * @returns {?object} Object definition\n\t */\n\tgetDefinition() {\n\t\treturn this._definition;\n\t}\n\n\t/**\n\t * Updates the properties.\n\t * @param {object} props Properties to update.\n\t * @param {boolean} emit Flag if changes though be emitted on the eventBus.\n\t * @param {boolean} reset Flag that sets if missing values should be deleted.\n\t * @returns {?object} Key/value object with the change properties and old values, or null if there were no changes.\n\t * @private\n\t */\n\t_update(props, emit, reset) {\n\t\tif (!props) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet changed = null;\n\t\tlet v, promote;\n\t\tlet p = this._props;\n\n\t\tif (reset) {\n\t\t\tprops = Object.assign({}, props);\n\t\t\tfor (var k in p) {\n\t\t\t\tif (!props.hasOwnProperty(k)) {\n\t\t\t\t\tprops[k] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this._definition) {\n\t\t\tchanged = obj.update(p, props, this._definition);\n\t\t\tfor (let key in changed) {\n\t\t\t\tif ((this.hasOwnProperty(key) || !this[key]) && key[0] !== '_') {\n\t\t\t\t\tv = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let key in props) {\n\t\t\t\tv = props[key];\n\t\t\t\tpromote = (this.hasOwnProperty(key) || !this[key]) && key[0] !== '_';\n\t\t\t\tif (p[key] !== v) {\n\t\t\t\t\tchanged = changed || {};\n\t\t\t\t\tchanged[key] = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete p[key];\n\t\t\t\t\t\tif (promote) delete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp[key] = v;\n\t\t\t\t\t\tif (promote) this[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (changed && emit) {\n\t\t\tthis._eventBus.emit(this, this._namespace + '.change', changed);\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\ttoJSON() {\n\t\tif (this._definition) {\n\t\t\treturn obj.copy(this._props, this._definition);\n\t\t}\n\n\t\tlet props = {};\n\t\tlet p = this.props;\n\t\tlet v;\n\t\tfor (let k in p) {\n\t\t\tv = p[k];\n\t\t\tprops[k] = v && typeof v == 'object' && typeof v.toJSON == 'function' ? v.toJSON() : v;\n\t\t}\n\t\treturn props;\n\t}\n}\n\nexport default Model;\n","import eventBus from 'modapp-eventbus';\nimport { obj } from 'modapp-utils';\n\nfunction hasProps(m) {\n\treturn m && m.props && typeof m.props == 'object' ? m.props : null;\n}\n\nfunction getProps(m) {\n\tif (!m) {\n\t\treturn null;\n\t}\n\tlet props = hasProps(m);\n\tif (props) {\n\t\treturn props;\n\t}\n\tlet o = {};\n\tfor (let k in m) {\n\t\tif (k && m.hasOwnProperty(k) && k[0] !== '_') {\n\t\t\to[k] = m[k];\n\t\t}\n\t}\n\treturn o;\n}\n\n/**\n * ModifyModel wraps another object or a {@link module:modapp~Model}, and sets\n * its own properties to the match.\n *\n * Any property modification that will cause a difference between the models\n * will set the additional property \"isModified\" to be true.\n *\n * It also listens to changed in the underlying model. If a non-modified\n * property is changed, the ModifyModel will update its own property.\n *\n * Because ModifyModel listens to the underlying model, it needs to be disposed\n * when not used anymore.\n * @implements {module:modapp~Model}\n */\nclass ModifyModel {\n\n\t/**\n\t * Creates a ModifyModel instance\n\t * @param {object|Model} model Model object to wrap.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {object} [opt.definition] Object definition. If not provided, any value will be allowed.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'modifyModel'.\n\t * @param {object} [opt.isModifiedProperty] Property used to flag if model is modified. Defaults to 'isModified'.\n\t * @param {object} [opt.props] Properties to set initially.\n\t * @param {function} [opt.onChange] Callback called whenever the underlying model has changed. function(this, change)\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t * @param {boolean} [opt.modifiedOnNew] [opt.modifiedOnNew] Flag telling if model is considered modified on new properties not existing on the wrapped model. Defaults to false.\n\t */\n\tconstructor(model, opt = {}) {\n\t\tthis._model = model;\n\t\tthis._modification = {};\n\n\t\tthis._eventBus = opt.eventBus || eventBus;\n\t\tthis._namespace = opt.namespace || 'modifyModel';\n\t\tthis._definition = opt.definition || null;\n\t\tthis._modProp = opt.hasOwnProperty('isModifiedProperty') ? opt.isModifiedProperty : 'isModified';\n\t\tthis._modifiedOnNew = !!opt.modifiedOnNew;\n\t\tthis._onChange = opt.onChange || null;\n\t\tthis._props = {};\n\n\t\tthis._setIsModified(this._update(getProps(model)));\n\t\tif (opt.props) {\n\t\t\tthis._setIsModified(this._update(opt.props));\n\t\t}\n\n\t\tthis._onCount = 0;\n\t\tthis._timeout = null;\n\n\t\t// Bind callbacks\n\t\tthis._onModelChange = this._onModelChange.bind(this);\n\t\tthis._setEventListener(true);\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Sets model properties\n\t * If any property where changed, this will trigger a change event.\n\t * @param {object} props Properties to set\n\t * @returns {Promise} Promise to the setting of the properties.\n\t */\n\tset(props) {\n\t\tlet changed = props ? this._update(props) : null;\n\t\tchanged = this._setIsModified(changed);\n\n\t\tif (changed) {\n\t\t\tthis._eventBus.emit(this, this._namespace + '.change', changed);\n\t\t}\n\n\t\treturn Promise.resolve(changed);\n\t}\n\n\tget props() {\n\t\treturn this._props;\n\t}\n\n\t/**\n\t * Resets a single or all model properties to the underlying model, clearing\n\t * any modifications. If any property where changed or is missing, this will\n\t * trigger a change event.\n\t * @param {string} [prop] Optional property to reset. Defaults to resetting all properties.\n\t * @returns {Promise} Promise to the setting of the properties.\n\t */\n\treset(prop) {\n\t\tlet o = {};\n\t\tlet m = hasProps(this._model) || this._model;\n\t\tif (prop) {\n\t\t\tif (this._modification.hasOwnProperty(prop)) {\n\t\t\t\to[prop] = m[prop];\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let k in this._modification) {\n\t\t\t\to[k] = m[k];\n\t\t\t}\n\t\t}\n\t\treturn this.set(o);\n\t}\n\n\t/**\n\t * Get the modifications in ModifyModel in comparison to the underlying model object.\n\t * @returns {?object} Key/value object with modified properties and their new value. Null if there are no modifications.\n\t */\n\tgetModifications() {\n\t\treturn Object.keys(this._modification).length\n\t\t\t? Object.assign({}, this._modification)\n\t\t\t: null;\n\t}\n\n\tgetModel() {\n\t\treturn this._model;\n\t}\n\n\t_setIsModified(changed) {\n\t\tif (changed) {\n\t\t\tlet v;\n\t\t\tlet m = hasProps(this._model) || this._model;\n\t\t\tfor (let k in changed) {\n\t\t\t\tv = m[k];\n\t\t\t\tif (this._props[k] === v || (!this._modifiedOnNew && typeof v == 'undefined')) {\n\t\t\t\t\tdelete this._modification[k];\n\t\t\t\t} else {\n\t\t\t\t\tthis._modification[k] = this._props[k];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Do we have any modifications\n\t\tif (this._modProp) {\n\t\t\tlet newIsModified = Object.keys(this._modification).length > 0;\n\t\t\tif (newIsModified !== this._props[this._modProp]) {\n\t\t\t\tchanged = changed || {};\n\t\t\t\tchanged[this._modProp] = !newIsModified;\n\t\t\t\tthis._props[this._modProp] = newIsModified;\n\t\t\t\tthis[this._modProp] = newIsModified;\n\t\t\t}\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\t_setEventListener(on) {\n\t\tif (this._model && this._model.on) {\n\t\t\tthis._model[on ? 'on' : 'off']('change', this._onModelChange);\n\t\t}\n\t}\n\n\t_onModelChange(changed) {\n\t\tif (!this._model) return;\n\n\t\tlet m = hasProps(this._model) || this._model;\n\t\tlet props;\n\t\tfor (let k in changed) {\n\t\t\t// If the value isn't modified\n\t\t\tif (!this._modification.hasOwnProperty(k)) {\n\t\t\t\tprops = props || {};\n\t\t\t\tprops[k] = m[k];\n\t\t\t} else {\n\t\t\t\tif (this._props[k] === m[k]) {\n\t\t\t\t\tdelete this._modification[k];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.set(props);\n\t\tif (this._onChange) {\n\t\t\tthis._onChange(this, changed);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the properties.\n\t * @param {object} props Properties to update.\n\t * @returns {?object} Key/value object with the change properties and old values, or null if there were no changes.\n\t * @private\n\t */\n\t_update(props) {\n\t\tif (!props) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet changed = null;\n\t\tlet v, promote;\n\t\tlet p = this._props;\n\n\t\tif (this._definition) {\n\t\t\tchanged = obj.update(p, props, this._definition);\n\t\t\tfor (let key in changed) {\n\t\t\t\tif ((this.hasOwnProperty(key) || !this[key]) && key[0] !== '_') {\n\t\t\t\t\tv = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let key in props) {\n\t\t\t\tv = props[key];\n\t\t\t\tpromote = (this.hasOwnProperty(key) || !this[key]) && key[0] !== '_';\n\t\t\t\tif (p[key] !== v) {\n\t\t\t\t\tchanged = changed || {};\n\t\t\t\t\tchanged[key] = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete p[key];\n\t\t\t\t\t\tif (promote) delete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp[key] = v;\n\t\t\t\t\t\tif (promote) this[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\ttoJSON() {\n\t\tif (this._definition) {\n\t\t\treturn obj.copy(this._props, this._definition);\n\t\t}\n\n\t\tlet props = {};\n\t\tlet p = this.props;\n\t\tlet v;\n\t\tfor (let key in p) {\n\t\t\tv = p[k];\n\t\t\tprops[key] = v && typeof v == 'object' && typeof v.toJSON == 'function' ? v.toJSON() : v;\n\t\t}\n\t\treturn props;\n\t}\n\n\tdispose() {\n\t\tthis._setEventListener(false);\n\t\tthis._model = null;\n\t}\n}\n\nexport default ModifyModel;\n","import eventBus from 'modapp-eventbus';\nimport { array } from 'modapp-utils';\nimport { getProps, patchDiff } from './utils';\n\nfunction compare(a, b) {\n\treturn a.key.localeCompare(b.key);\n}\n\n/**\n * ModelToCollection turns a model into a collection.\n */\nclass ModelToCollection {\n\n\t/**\n\t * Creates a ModelToCollection instance.\n\t * @param {object|Model} model Model\n\t * @param {object} [opt] Optional parameters.\n\t * @param {function} [opt.compare] Compare function with receives two objects { key, value }. Defaults to: (a, b) => a.key.localeCompare(b.key)\n\t * @param {function} [opt.filter] Filter function filtering which key/values to show: function(key, value) -> boolean\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'modelToCollection'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(model, opt) {\n\t\topt = opt || {};\n\t\tthis._compare = opt.compare || compare;\n\t\tthis._namespace = opt.namespace || 'modelToCollection';\n\t\tthis._eventBus = opt.eventBus || eventBus;\n\t\tthis._filter = opt.filter || null;\n\n\t\t// Bind callbacks\n\t\tthis._onChange = this._onChange.bind(this);\n\n\t\t// Init list\n\t\tthis._list = [];\n\t\tthis._props = {};\n\t\tif (this._filter) {\n\t\t\tthis._filtered = {};\n\t\t}\n\t\tthis.setModel(model, false);\n\t}\n\n\tget length() {\n\t\treturn this._list.length;\n\t}\n\n\t/**\n\t * Get wrapped model.\n\t * @returns {object|Model} Model\n\t */\n\tgetModel() {\n\t\treturn this._model;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Retrieves the order index of an item.\n\t * @param {*} item Collection item.\n\t * @returns {number} Order index of the item. -1 if the item id doesn't exist.\n\t */\n\tindexOf(item) {\n\t\tfor (let i = 0; i < this._list.length; i++) {\n\t\t\tif (this._list[i].value === item) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Returns the item at a given index.\n\t * @param {number} idx Index position\n\t * @returns {*} Item or undefined if idx is out of bounds.\n\t */\n\tatIndex(idx) {\n\t\treturn idx < 0 || idx >= this._list.length ? undefined : this._list[idx];\n\t}\n\n\t/**\n\t * Returns the collection as an array.\n\t * @returns {Array} Array of items.\n\t */\n\ttoArray() {\n\t\treturn this._list.map(o => o.value);\n\t}\n\n\t/**\n\t * Sets the wrapped model.\n\t * @param {?object} model Model or object to set.\n\t * @param {boolean} noEvents Flag telling if no collection events should be triggered during set.\n\t * @returns {this}\n\t */\n\tsetModel(model, noEvents) {\n\t\tmodel = model || null;\n\t\tif (model === this._model) return this;\n\n\t\tfor (let k in this._props) {\n\t\t\tthis._unlistenItem(this._props[k]);\n\t\t}\n\n\t\tthis._listen(false);\n\t\tthis._model = model;\n\t\tthis._listen(true);\n\n\t\tlet oldList = this._list;\n\t\tthis._list = [];\n\t\tthis._props = {};\n\t\tif (this._filter) {\n\t\t\tthis._filtered = {};\n\t\t}\n\n\t\tif (this._model) {\n\t\t\t// Iterate over props object if available, otherwise the model itself.\n\t\t\tlet p = getProps(this._model);\n\n\t\t\tfor (let k in p) {\n\t\t\t\tlet v = p[k];\n\t\t\t\tlet o = { key: k, value: v };\n\t\t\t\tif (!this._filter || this._filter(k, v)) {\n\t\t\t\t\tthis._list.push(o);\n\t\t\t\t} else {\n\t\t\t\t\tthis._filtered[k] = o;\n\t\t\t\t}\n\t\t\t\tthis._listenItem(o);\n\t\t\t}\n\n\t\t\tthis._list.sort(this._compare);\n\t\t}\n\n\t\tif (!noEvents) {\n\t\t\tthis._sendSyncEvents(oldList, this._list);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t_sendSyncEvents(oldList, newList) {\n\t\tpatchDiff(oldList, newList,\n\t\t\t(o, n, idx) => this._eventBus.emit(this, this._namespace + '.add', {\n\t\t\t\titem: o.value,\n\t\t\t\tidx,\n\t\t\t}),\n\t\t\t(o, m, idx) => this._eventBus.emit(this, this._namespace + '.remove', {\n\t\t\t\titem: o.value,\n\t\t\t\tidx,\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Refresh scans through all items to ensure filtering and sorting is\n\t * correct.\n\t * @param {string} [key] Optional key of a single item to refresh.\n\t */\n\trefresh(key) {\n\t\tif (!this._model) return;\n\n\t\t// Start by sorting list, in case the compare is altered.\n\t\tlet oldList = this._list.slice();\n\t\tthis._list.sort(this._compare);\n\n\t\tif (key) {\n\t\t\tlet o = this._props[key];\n\t\t\tif (o) {\n\t\t\t\tthis._onItemChange(o);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let k in this._props) {\n\t\t\t\tthis._onItemChange(this._props[k]);\n\t\t\t}\n\t\t}\n\n\t\tthis._sendSyncEvents(oldList, this._list);\n\t}\n\n\t_listen(on) {\n\t\tlet cb = on ? 'on' : 'off';\n\t\tif (this._model && this._model[cb]) {\n\t\t\tthis._model[cb]('change', this._onChange);\n\t\t}\n\t}\n\n\t_listenItem(o) {\n\t\tthis._props[o.key] = o;\n\t\tlet m = o.value;\n\t\tif (typeof m === 'object' && m !== null && typeof m.on == 'function') {\n\t\t\to.cb = (m, change) => {\n\t\t\t\tif (this._props[o.key] != o) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet oldList = this._list.slice();\n\t\t\t\tthis._list.sort(this._compare);\n\t\t\t\tthis._onItemChange(o);\n\n\t\t\t\tthis._sendSyncEvents(oldList, this._list);\n\t\t\t};\n\t\t\tm.on('change', o.cb);\n\t\t}\n\t}\n\n\t_unlistenItem(o) {\n\t\tif (o.cb) {\n\t\t\to.value.off('change', o.cb);\n\t\t\to.cb = null;\n\t\t}\n\t}\n\n\t_onChange(change, m) {\n\t\tif (m !== this._model) return;\n\n\t\tlet oldList = this._list.slice();\n\t\tthis._list.sort(this._compare);\n\n\t\tlet p = getProps(m);\n\n\t\tfor (let k in change) {\n\t\t\tlet nv = p[k];\n\t\t\tlet o = this._props[k];\n\t\t\tlet ov = o ? o.value : undefined;\n\n\t\t\tif (ov === nv) continue;\n\n\t\t\t// Old value undefined means a value was added\n\t\t\tif (typeof ov == 'undefined') {\n\t\t\t\tthis._addItem(k, nv);\n\t\t\t} else if (typeof nv == 'undefined') {\n\t\t\t\tthis._removeItem(k);\n\t\t\t} else {\n\t\t\t\tthis._removeItem(k);\n\t\t\t\tthis._addItem(k, nv);\n\t\t\t}\n\t\t}\n\n\t\tthis._sendSyncEvents(oldList, this._list);\n\t}\n\n\n\t_onItemChange(o) {\n\t\tlet k = o.key;\n\t\tlet v = o.value;\n\t\tlet show = !this._filter || this._filter(k, v);\n\t\t// Check if it is filtered\n\t\tlet f = this._filtered && this._filtered[k];\n\t\tif (f) {\n\t\t\tif (show) {\n\t\t\t\tdelete this._filtered[k];\n\t\t\t\tthis._list.splice(this._insertIdx(o), 0, o);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!show) {\n\t\t\t\tlet idx = this._indexOfItem(o.key, v);\n\t\t\t\tif (idx < 0) {\n\t\t\t\t\tconsole.error(\"Item not in list: \", k, v);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._list.splice(idx, 1);\n\t\t\t\tthis._filtered[k] = o;\n\t\t\t}\n\t\t}\n\t}\n\n\t_addItem(k, item) {\n\t\tlet o = { key: k, value: item };\n\t\tthis._listenItem(o);\n\t\tif (!this._filter || this._filter(k, item)) {\n\t\t\tthis._list.splice(this._insertIdx(o), 0, o);\n\t\t} else {\n\t\t\tthis._filtered[k] = o;\n\t\t}\n\t}\n\n\t_removeItem(k) {\n\t\tlet o = this._props[k];\n\t\tif (!o) {\n\t\t\tconsole.error(\"Item key not found: \", k);\n\t\t\treturn;\n\t\t}\n\t\tdelete this._props[k];\n\t\tthis._unlistenItem(o);\n\n\t\t// Handle hidden item\n\t\tif (this._filtered && this._filtered[k]) {\n\t\t\tdelete this._filtered[k];\n\t\t\treturn;\n\t\t}\n\t\t// Handle visible item\n\t\tlet idx = this._indexOfItem(k, o.value);\n\t\tif (idx < 0) {\n\t\t\tconsole.error(\"Item not in list: \", k, o.value);\n\t\t\treturn;\n\t\t}\n\t\tthis._list.splice(idx, 1);\n\t}\n\n\t_insertIdx(o) {\n\t\tlet idx = array.binarySearch(this._list, o, this._compare);\n\t\treturn idx < 0 ? ~idx : idx; // Use the bitwise complement to get insert index.\n\t}\n\n\t_indexOfItem(k, item) {\n\t\tlet idx = array.binarySearch(this._list, { key: k, value: item }, this._compare);\n\t\t// Verify we found it\n\t\tif (idx >= 0 && this._list[idx].key === k) {\n\t\t\treturn idx;\n\t\t}\n\n\t\t// Binary search failed. Let's scan it instead.\n\t\treturn this._indexOfKey(k);\n\t}\n\n\t_indexOfKey(k) {\n\t\tfor (let i = this._list.length - 1; i >= 0; i--) {\n\t\t\tif (this._list[i].key === k) return i;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tdispose() {\n\t\tthis.setModel(null, true);\n\t}\n\n\t[Symbol.iterator]() {\n\t\tlet i = 0;\n\t\tlet a = this._list;\n\t\tlet l = a.length;\n\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\treturn i >= l ? { done: true } : { value: a[i++].value, done: false };\n\t\t\t}\n\t\t};\n\t}\n}\n\nexport default ModelToCollection;\n","import eventBus from 'modapp-eventbus';\nimport Model from './Model';\nimport { getProps } from './utils';\n\n/**\n * A wrapper for a {@link module:modapp~Model}, exposing the underlaying data\n * but can provide mapping of items, or filtering of items. It will\n * transparently propagate emitted change events.\n * @implements {module:modapp~Model}\n */\nclass ModelWrapper extends Model {\n\n\t/**\n\t * Creates an ModelWrapper instance.\n\t * @param {object?} model Model object to wrap.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {function} [opt.map] Model map callback. If not provided, item objects will be stored as is.\n\t * @param {function} [opt.keyMap] Key map callback. If not provided, original key will be used.\n\t * @param {function} [opt.filter] Model filter callback. Parameter is a item of the underlying model.\n\t * @param {function} [opt.dispose] Dispose callback called when a mapped item removed.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'modelWrapper'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(model, opt = {}) {\n\t\tsuper(Object.assign({ namespace: 'modelWrapper', eventBus: eventBus }));\n\n\t\tthis._map = opt.map || null;\n\t\tthis._keyMap = opt.keyMap || null;\n\t\tthis._filter = opt.filter || null;\n\t\tthis._dispose = opt.dispose || null;\n\n\t\t// Bind callbacks\n\t\tthis._onChange = this._onChange.bind(this);\n\n\t\tif (this._filter || this._map || this._keyMap) {\n\t\t\tthis._items = {};\n\t\t}\n\n\t\tthis.setModel(model, true);\n\t}\n\n\t/**\n\t * Model properties.\n\t * @returns {object} Anonymous object with all model properties.\n\t */\n\tget props() {\n\t\treturn this._props;\n\t}\n\n\t/**\n\t * Sets model properties on the underlying model.\n\t * @param {object} props Properties to set\n\t * @returns {Promise} Promise to the setting of the properties.\n\t */\n\tset(props) {\n\t\tif (!this._model || typeof this._model.set != 'function') {\n\t\t\tthrow new Error(\"No set method on underlying model.\");\n\t\t}\n\n\t\treturn this._model.set(props);\n\t}\n\n\t/**\n\t * Get wrapped model.\n\t * @returns {object|Model} Model\n\t */\n\tgetModel() {\n\t\treturn this._model;\n\t}\n\n\t/**\n\t * Sets the wrapped model.\n\t * @param {?object} model Model or object to set.\n\t * @param {boolean} noEvents Flag telling if no model change event should be triggered during set.\n\t * @returns {Promise} Promise to the setting of the model.\n\t */\n\tsetModel(model, noEvents) {\n\t\tmodel = model || null;\n\t\tif (model === this._model) return Promise.resolve({});\n\n\t\tlet om = this._model;\n\t\tthis._removeItems();\n\t\tthis._listen(false);\n\t\tthis._model = model || null;\n\t\tthis._listen(true);\n\n\t\tlet p = getProps(this._model);\n\n\t\tlet o = {};\n\t\tif (p) {\n\t\t\tfor (let k in p) {\n\t\t\t\tlet v = p[k];\n\t\t\t\tthis._prep(o, k, v);\n\t\t\t}\n\t\t}\n\n\t\treturn Promise.resolve(super._update(o, !noEvents, !!om));\n\t}\n\n\t/**\n\t * Refreshes the model, or a single property of the model.\n\t * @param {string} [key] Optional key to refresh. All keys are refreshed if omitted.\n\t */\n\trefresh(key) {\n\t\tif (!this._model) return;\n\n\t\tlet p = getProps(this._model);\n\t\tlet o = {};\n\t\tif (key) {\n\t\t\tif (!p.hasOwnProperty(key)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._prep(o, key, p[key]);\n\t\t} else {\n\t\t\tfor (let k in p) {\n\t\t\t\tlet v = p[k];\n\t\t\t\tthis._prep(o, k, v);\n\t\t\t}\n\t\t\tfor (let k in this._props) {\n\t\t\t\tif (!p.hasOwnProperty(k)) {\n\t\t\t\t\tthis._prep(o, k);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsuper.set(o);\n\t}\n\n\t_listen(on) {\n\t\tlet cb = on ? 'on' : 'off';\n\t\tif (this._model && this._model[cb]) {\n\t\t\tthis._model[cb]('change', this._onChange);\n\t\t}\n\t}\n\n\t_prep(o, k, v) {\n\t\tlet isDefined = typeof v !== 'undefined';\n\t\tlet mk = this._keyMap\n\t\t\t? isDefined && this._keyMap(k, v)\n\t\t\t: k;\n\t\tif (typeof mk != 'string') {\n\t\t\tmk = null;\n\t\t}\n\t\tlet mv = v;\n\t\tlet c = this._items && this._items[k];\n\n\t\tif (isDefined && mk && (!this._filter || this._filter(k, v))) {\n\t\t\tif (this._map) {\n\t\t\t\t// If we map to a disposable value, we do not create a new map\n\t\t\t\t// value, but assume the disposable value will update itself.\n\t\t\t\tmv = this._dispose && c && c.value === v\n\t\t\t\t\t? c.mvalue\n\t\t\t\t\t: this._map(k, v);\n\t\t\t}\n\t\t\to[mk] = mv;\n\t\t} else {\n\t\t\t// Ensure we don't overwrite a new value\n\t\t\tif (mk !== null && !o.hasOwnProperty(mk)) {\n\t\t\t\to[mk] = undefined;\n\t\t\t}\n\t\t}\n\n\t\tc = this._upsertItem(c, k, v, mk, mv);\n\t\tif (c) {\n\t\t\t// Check if value existed, but with a different mapped key\n\t\t\tif (c.mkey !== mk) {\n\t\t\t\tif (!o.hasOwnProperty(c.mkey)) {\n\t\t\t\t\to[c.mkey] = undefined;\n\t\t\t\t}\n\t\t\t\tc.mkey = mk;\n\t\t\t}\n\t\t}\n\t\treturn o;\n\t}\n\n\t_upsertItem(c, k, v, mk, mv) {\n\t\tif (!this._items) return;\n\n\t\t// Check if item already exists.\n\t\tif (c) {\n\t\t\tif (c.value === v) {\n\t\t\t\treturn c;\n\t\t\t}\n\t\t\t// Unlisten to old value\n\t\t\tthis._removeItem(c.key);\n\t\t}\n\n\t\tif (typeof v == 'undefined') {\n\t\t\treturn c;\n\t\t}\n\n\t\tc = { key: k, value: v, mkey: mk, mvalue: mv };\n\t\t// Listen to model values\n\t\tif (typeof v === 'object' && v !== null && typeof v.on == 'function') {\n\t\t\tc.cb = () => {\n\t\t\t\t// Ensure the model still has this property\n\t\t\t\tlet p = getProps(this._model);\n\t\t\t\tlet k = c.key;\n\t\t\t\tif (p && p.hasOwnProperty(k)) {\n\t\t\t\t\tthis._onItemChange(c);\n\t\t\t\t}\n\t\t\t};\n\t\t\tv.on('change', c.cb);\n\t\t}\n\t\tthis._items[k] = c;\n\t\treturn c;\n\t}\n\n\t_removeItem(k) {\n\t\t// Unlisten to old value\n\t\tlet c = this._items[k];\n\t\tif (c) {\n\t\t\tif (c.cb) {\n\t\t\t\tc.value.off('change', c.cb);\n\t\t\t}\n\t\t\tif (this._dispose) {\n\t\t\t\tthis._dispose(k, c.mvalue);\n\t\t\t}\n\t\t\tdelete this._items[k];\n\t\t}\n\t}\n\n\t_onChange(change, m) {\n\t\tif (m !== this._model) return;\n\n\t\tlet p = getProps(m);\n\t\tlet o = {};\n\t\tfor (let k in change) {\n\t\t\tlet v = p[k];\n\t\t\tthis._prep(o, k, v);\n\t\t}\n\n\t\tsuper.set(o);\n\t}\n\n\t_onItemChange(c) {\n\t\tlet p = getProps(this._model);\n\t\t// Ensure the item is still the same\n\t\tif (!p || p[c.key] !== c.value) return;\n\n\t\tsuper.set(this._prep({}, c.key, c.value));\n\t}\n\n\t_removeItems() {\n\t\tif (this._items) {\n\t\t\tfor (let k in this._items) {\n\t\t\t\tthis._removeItem(k);\n\t\t\t}\n\t\t}\n\t}\n\n\tdispose() {\n\t\tthis._removeItems();\n\t\tthis._listen(false);\n\t\tthis._model = null;\n\t}\n}\n\nexport default ModelWrapper;\n","import * as Sentry from '@sentry/browser';\nimport { CaptureConsole } from '@sentry/integrations';\nimport moduleConfig from 'moduleConfig';\n\nSentry.init({\n\tdsn: moduleConfig.sentry.dsn,\n\tenvironment: moduleConfig.sentry.environment,\n\tintegrations: [\n\t new Sentry.BrowserTracing(),\n\t new Sentry.Replay(),\n\t new CaptureConsole({ levels: [ 'error', 'assert' ] }),\n\t],\n\t// Performance Monitoring\n\ttracesSampleRate: moduleConfig.sentry.tracesSampleRate,\n\t// Session Replay\n\treplaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production.\n\treplaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur.\n\t// Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled\n\ttracePropagationTargets: [\n\t\tmoduleConfig.api.hostUrl,\n\t\tmoduleConfig.api.webResourcePath,\n\t\tmoduleConfig.auth.loginUrl,\n\t],\n});\n\nexport function traceResgateOperation(name, operation) {\n\tif (moduleConfig.sentry.dsn) {\n\t\treturn Sentry.startSpan({ name, op: \"resgate\" }, operation);\n\t} else {\n\t\treturn operation();\n\t}\n}\n","import ResClient, { isResError } from 'resclient';\nimport { traceResgateOperation } from 'sentry';\nimport Err from 'classes/Err';\n\nconst namespace = 'module.api';\n\n/**\n * Api module connects to the backend api and provides low level\n * methods for service modules to send and receive data.\n */\nclass Api extends ResClient {\n\n\tconstructor(app, params) {\n\t\tlet opt = Object.assign({\n\t\t\thostUrl: '/ws',\n\t\t\twebResourcePath: '/api/',\n\t\t\tdebug: false,\n\t\t}, params);\n\t\topt.debug = !!(opt.debug && opt.debug != 'false' && opt.debug != '0' && opt.debug != 'no');\n\t\tsuper(opt.hostUrl, {\n\t\t\tnamespace,\n\t\t\teventBus: app.eventBus,\n\t\t\tdebug: opt.debug,\n\t\t});\n\n\t\tthis.app = app;\n\t\tthis.webResourcePath = this._resolveWebResourcePath(opt.webResourcePath);\n\t}\n\n\tgetWebResourceUri(rid) {\n\t\tlet idx = rid.indexOf('?');\n\t\tlet rname = idx >= 0 ? rid.substr(0, idx) : rid;\n\t\tlet query = idx >= 0 ? rid.substr(idx) : '';\n\n\t\treturn this.webResourcePath + rname.replace(/\\./g, '/') + query;\n\t}\n\n\tisError(resource) {\n\t\tif (isResError(resource)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn resource instanceof Error || resource instanceof Err || (\n\t\t\ttypeof resource == 'object'\n\t\t\t&& resource !== null\n\t\t\t&& resource.hasOwnProperty('code')\n\t\t\t&& resource.hasOwnProperty('message'));\n\t}\n\n\t_resolveWebResourcePath(url) {\n\t\tif (!url.match(/^http?:\\/\\//)) {\n\t\t\tlet a = document.createElement('a');\n\t\t\ta.href = url;\n\t\t\turl = a.href;\n\t\t}\n\n\t\treturn url.replace(/\\/$/, '') + '/';\n\t}\n\n\tdispose() {\n\t\tthis.disconnect();\n\t}\n\n\t// Tracing overrides\n\n\tget(rid) {\n\t\treturn traceResgateOperation(`get ${rid}`, () => super.get(rid));\n\t}\n\n\tsetModel(rid, props) {\n\t\treturn traceResgateOperation(`setModel ${rid}`, () => super.setModel(rid, props));\n\t}\n\n\tcall(rid, method, params) {\n\t\treturn traceResgateOperation(`call ${rid}/${method}`, () => super.call(rid, method, params));\n\t}\n\n\tauthenticate(rid, method, params) {\n\t\treturn traceResgateOperation(`authenticate ${rid}/${method}`, () => super.authenticate(rid, method, params));\n\t}\n}\n\nexport default Api;\n","/**\n * A module with animation helper functions\n */\n\nconst FADE_DURATION = 200;\nconst SWIPE_DISTANCE = 64;\n\nlet animate = function(progress, duration, step, done, token) {\n\tif (progress === 1) {\n\t\tdone();\n\t\treturn null;\n\t}\n\n\tlet startProgress = progress;\n\tlet start = null;\n\ttoken = token || {};\n\tlet cb = function(timestamp) {\n\t\tif (!start) {\n\t\t\tstart = timestamp - duration * startProgress;\n\t\t}\n\n\t\tprogress = (timestamp - start) / duration;\n\t\tif (progress >= 1) {\n\t\t\tdelete token.requestId;\n\t\t\treturn done();\n\t\t}\n\n\t\tstep(progress);\n\t\ttoken.requestId = window.requestAnimationFrame(cb);\n\t};\n\n\ttoken.requestId = window.requestAnimationFrame(cb);\n\treturn token;\n};\n\nlet slideDone = function(el, show, callback) {\n\tel.style.opacity = '';\n\tel.style.height = '';\n\tel.style.width = '';\n\tel.style.overflow = '';\n\tel.style.display = show ? '' : 'none';\n\tif (callback) {\n\t\tcallback();\n\t}\n\treturn null;\n};\n\n\nlet invert = function(v, ok) {\n\treturn ok ? 1 - v : v;\n};\n\nlet easeOut = function(p) {\n\treturn 1 - (1 - p) * (1 - p);\n};\n\nlet unstyledCbs = null;\nlet getUnstyledDimensions = function(el, cb) {\n\tif (unstyledCbs !== null) {\n\t\tunstyledCbs.push([ el, cb, '', 0 ]);\n\t\treturn;\n\t}\n\n\tunstyledCbs = [[ el, cb, '', 0 ]];\n\twindow.requestAnimationFrame(() => {\n\t\tlet cs = unstyledCbs;\n\t\tunstyledCbs = null;\n\t\t// Reset all styles\n\t\tfor (let c of cs) {\n\t\t\tc[2] = c[0].style.cssText;\n\t\t\tc[0].style.cssText = '';\n\t\t}\n\n\t\t// Check calculated heights\n\t\tfor (let c of cs) {\n\t\t\tc[3] = c[0].offsetHeight;\n\t\t\tc[4] = c[0].offsetWidth;\n\t\t}\n\n\t\t// Reset all styles\n\t\tfor (let c of cs) {\n\t\t\tc[0].style.cssText = c[2];\n\t\t}\n\n\t\t// Call all callbacks\n\t\tfor (let c of cs) {\n\t\t\tc[1](c[3], c[4]);\n\t\t}\n\t});\n};\n\n/**\n * Fades the opacity of an element with the duration based on the elements current opacity.\n * @param {HTMLElement} el HTML element to fade.\n * @param {number} opacity Opacity to fade to.\n * @param {object} [opt] Optional parameters\n * @param {number} [opt.duration] Optional fade duration in milliseconds, measured when going from 0 to 1 opacity.\n * @param {function} [opt.callback] Optional callback function once the animation is complete.\n * @returns {object} Animation token\n */\nexport let fade = function(el, opacity, opt = {}) {\n\tlet callback = opt.callback || null;\n\tlet origin = el.style.opacity ? Number(el.style.opacity) : 1;\n\n\t// Calculate start time relative to start opacity.\n\tlet duration = (typeof opt.duration == 'number' ? opt.duration : FADE_DURATION) * Math.abs(origin - opacity);\n\treturn animate(\n\t\t0,\n\t\tduration,\n\t\tfunction(p) {\n\t\t\tel.style.opacity = p * opacity + (1 - p) * origin;\n\t\t},\n\t\tfunction() {\n\t\t\tel.style.opacity = opacity;\n\t\t\tif (callback) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\t);\n};\n\n/**\n * Swipes an element out to the side while fading it out.\n * @param {HTMLElement} el HTML element to swipe out.\n * @param {number} direction Direction to swipe. -1 for left, 0 for fade only, and 1 for right.\n * @param {object=} opt Optional parameters\n * @param {number=} opt.duration Optional fade duration in milliseconds.\n * @param {number=} opt.distance Optional swipe distance in pixels.\n * @param {number=} opt.reset Optional reset flag. If true, opacity and position will be reset. If false, animation will continue from current position and opacity. Default is true.\n * @param {function=} opt.callback Optional callback function once the animation is complete.\n * @returns {object} Animation token\n */\nexport let swipeOut = function(el, direction, opt = {}) {\n\tlet callback = opt.callback || null;\n\tlet startProgress = 0;\n\tlet basePos = 0;\n\tlet dirDist = direction * (opt.distance || SWIPE_DISTANCE);\n\tif (opt.reset !== undefined ? opt.reset : true) {\n\t\tel.style.opacity = '';\n\t\tel.style.left = '';\n\t} else {\n\t\tstartProgress = el.style.opacity ? 1 - parseFloat(el.style.opacity) : 0;\n\t\tif (startProgress == 1) {\n\t\t\tif (callback) callback();\n\t\t\treturn null;\n\t\t}\n\t\t// The assumed position from where the swipe animation started\n\t\tbasePos = (el.style.left ? parseFloat(el.style.left) : 0) - dirDist * startProgress * startProgress;\n\t}\n\n\tlet duration = typeof opt.duration == 'number' ? opt.duration : FADE_DURATION;\n\tlet start = null;\n\tlet token = {};\n\tlet step = function(timestamp) {\n\t\t// Calculate start time relative to start opacity.\n\t\tif (!start) start = timestamp - duration * startProgress;\n\t\tlet progress = (timestamp - start) / duration;\n\t\tif (progress >= 1) {\n\t\t\tel.style.opacity = 0;\n\t\t\tif (callback) callback();\n\t\t\treturn;\n\t\t}\n\n\t\tel.style.opacity = 1 - progress;\n\t\tel.style.left = (basePos + dirDist * progress * progress) + 'px';\n\t\ttoken.requestId = window.requestAnimationFrame(step);\n\t};\n\n\ttoken.requestId = window.requestAnimationFrame(step);\n\treturn token;\n};\n\n/**\n * Swipes an element in from the side while fading it in.\n * @param {HTMLElement} el HTML element to swipe in.\n * @param {number} direction Direction to swipe. -1 for left, 0 for fade only, and 1 for right. Ignored if opt.reset is false.\n * @param {object=} opt Optional parameters\n * @param {number=} opt.duration Optional fade duration in milliseconds.\n * @param {number=} opt.distance Optional swipe distance in pixels.\n * @param {number=} opt.reset Optional reset flag. If true, opacity and position will be reset. If false, animation will continue from current position and opacity. Default is true.\n * @param {function=} opt.callback Optional callback function once the animation is complete.\n * @returns {object} Animation token\n */\nexport let swipeIn = function(el, direction, opt = {}) {\n\tlet callback = opt.callback || null;\n\tlet startProgress = 0;\n\tlet dirDist = direction * (opt.distance || SWIPE_DISTANCE);\n\tlet basePos = -dirDist;\n\n\tif (opt.reset !== undefined ? opt.reset : true) {\n\t\tel.style.opacity = 0;\n\t} else {\n\t\tstartProgress = el.style.opacity ? parseFloat(el.style.opacity) : 1;\n\t\tif (startProgress == 1) {\n\t\t\tif (callback) callback();\n\t\t\treturn null;\n\t\t}\n\t\t// Set direction distance to the negative of current position\n\t\tdirDist = (el.style.left ? -parseFloat(el.style.left) : 0);\n\t\t// The assumed position from where the swipe animation started\n\t\tbasePos = dirDist * startProgress * (2 - startProgress) - dirDist;\n\t}\n\n\tlet duration = typeof opt.duration == 'number' ? opt.duration : FADE_DURATION;\n\tlet start = null;\n\tlet token = {};\n\tlet step = function(timestamp) {\n\t\t// Calculate start time relative to start opacity.\n\t\tif (!start) start = timestamp - duration * startProgress;\n\t\tlet progress = (timestamp - start) / duration;\n\t\tif (progress >= 1) {\n\t\t\tel.style.opacity = '';\n\t\t\tel.style.left = '';\n\t\t\tif (callback) callback();\n\t\t\treturn;\n\t\t}\n\n\t\tel.style.opacity = progress;\n\t\tel.style.left = (basePos + dirDist * progress * (2 - progress)) + 'px';\n\t\ttoken.requestId = window.requestAnimationFrame(step);\n\t}.bind(this);\n\n\ttoken.requestId = window.requestAnimationFrame(step);\n\treturn token;\n};\n\n/**\n * Slides an element vertically while fading it in.\n * @param {HTMLElement} el HTML element to slide up/down.\n * @param {boolean} show Flag if element should be slide up (show), will slide down (hide) if false.\n * @param {object} [opt] Optional parameters\n * @param {number} [opt.duration] Optional fade duration in milliseconds.\n * @param {number} [opt.reset] Optional reset flag. If true, opacity and position will be reset. If false, animation will continue from current height and opacity. Default is true.\n * @param {function} [opt.callback] Optional callback function once the animation is complete.\n * @returns {object} Animation token\n */\nexport let slideVertical = function (el, show, opt) {\n\treturn internalSlide(false, el, show, opt);\n};\n\n/**\n * Slides an element horizontally while fading it in.\n * @param {HTMLElement} el HTML element to slide up/down.\n * @param {boolean} show Flag if element should be slide up (show), will slide down (hide) if false.\n * @param {object} [opt] Optional parameters\n * @param {number} [opt.duration] Optional fade duration in milliseconds.\n * @param {number} [opt.reset] Optional reset flag. If true, opacity and position will be reset. If false, animation will continue from current height and opacity. Default is true.\n * @param {function} [opt.callback] Optional callback function once the animation is complete.\n * @returns {object} Animation token\n */\nexport let slideHorizontal = function(el, show, opt) {\n\treturn internalSlide(true, el, show, opt);\n};\n\n/**\n * Slides an element horizontally while fading it in.\n * @param {boolean} hori Flag if slide should be horizontal instead of vertical.\n * @param {HTMLElement} el HTML element to slide up/down.\n * @param {boolean} show Flag if element should be slide up (show), will slide down (hide) if false.\n * @param {object} [opt] Optional parameters\n * @param {number} [opt.duration] Optional fade duration in milliseconds.\n * @param {number} [opt.reset] Optional reset flag. If true, opacity and position will be reset. If false, animation will continue from current height and opacity. Default is true.\n * @param {function} [opt.callback] Optional callback function once the animation is complete.\n * @returns {object} Animation token\n * @private\n */\nlet internalSlide = function (hori, el, show, opt = {}) {\n\tlet token = { requestId: true };\n\tlet progress = 0;\n\tlet origin, target, d, e;\n\tlet reset = opt.reset !== undefined ? opt.reset : true;\n\tlet f = reset || show\n\t\t? getUnstyledDimensions\n\t\t: (el, cb) => cb(0, 0);\n\tlet prop = hori ? 'width' : 'height';\n\tlet offsetProp = hori ? 'offsetWidth' : 'offsetHeight';\n\n\tf(el, (unstyledHeight, unstyledWidth) => {\n\t\tif (!token.requestId) {\n\t\t\treturn;\n\t\t}\n\t\tlet dim = hori ? unstyledWidth : unstyledHeight;\n\n\t\tif (reset) {\n\t\t\tel.style.opacity = show ? 0 : 1;\n\t\t\ttarget = show ? dim : 0;\n\t\t\torigin = show ? 0 : dim;\n\t\t\tel.style[prop] = origin + 'px';\n\t\t} else {\n\t\t\tprogress = invert(\n\t\t\t\tel.style.opacity\n\t\t\t\t\t? parseFloat(el.style.opacity)\n\t\t\t\t\t: (el.style.display === 'none'\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: 1\n\t\t\t\t\t),\n\t\t\t\t!show\n\t\t\t);\n\n\t\t\tif (progress === 1) {\n\t\t\t\treturn slideDone(el, show, opt.callback);\n\t\t\t}\n\n\t\t\ttarget = show\n\t\t\t\t? dim\n\t\t\t\t: 0;\n\n\t\t\te = easeOut(progress);\n\t\t\td = el.style.display === 'none'\n\t\t\t\t? 0\n\t\t\t\t: el[offsetProp];\n\t\t\torigin = (d - (e * target)) / (1 - e);\n\t\t}\n\n\t\tel.style.display = '';\n\t\tel.style.overflow = 'hidden';\n\n\t\tanimate(\n\t\t\tprogress,\n\t\t\ttypeof opt.duration == 'number' ? opt.duration : FADE_DURATION,\n\t\t\tp => {\n\t\t\t\te = easeOut(p);\n\t\t\t\tel.style.opacity = show ? p : 1 - p;\n\t\t\t\tel.style[prop] = (e * target + (1 - e) * origin) + 'px';\n\t\t\t},\n\t\t\t() => slideDone(el, show, opt.callback),\n\t\t\ttoken\n\t\t);\n\t});\n\n\treturn token;\n};\n\n/**\n * Stops the animation for the given token.\n * @param {object} token Animation token.\n * @returns {boolean} True if the animation was active, otherwise false.\n */\nexport let stop = function(token) {\n\tif (token && token.requestId) {\n\t\tif (token.requestId !== true) {\n\t\t\twindow.cancelAnimationFrame(token.requestId);\n\t\t}\n\t\tdelete token.requestId;\n\t\treturn true;\n\t}\n\treturn false;\n};\n","/**\n * A module with array helper functions\n */\n\n/**\n * Makes a binary search for a item in an array using a compare function\n * @param {Array} arr Array to search in\n * @param {*} item Item to search for\n * @param {function} compare Compare function\n * @returns {number} Index of a matching item in the array if one exists, otherwise the bitwise complement of the index where the item belongs\n */\nexport let binarySearch = function (arr, item, compare) {\n\tvar l = 0,\n\t\th = arr.length - 1,\n\t\tm, c;\n\n\twhile (l <= h) {\n\t\tm = (l + h) >>> 1;\n\t\tc = compare(arr[m], item);\n\t\tif (c < 0) {\n\t\t\tl = m + 1;\n\t\t} else if (c > 0) {\n\t\t\th = m - 1;\n\t\t} else {\n\t\t\treturn m;\n\t\t}\n\t}\n\treturn ~l;\n};\n\n/**\n * Inserts an item into an ordered array\n * @param {Array} arr Array to insert in\n * @param {*} item Item to insert\n * @param {function} compare Compare function\n * @param {boolean=} duplicate True if a duplicate value should be inserted, false if no insert should be made.\n * @return {number} The index of where in the array the item was insert, or the duplicate was found.\n */\nexport let binaryInsert = function (arr, item, compare, duplicate = false) {\n\tvar i = binarySearch(arr, item, compare);\n\tif (i >= 0) { /* Matching object was found */\n\t\tif (!duplicate) return i;\n\t} else { /* if the return value was negative, the bitwise complement of the return value is the correct index for this object */\n\t\ti = ~i;\n\t}\n\tarr.splice(i, 0, item);\n\treturn i;\n};\n","/**\n * A module with HTMLElement helper functions\n */\n\n/**\n * Creates a new document element\n * @param {string} tagName Name of the tag. Eg. 'div'.\n * @param {object=} opt Options\n * @param {string} [opt.className] Class name or space separated class names.\n * @param {Object.} [opt.attributes] Attributes object where key is the attribute name and value is the attribute value.\n * @param {Object.} [opt.events] Events object where key is the event name and value is the event callback.\n * @param {Array.} [opt.children] Array of child elements to append.\n * @param {string} [opt.text] Text content. Ignored if children is set.\n * @returns {HTMLElement} Created document element.\n */\nexport let create = function (tagName, opt) {\n\tlet el = document.createElement(tagName);\n\n\tif (opt) {\n\t\tlet o = opt.attributes;\n\t\tif (o) {\n\t\t\tfor (let key in o) {\n\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\tel.setAttribute(key, o[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\to = opt.className;\n\t\tif (o) {\n\t\t\tel.className = o;\n\t\t}\n\n\t\to = opt.events;\n\t\tif (o) {\n\t\t\tfor (let key in o) {\n\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\tel.addEventListener(key, o[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\to = opt.children;\n\t\tif (o) {\n\t\t\tfor (var i = 0; i < o.length; i++) {\n\t\t\t\tel.appendChild(o[i]);\n\t\t\t}\n\t\t} else if (opt.text) {\n\t\t\tel.textContent = opt.text;\n\t\t}\n\t}\n\n\treturn el;\n};\n\n/**\n * Appends a child to a parent element\n * @param {?HTMLElement} parent Parent element. If null or undefined, nothing will be performed.\n * @param {?HTMLElement} child Child element. If null or undefined, nothing will be performed.\n * @returns {?HTMLElement} The appended child.\n */\nexport let append = function(parent, child) {\n\tif (!parent || !child) {\n\t\treturn child || null;\n\t}\n\treturn parent.appendChild(child);\n};\n\n/**\n * Removes an element from the parent element\n * @param {?HTMLElement} child Child element. If null or undefined, nothing will be performed.\n * @param {object=} opt Options\n * @param {Object.} [opt.events] Events object previously used when creating the element. By calling removeEventListener, memory leaks can be prevented on older browsers.\n * @returns {?HTMLElement} Child element.\n */\nexport let remove = function(child, opt) {\n\tif (!child) {\n\t\treturn null;\n\t}\n\n\tif (opt) {\n\t\tlet o = opt.events;\n\t\tif (o) {\n\t\t\tfor (let key in o) {\n\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\tel.removeEventListener(key, o[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!child.parentNode) {\n\t\treturn child;\n\t}\n\n\treturn child.parentNode.removeChild(child);\n};\n\n/**\n * Empties an element of all child nodes.\n * @param {?HTMLElement} element Element\n * @returns {?HTMLElement} ELement.\n */\nexport let empty = function(element) {\n\tif (!element) {\n\t\treturn element || null;\n\t}\n\twhile (element.firstChild) {\n\t\telement.removeChild(element.firstChild);\n\t}\n\treturn element;\n};\n","/**\n * A module with uri helper functions\n */\n\n/**\n * Parses the current location query string of the uri and returns it as a nested\n * object using dot-separation for the namespace.
\n * Eg. ?module.login.user=username => {module: {login: {user: \"username\"}}}\n * @param {string} namespace Dot-separated namespace to use as root.\n * @returns {object} Parameter key/value object.\n */\nlet getQuery = function(namespace) {\n\tif (typeof(window) === 'undefined' || !window.location) return {};\n\n\tvar match,\n\t\tpart,\n\t\tsearch = /([^&=]+)=?([^&]*)/g,\n\t\tquery = window.location.search.substring(1).replace(/\\+/g, \" \"),\n\t\tparams = {};\n\n\tnamespace = (namespace || \"\").replace(/([^.])$/, '$1.');\n\n\twhile ((match = search.exec(query)) !== null) {\n\t\tvar key = decodeURIComponent(match[1]);\n\t\tif (!key.startsWith(namespace)) continue;\n\t\tkey = key.substr(namespace.length);\n\n\t\tvar parts = decodeURIComponent(key).split('.');\n\t\tvar o = params;\n\t\tfor (var i = 0; i < parts.length; i++) {\n\t\t\tpart = parts[i];\n\t\t\tif (!part) continue;\n\n\t\t\tif (i == parts.length - 1) {\n\t\t\t\to[part] = decodeURIComponent(match[2]);\n\t\t\t} else {\n\t\t\t\tif (typeof o[part] !== 'object') o[part] = {};\n\t\t\t\to = o[part];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn params;\n};\n\nexport { getQuery };\n","/**\n * Localization utility implementing modapp's model interface.\n */\n\nimport L10n from 'classes/L10n.js';\nimport eventBus from 'modapp-eventbus';\n\n/**\n * L10n instance using the {@link module:modapp/eventBus} to emit locale changes.\n * @type {L10n}\n */\nlet l10n = new L10n(eventBus);\n\nexport default l10n;\n","/**\n * Locale string storing the string key and the default string.
\n * Use {@link L10n#l} to create new instances.\n * @implements {LocaleString}\n */\nclass LocaleStr {\n\n\t/**\n\t * Creates a LocaleStr instance\n\t * @param {L10n} l10n L10n instance.\n\t * @param {string} key Translation key of the string.\n\t * @param {string} defaultStr Default string tranlation.\n\t * @param {object} [defaultParams] Default string translation parameters.\n\t */\n\tconstructor(l10n, key, defaultStr, defaultParams) {\n\t\tthis._l10n = l10n;\n\t\tthis._key = key;\n\t\tthis._defaultStr = defaultStr;\n\t\tthis._defaultParams = typeof defaultParams === 'object'\n\t\t\t? defaultParams\n\t\t\t: null;\n\t}\n\n\t/**\n\t * Attaches an event handler function for one or more l10n events.\n\t * @param {?string} events One or more space-separated events. Null means any event. Supported event is 'localeUpdate'.\n\t * @param {EventBus~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._l10n.on(events, handler);\n\t}\n\n\t/**\n\t * Removes an l10n event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {function} [handler] An optional handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._l10n.off(events, handler);\n\t}\n\n\t/**\n\t * Returns a translated string\n\t * @param {*=} params Optional parameters for placeholder replacement.\n\t * @returns {string} Translated string\n\t */\n\ttranslate(params) {\n\t\treturn this._l10n.t(this, params);\n\t}\n\n\t/**\n\t * Gets the current locale language tag. Eg. 'en', 'pt-BR', etc.\n\t * @returns {string} Locale language tag.\n\t */\n\tgetLocale() {\n\t\treturn this._l10n.locale;\n\t}\n\n\t/**\n\t * Returns the translation key\n\t * @returns {string} Translation key\n\t */\n\ttranslationKey() {\n\t\treturn this._key;\n\t}\n\n\t/**\n\t * Returns the default translation\n\t * @returns {string} Default translation\n\t */\n\tdefaultStr() {\n\t\treturn this._defaultStr;\n\t}\n\n\t/**\n\t * Returns the default translation parameters\n\t * @returns {string} Default translation parameters\n\t */\n\tdefaultParams() {\n\t\treturn this._defaultParams;\n\t}\n}\n\nexport default LocaleStr;\n","import LocaleStr from './LocaleStr.js';\n\n/**\n * L10n handles localization and translation\n */\nclass L10n {\n\n\tconstructor(eventBus, namespace) {\n\t\tthis._ns = namespace ? namespace + '.' : '';\n\n\t\tthis._eventBus = eventBus;\n\t\tthis._locale = 'en';\n\t}\n\n\t/**\n\t * Currently set locale language tag\n\t * @type {string}\n\t */\n\tget locale() {\n\t\treturn this._locale;\n\t}\n\n\t/**\n\t * Translates a string and replaces tags with provided object.\n\t * @param {string|LocaleString} key Key id of string to translate. It might also be a LocaleString object previously returned from the l method.\n\t * @param {string} [defaultStr] Default string tranlation. Should not be provided if key is a LocaleString.\n\t * @param {object} [params] Params to use on tag replacement\n\t * @returns {string} Translated string.\n\t */\n\tt(key, defaultStr, params) {\n\t\tlet preParams = 2, defaultParams;\n\n\t\tif (this.isLocaleString(key)) {\n\t\t\tdefaultStr = key.defaultStr();\n\t\t\tdefaultParams = key.defaultParams();\n\t\t\tkey = key.translationKey();\n\t\t\tpreParams = 1;\n\t\t} else {\n\t\t\tif (typeof key !== 'string') {\n\t\t\t\tconsole.error(`Translation key is of type ${typeof key} instead of string:`, key);\n\t\t\t\treturn defaultStr;\n\t\t\t}\n\n\t\t\t// If we only get one argument, we can assume\n\t\t\t// it is an already translated string.\n\t\t\tif (arguments.length <= 1) return key;\n\n\t\t\tkey = this._ns + key;\n\t\t}\n\n\t\tlet s = defaultStr;\n\t\tparams = arguments[preParams];\n\n\t\tif (typeof params != \"undefined\" || defaultParams) {\n\t\t\tif (typeof params == \"string\") {\n\t\t\t\tparams = Array.prototype.slice.call(arguments, preParams);\n\t\t\t}\n\n\t\t\tif (defaultParams) {\n\t\t\t\tparams = Object.assign({}, defaultParams, params);\n\t\t\t}\n\n\t\t\ts = s.replace(/{([^}]+)}/g, function (match, idx) {\n\t\t\t\treturn typeof params[idx] != 'undefined' ?\n\t\t\t\t\tparams[idx] :\n\t\t\t\t\t'???';\n\t\t\t});\n\t\t}\n\n\t\treturn s;\n\t}\n\n\t/**\n\t * Returns a LocaleString that can be passed to the t method for translation.\n\t * @param {string} key Key id of string to translate.\n\t * @param {string} defaultStr Default string translation.\n\t * @param {object} [defaultParams] Default parameters.\n\t * @returns {LocaleString} LocaleString\n\t */\n\tl(key, defaultStr, defaultParams) {\n\t\tif (this.isLocaleString(key)) {\n\t\t\tif (typeof defaultStr === 'string') {\n\t\t\t\tdefaultStr = Array.prototype.slice.call(arguments, 1);\n\t\t\t}\n\n\t\t\tdefaultParams = key.defaultParams() && defaultStr\n\t\t\t\t? Object.assign({}, key.defaultParams(), defaultStr)\n\t\t\t\t: key.defaultParams() || defaultStr;\n\t\t\tdefaultStr = key.defaultStr();\n\t\t\tkey = key.translationKey();\n\t\t} else if (typeof defaultParams !== 'undefined') {\n\t\t\tif (typeof defaultParams === 'string') {\n\t\t\t\tdefaultParams = Array.prototype.slice.call(arguments, 2);\n\t\t\t}\n\t\t}\n\n\t\treturn new LocaleStr(this, this._ns + key, defaultStr, defaultParams);\n\t}\n\n\t/**\n\t * Creates a new L10n instance for the given namespace\n\t * @param {string} namespace Dot separated namespace to be added to the current namespace\n\t * @returns {L10n} An L10n instance.\n\t */\n\tnamespace(namespace = '') {\n\t\treturn new L10n(this._ns && namespace\n\t\t\t? this._ns + '.' + namespace\n\t\t\t: this._ns + namespace\n\t\t);\n\t}\n\n\t/**\n\t * Attaches an event handler function for one or more l10n events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {EventBus~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, 'l10n');\n\t}\n\n\t/**\n\t * Removes an l10n event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {function} [handler] An optional handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, 'l10n');\n\t}\n\n\t/**\n\t * Sets locale\n\t * @param {string} locale Locale language tag\n\t * @fires \"l10n.localeUpdate\"\n\t */\n\tsetLocale(locale) {\n\t\tif (locale === this._locale) return;\n\n\t\t// TODO\n\t\t// Load the new locale language pack\n\t\tthis._locale = locale;\n\n\t\t/**\n\t\t * L10N locale update event with the new locale.\n\t\t * @memberof L10n\n\t\t * @event \"l10n.localeUpdate\"\n\t\t * @type {object}\n\t\t * @property {string} locale Locale language tag of new locale\n\t\t */\n\t\tthis._eventBus.emit(this, 'l10n.localeUpdate', {\n\t\t\tlocale: this._locale\n\t\t});\n\t}\n\n\t/**\n\t * Checks if a value implements {@link LocaleString}.\n\t * @param {*} str Value to check\n\t * @returns {boolean} True if the string implements LocaleString interface, otherwise false.\n\t */\n\tisLocaleString(str) {\n\t\treturn str && typeof str === 'object' &&\n\t\t\ttypeof str.translationKey === 'function' &&\n\t\t\ttypeof str.defaultStr === 'function' &&\n\t\t\ttypeof str.defaultParams === 'function';\n\t}\n}\n\nexport default L10n;\n","/**\n * Localization utility implementing modapp's model interface.\n */\n\nimport L10n from './class/L10n.js';\nimport eventBus from 'modapp-eventbus';\n\n/**\n * L10n instance using the {@link module:modapp/eventBus} to emit locale changes.\n * @type {L10n}\n */\nlet l10n = new L10n(eventBus);\n\nexport { L10n };\nexport default l10n;\n","import l10n from 'modapp-l10n';\n\n/**\n * Err represents a local error.\n */\nclass Err {\n\n\tconstructor(code, message, data) {\n\t\tthis._code = code || 'unknown';\n\t\tthis._message = message || `Unknown error`;\n\t\tthis._data = data;\n\t}\n\n\t/**\n\t * Error code\n\t * @type {string}\n\t */\n\tget code() {\n\t\treturn this._code;\n\t}\n\n\t/**\n\t * Error message\n\t * @type {string}\n\t */\n\tget message() {\n\t\treturn this._message;\n\t}\n\n\t/**\n\t * Error data object\n\t * @type {*}\n\t */\n\tget data() {\n\t\treturn this._data;\n\t}\n\n\t/**\n\t * Returns the error as a LocaleString.\n\t * @returns {LocaleString}\n\t */\n\tlocaleString() {\n\t\treturn l10n.l(this._code, this._message, this._data);\n\t}\n}\n\nexport default Err;\n","/**\n * Compares two values deeply using strict equal testing for non-objects (===).
\n * Two objects are considered equal if they contain the same set of properties with equal value.\n * @param {*} a Value to compare with b.\n * @param {*} b Value to compare with a.\n * @returns {boolean} True if the values are equal, otherwise false.\n */\nlet equal = function (a, b) {\n\t// Check if a is a non-object\n\tif (a === null || typeof a !== 'object') {\n\t\treturn a === b;\n\t}\n\n\t// Make sure b is also an object\n\tif (b === null || typeof b !== 'object') {\n\t\treturn false;\n\t}\n\n\tvar ak = Object.keys(a).sort();\n\tvar bk = Object.keys(b).sort();\n\n\tif (ak.length != bk.length) return false;\n\tfor (let i = 0, k;\n\t\t(k = ak[i]); i++) {\n\t\tif (k !== bk[i]) return false;\n\n\t\tif (!equal(a[k], b[k])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n\n/**\n * Property definition\n * @typedef {Object} func/obj~PropertyDefinition\n * @property {string} type Type of the property. May be 'string', '?string', 'number', '?number', 'boolean', '?boolean'\n * @property {*} [default] Default value of the property.\n * @property {function} [assert] Asserts the value. Throws an exception on failed assertion.\n * @property {function} [filter] Filter callback receiving the initial value as only parameter, returning the filtered value.\n * @property {string} [property] Name of target property. Default is to use the same property name as the source.\n */\n\nconst TYPES = {\n\t\"any\": {\n\t\tdefault: () => null,\n\t\tassert: v => {},\n\t\tfromString: v => v\n\t},\n\t\"string\": {\n\t\tdefault: () => \"\",\n\t\tassert: v => {\n\t\t\tif (typeof v !== \"string\") {\n\t\t\t\tthrow new Error(\"Not a string\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => String(v),\n\t},\n\t\"?string\": {\n\t\tdefault: () => null,\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'string' && v !== null) {\n\t\t\t\tthrow new Error(\"Not a string or null\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => String(v) // Not possible to set null\n\t},\n\t\"number\": {\n\t\tdefault: () => 0,\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'number') {\n\t\t\t\tthrow new Error(\"Not a number\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\tv = Number(v);\n\t\t\tif (isNaN(v)) {\n\t\t\t\tthrow new Error(\"Not a number format\");\n\t\t\t}\n\t\t\treturn v;\n\t\t}\n\t},\n\t\"?number\": {\n\t\tdefault: () => null,\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'number' && v !== null) {\n\t\t\t\tthrow new Error(\"Not a number or null\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\tv = !v || v.toLowerCase() == 'null' ? null : Number(v);\n\t\t\tif (isNaN(v)) {\n\t\t\t\tthrow new Error(\"Not a number format\");\n\t\t\t}\n\t\t\treturn v;\n\t\t}\n\t},\n\t\"boolean\": {\n\t\tdefault: () => false,\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'boolean') {\n\t\t\t\tthrow new Error(\"Not a boolean\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\tv = v.toLowerCase();\n\t\t\tif (v == 'true' || v == '1' || v == 'yes') {\n\t\t\t\tv = true;\n\t\t\t} else if (v == 'false' || v == '0' || v == 'no') {\n\t\t\t\tv = false;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Not a boolean format\");\n\t\t\t}\n\t\t\treturn v;\n\t\t}\n\t},\n\t\"?boolean\": {\n\t\tdefault: () => null,\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'boolean' && v !== null) {\n\t\t\t\tthrow new Error(\"Not a boolean or null\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\tv = v.toLowerCase();\n\t\t\tif (v == 'true' || v == '1' || v == 'yes') {\n\t\t\t\tv = true;\n\t\t\t} else if (v == 'false' || v == '0' || v == 'no') {\n\t\t\t\tv = false;\n\t\t\t} else if (v == 'null') {\n\t\t\t\tv = null;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Not a nullable boolean format\");\n\t\t\t}\n\t\t\treturn v;\n\t\t}\n\t},\n\t\"object\": {\n\t\tdefault: () => ({}),\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'object' || v === null) {\n\t\t\t\tthrow new Error(\"Not an object\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\treturn JSON.parse(v);\n\t\t}\n\t},\n\t\"?object\": {\n\t\tdefault: () => null,\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'object') {\n\t\t\t\tthrow new Error(\"Not an object or null\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\treturn JSON.parse(v);\n\t\t}\n\t},\n\t\"function\": {\n\t\tdefault: () => function () {},\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'function') {\n\t\t\t\tthrow new Error(\"Not a function\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\treturn () => {}; // Evaluating functions from strings is not allowed\n\t\t}\n\t},\n\t\"?function\": {\n\t\tdefault: () => null,\n\t\tassert: v => {\n\t\t\tif (typeof v !== 'function' && v !== null) {\n\t\t\t\tthrow new Error(\"Not a function or null\");\n\t\t\t}\n\t\t},\n\t\tfromString: v => {\n\t\t\treturn null; // Evaluating functions from strings is not allowed\n\t\t}\n\t}\n};\n\n/**\n * Updates an target object from a source object based upon a definition\n * @param {object} target Target object\n * @param {object} source Source object\n * @param {Object.} def Definition object which is a key/value object where the key is the property and the value is the property type or a property definition.\n * @param {boolean} strict Strict flag. If true, exceptions will be thrown on errors. If false, errors will be ignored. Default is true.\n * @returns {?Object.} Key/value object where the key is the updated properties and the value is the old values.\n */\nlet update = function (target, source, def, strict = true) {\n\tif (!source || typeof source != 'object') {\n\t\tsource = {};\n\t}\n\tif (!def || typeof def != 'object') {\n\t\tthrow new Error(\"Invalid definition\");\n\t}\n\n\tlet updated = false;\n\tlet updateObj = {};\n\n\tfor (let key in def) {\n\t\tlet d = def[key];\n\t\tif (typeof d === 'string') {\n\t\t\td = {\n\t\t\t\ttype: d\n\t\t\t};\n\t\t}\n\n\t\tlet t = TYPES[d.type];\n\t\tif (!t) {\n\t\t\tthrow new Error(\"Invalid definition type: \" + d.type);\n\t\t}\n\n\t\tlet tkey = d.hasOwnProperty('property') ? d.property : key;\n\n\t\t// Check if target has any value set. If not, use default.\n\t\tif (!target.hasOwnProperty(tkey)) {\n\t\t\tupdated = true;\n\t\t\tupdateObj[tkey] = undefined;\n\t\t\ttarget[tkey] = d.hasOwnProperty('default') ? d.default : t.default();\n\t\t}\n\n\t\t// Check if source has value for the property. If not, continue to next property.\n\t\tif (!source.hasOwnProperty(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet v = source[key];\n\t\tif (typeof v === 'undefined') {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert from string\n\t\t\tif (typeof v === \"string\") {\n\t\t\t\tv = t.fromString(v);\n\t\t\t}\n\n\t\t\t// Apply filter to value\n\t\t\tif (d.filter) {\n\t\t\t\tv = d.filter(v);\n\t\t\t}\n\n\t\t\t// Type assertion\n\t\t\tt.assert(v);\n\n\t\t\t// Definition assertion\n\t\t\tif (d.assert) {\n\t\t\t\td.assert(v);\n\t\t\t}\n\n\t\t\t// Check if the property value differs and set it as updated\n\t\t\tif (target[tkey] !== v) {\n\t\t\t\tupdated = true;\n\t\t\t\tupdateObj[tkey] = target[tkey];\n\t\t\t\ttarget[tkey] = v;\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tif (strict) {\n\t\t\t\tthrow ex;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!updated) return null;\n\n\treturn updateObj;\n};\n\n/**\n * Copies a source object based upon a definition\n * @param {object} source Source object\n * @param {object} def Definition object which is a key/value object where the key is the property and the value is the value type.\n * @param {boolean} strict Strict flag. If true, exceptions will be thrown on errors. If false, errors will be ignored. Default is false.\n * @returns {object} Copy of the object\n */\nlet copy = function (source, def, strict = false) {\n\tlet copy = {};\n\tupdate(copy, source, def, strict);\n\treturn copy;\n};\n\nexport {\n\tequal,\n\tupdate,\n\tcopy\n};\n","/**\n * Error when a module is blocked by one or more required modules not being loaded.\n */\nclass BlockedError extends Error {\n\n\t/**\n\t * Creates a BlockedError\n\t * @param {string} moduleName Name of the module.\n\t * @param {Object.} blockedBy Key-value object where the key is the module name and the value is the error loading that module\n\t */\n\tconstructor(moduleName, blockedBy) {\n\t\tsuper();\n\t\tthis.moduleName = moduleName;\n\t\tthis.blockedBy = blockedBy;\n\t\tthis.name = 'BlockedError';\n\t\tthis.message = `Module ${moduleName} is blocked by ${Object.keys(blockedBy).join(', ')}.`;\n\t}\n}\n\nexport default BlockedError;\n","/**\n * Error when a module has a circular dependency.\n */\nclass CircularDependencyError extends Error {\n\n\t/**\n\t * Creates a CircularDependencyError\n\t * @param {string} moduleName Name of the module.\n\t * @param {Array.} chain Dependency chain\n\t */\n\tconstructor(moduleName, chain) {\n\t\tsuper();\n\t\tthis.moduleName = moduleName;\n\t\tthis.chain = chain;\n\t\tthis.name = 'CircularDependencyError';\n\t\tthis.message = `Circular dependency: ${chain.join(\" > \")} > ${moduleName}.`;\n\t}\n}\n\nexport default CircularDependencyError;\n","/**\n * Error when a module class is unavailable\n */\nclass UnavailableError extends Error {\n\n\t/**\n\t * Creates an UnavailableError\n\t * @param {string} moduleName Name of the module.\n\t * @param {Error|string} internalError Internal error as to why the module is unavailable.\n\t */\n\tconstructor(moduleName, internalError) {\n\t\tsuper();\n\t\tthis.moduleName = moduleName;\n\t\tthis.name = 'UnavailableError';\n\t\tthis.internalError = internalError;\n\t\tthis.message = `Module ${moduleName} is unavailable: ${internalError.message || internalError}`;\n\t}\n}\n\nexport default UnavailableError;\n","/**\n * Error when a module is deactivated and is not loaded.\n */\nclass DeactivatedError extends Error {\n\n\t/**\n\t * Creates a DeactivatedError\n\t * @param {string} moduleName Name of the module.\n\t */\n\tconstructor(moduleName) {\n\t\tsuper();\n\t\tthis.moduleName = moduleName;\n\t\tthis.name = 'DeactivatedError';\n\t\tthis.message = `Module ${moduleName} is deactivated.`;\n\t}\n}\n\nexport default DeactivatedError;\n","/**\n * Error when an error is encountered creating an instance\n */\nclass UnknownError extends Error {\n\n\t/**\n\t * Creates an UnknownError\n\t * @param {string} moduleName Name of the module.\n\t * @param {Error} error Error that was encountered.\n\t */\n\tconstructor(moduleName, error) {\n\t\tsuper();\n\t\tthis.moduleName = moduleName;\n\t\tthis.name = 'UnknownError';\n\t\tthis.error = error;\n\t\tthis.message = `Module ${moduleName} encountered an error: ${error.message || error}`;\n\t}\n}\n\nexport default UnknownError;\n","// Errors\nimport BlockedError from '../error/BlockedError.js';\nimport CircularDependencyError from '../error/CircularDependencyError.js';\nimport UnavailableError from '../error/UnavailableError.js';\nimport DeactivatedError from '../error/DeactivatedError.js';\nimport UnknownError from '../error/UnknownError.js';\n\n/**\n * An app module instance\n * @private\n */\nclass ModuleInstance {\n\n\tconstructor(name) {\n\t\tthis.name = name;\n\t\tthis.instance = null;\n\t\tthis.requires = [];\n\t\tthis.dependants = [];\n\t\tthis.explicit = false;\n\t\tthis.error = null;\n\n\t\tthis.setState('loading');\n\t}\n\n\tsetRequires(moduleNames) {\n\t\tthis.requires = moduleNames;\n\t}\n\n\taddDependant(moduleName) {\n\t\tif (this.dependants.indexOf(moduleName) === -1) {\n\t\t\tthis.dependants.push(moduleName);\n\t\t}\n\t}\n\n\tsetState(state, param) {\n\t\tswitch (state) {\n\t\t// Initial loading. Promise has not yet resolved\n\t\t\tcase 'loading':\n\t\t\t\tthis.promise = null;\n\t\t\t\t// Module is ready and this.instance is set\n\t\t\tcase 'ready':\n\t\t\tcase 'require':\n\t\t\t\tthis.error = null;\n\t\t\t\tbreak;\n\t\t\t\t// Module is deactivated\n\t\t\tcase 'deactivated':\n\t\t\t\tthis.error = new DeactivatedError(this.name);\n\t\t\t\tbreak;\n\t\t\t\t// Module is blocked one or more modules. Param is a blockedBy object\n\t\t\tcase 'blocked':\n\t\t\t\tthis.error = new BlockedError(this.name, param);\n\t\t\t\tbreak;\n\t\t\t\t// Module class is unavailable. Param is the error reason.\n\t\t\tcase 'unavailable':\n\t\t\t\tthis.error = new UnavailableError(this.name, param);\n\t\t\t\tbreak;\n\t\t\t\t// Module has a circular dependency\n\t\t\tcase 'circularDependency':\n\t\t\t\tthis.error = new CircularDependencyError(this.name, param);\n\t\t\t\tbreak;\n\t\t\t\t// Module couldn't load due to an error (most likely in module constructor). Param is the error.\n\t\t\tcase 'error':\n\t\t\t\tthis.error = new UnknownError(this.name, param);\n\t\t\t\tbreak;\n\t\t\t\t// Module is implicit without any dependants.\n\t\t\tcase 'passive':\n\t\t\t\tthis.error = null;\n\t\t\t\tthis.instance = null;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (this.error) {\n\t\t\tthis.instance = null;\n\t\t}\n\n\t\tthis.state = state;\n\t\treturn this;\n\t}\n\n\tisActive() {\n\t\treturn this.state === 'loading' ||\n\t\t\tthis.state === 'require' ||\n\t\t\tthis.state === 'ready';\n\t}\n\n\t/**\n\t * Sets module instance as explicitly loaded.
\n\t * This prevents the module from being unloaded\n\t * when it no longer has any dependants.\n\t */\n\tsetExplicit() {\n\t\tthis.explicit = true;\n\t}\n}\n\nexport default ModuleInstance;\n","import ModuleInstance from './ModuleInstance.js';\nimport { uri } from 'modapp-utils';\n\n/**\n * Require callback\n * @callback App~requireCallback\n * @param {Object.} modules A key/value object with keys being the module names and the value being the app module instance.\n */\n\n/**\n * Module class callback\n * @callback App~moduleClassCallback\n * @param {string} moduleName Name of the module\n * @returns {Promise.} Returns promise of the {@link AppModule} class.\n */\n\n/**\n * Load app module results\n * @typedef {object} App~loadResults\n * @property {Object.} modules A key/value object where the key is the module name and the value is the app module instance.\n * @property {?Object.} errors A key/value object where the key is the module name and the value is the error when trying to load the module. Null means there are no errors.\n */\n\n/**\n * A modular app container loading, storing, and linking app modules together.\n */\nclass App {\n\n\t/**\n\t * Creates an App instance.
\n\t * The optional module configuration may be overridden using the url query.
\n\t * Eg. \"?login.auto=true\" would pass {auto: \"true\"} as parameter to the login app module.\n\t * If a module configuration has the property \"active\" set to the strings \"false\", \"no\",\n\t * or \"0\", or has value false or 0, it will automatically be deactivated on load.\n\t * @param {Object.} [moduleConfig] App module configuration key-value object where the key is the name of the module and the value is the parameters passed to the module on creation.\n\t * @param {object} [opt] App configuration\n\t * @param {App~moduleClassCallback} [opt.moduleClass] Callback for fetching the {@link AppModule} class for a given module name.\n\t * @param {string} [opt.queryNamespace] Namespace prefix for query params. Eg. 'mod' for ?mod.login.auto=true . Defaults to no namespace.\n\t * @param {object} [opt.props] App properties available for all modules through the props property.\n\t */\n\tconstructor(moduleConfig, opt = {}) {\n\t\t// Module configuration\n\t\tthis._moduleConfig = moduleConfig || {};\n\t\tthis._query = uri.getQuery(opt.queryNamespace || null);\n\t\tthis._moduleClassCallback = opt.moduleClass || null;\n\t\tthis._props = opt.props || {};\n\n\t\t// Module storage\n\t\tthis._module = {}; // Holds all ModuleInstances\n\t\tthis._moduleClass = {}; // Holds all AppModule classes\n\n\t\t// Require\n\t\tthis._catchRequire = false; // Holds required modules\n\t\tthis._require = null;\n\t}\n\n\t/**\n\t * App properties.\n\t */\n\tget props() {\n\t\t// Shallow copy the props to prevent using them to pass data between modules.\n\t\treturn Object.assign({}, this._props);\n\t}\n\n\t/**\n\t * Loads an app module bundle, creating an explicit instance of each app module class.
\n\t * If a moduleClass already exist for a given name, loadBundle will dispose the previously\n\t * loaded version and replace it with a new instance.\n\t * The returned promise will always resolve.\n\t * @param {Object.} bundle A key/value object where the key is the module name and the value is the app module class.\n\t * @returns {Promise.} Promise of the load results. Will always resolve.\n\t */\n\tloadBundle(bundle) {\n\t\tvar i, modName, modNames = Object.keys(bundle);\n\n\t\t// Put all module classes in _moduleClass cache\n\t\tfor (i = 0; i < modNames.length; i++) {\n\t\t\tmodName = modNames[i];\n\t\t\tif (this._moduleClass[modName]) {\n\t\t\t\tthrow new Error(`Module ${modName} already in cache. Handling not implemented yet`);\n\t\t\t}\n\n\t\t\tthis._moduleClass[modName] = bundle[modName];\n\t\t}\n\n\t\treturn this.loadModules(modNames);\n\t}\n\n\t/**\n\t * Loads a set of modules, creating an instance for each if there is none, fetching the module\n\t * class from the server if needed.\n\t * @param {Array.} moduleNames An array of module names\n\t * @returns {Promise.} Promise of the load results. Will always resolve.\n\t */\n\tloadModules(moduleNames) {\n\t\treturn this._loadInstances(moduleNames)\n\t\t\t.then(this._toLoadResults);\n\t}\n\n\t/**\n\t * Gets a loaded and active module.\n\t * @param {string} moduleName Name of the module\n\t * @returns {object} Module instance, or undefined if it is not loaded and active.\n\t */\n\tgetModule(moduleName) {\n\t\tlet modInst = this._module[moduleName];\n\t\treturn modInst && modInst.state == 'ready'\n\t\t\t? modInst.instance\n\t\t\t: undefined;\n\t}\n\n\t/**\n\t * Converts an array of ModuleInstance's to an {@link App~loadResults} object.\n\t * @param {Array.} modInsts Array of ModuleInstance objects.\n\t * @returns {App~loadResults} Load results object.\n\t * @private\n\t */\n\t_toLoadResults(modInsts) {\n\t\tlet modules = {}, errors = null;\n\t\tfor (let i = 0, modInst; (modInst = modInsts[i]); i++) {\n\t\t\tif (modInst.error) {\n\t\t\t\terrors = errors || {};\n\t\t\t\terrors[modInst.name] = modInst.error;\n\t\t\t} else {\n\t\t\t\tmodules[modInst.name] = modInst.instance;\n\t\t\t}\n\t\t}\n\n\t\treturn { modules, errors };\n\t}\n\n\t/**\n\t * Deactivates a previously loaded (explicitly or implicitly through require) module,\n\t * and disposes its instance. Any recursivly dependant module will also be disposed along\n\t * with any implicitly loaded module with all its dependants being disposed.\n\t * @param {string} moduleName Name of module to deactivate\n\t */\n\tdeactivate(moduleName) {\n\t\tlet modInst = this._module[moduleName];\n\t\tif (!modInst) {\n\t\t\tthrow new Error(`Module ${moduleName} is not loaded.`);\n\t\t}\n\n\t\tthis._disposeInstance(modInst, 'deactivated');\n\t}\n\n\t/**\n\t * Activates a previously deactivated module by creating a new module instance.
\n\t * Any other module that has been blocked loading due to being dependant upon the\n\t * deactivated module, will also be loaded.\n\t * @param {string} moduleName Name of module to activate.\n\t * @returns {Promise.} Promise of the app module.\n\t */\n\tactivate(moduleName) {\n\t\tlet modInst = this._module[moduleName];\n\t\tif (!modInst || modInst.state !== 'deactivated') {\n\t\t\tthrow new Error(`Module ${moduleName} is not deactivated.`);\n\t\t}\n\n\t\treturn this._reloadInstance(modInst);\n\t}\n\n\t/**\n\t * Reloads an instance and any module blocked by it.\n\t * @param {ModuleInstance} modInst Module instance\n\t * @returns {Promise.} Promise of the app module.\n\t * @private\n\t */\n\t_reloadInstance(modInst) {\n\t\tif (modInst.state == 'ready') {\n\t\t\treturn Promise.resolve(modInst.instance);\n\t\t}\n\n\t\treturn this._getModuleClass(modInst.name)\n\t\t\t.catch(err => {\n\t\t\t\tmodInst.setState('unavailable', err);\n\t\t\t\treturn Promise.reject(modInst.error);\n\t\t\t})\n\t\t\t.then(modClass => {\n\t\t\t\tlet params = this._getModuleParams(modInst.name);\n\t\t\t\treturn this._createInstance(modInst, modClass, params, []);\n\t\t\t})\n\t\t\t.then(modInst => {\n\t\t\t\tif (modInst.error) {\n\t\t\t\t\treturn Promise.reject(modInst.error);\n\t\t\t\t}\n\n\t\t\t\t// Take the blocked dependants and try to reload them\n\t\t\t\tlet deps = modInst.dependants;\n\t\t\t\tlet promises = [];\n\t\t\t\tmodInst.dependants = [];\n\t\t\t\tfor (var i = 0; i < deps.length; i++) {\n\t\t\t\t\tpromises.push(this._reloadInstance(this._module[deps[i]]));\n\t\t\t\t}\n\n\t\t\t\t// Wait with resolving until all dependants have loaded.\n\t\t\t\t// Why? To allow proper testing that dependants did load.\n\t\t\t\treturn Promise.all(promises)\n\t\t\t\t\t.then(() => modInst.instance)\n\t\t\t\t\t.catch(() => modInst.instance);\n\t\t\t});\n\t}\n\n\t// eslint-disable-next-line valid-jsdoc\n\t/**\n\t * Checks if the provided module class is different from the one loaded, and if it is,\n\t * disposes the previously loaded version and replace it with a new instance.
\n\t * If no module class is provided, update will try fetching the module class from the server.\n\t * @param {string} moduleName Name of the module to update\n\t * @param {Class.} [moduleClass] Optional module class.\n\t * returns {Promise.} Promise of the app module instance.\n\t */\n\tupdate(moduleName, moduleClass = null) {\n\t\tthrow new Error(\"Not implemented\");\n\t}\n\n\t/**\n\t * Requires an app module or a set of app modules.
\n\t * May only be called within an app module [constructor]{@link AppModule#constructor}.
\n\t * If a required module has not yet been loaded, an instance of if will be created\n\t . If any of the required modules cannot be created,\n\t * the returned promise will be rejected, and the module that called the require will not\n\t * be loaded.
\n\t * If any modules that has been created during this call also calls {@link App#require}\n\t * within their constructors, those require requests will be queued to be handled after\n\t * all modules on the initial request has been loaded.\n\t * @param {string|Array.} moduleNames The name of a module, or an array of module names\n\t * @param {App~requireCallback} callback Require callback on success\n\t * @returns {this}\n\t */\n\trequire(moduleNames, callback) {\n\t\t// Check if call doesn't origin from module creation inside of App\n\t\tif (!this._catchRequire) {\n\t\t\tthrow new Error(\"App.require may only be called from an AppModule's constructor when created by the App.\");\n\t\t}\n\n\t\tif (moduleNames && moduleNames.length) {\n\t\t\tthis._require = { moduleNames, callback };\n\t\t} else {\n\t\t\tcallback({});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Loads a list of modules.\n\t * @param {Array.} modNames Array of module names to load\n\t * @param {string} [loadedBy] Name of module loading the instances. Defaults to null.\n\t * @returns {Promise.>} Promise of the ModuleInstance array. Will always resolve.\n\t * @private\n\t */\n\t_loadInstances(modNames, loadedBy = null) {\n\t\t// Quick escape\n\t\tif (!modNames || !modNames.length) {\n\t\t\treturn Promise.resolve([]);\n\t\t}\n\n\t\tlet promises = [];\n\t\tfor (let i = 0; i < modNames.length; i++) {\n\t\t\tpromises.push(this._loadInstance(modNames[i], loadedBy));\n\t\t}\n\n\t\treturn Promise.all(promises);\n\t}\n\n\t/**\n\t * Loads a module instance. If the module has not been loaded previously, a new instance will\n\t * be created.\n\t * @param {string} modName Name of the module.\n\t * @param {string} [loadedBy] Name of module loading the instance.\n\t * @returns {Promise.} A promise of the module instance. Will always resolve.\n\t * @private\n\t */\n\t_loadInstance(modName, loadedBy) {\n\t\tlet checkActiveFlag = true;\n\n\t\t// Check if module is loading\n\t\tlet modInst = this._module[modName];\n\t\tif (modInst) {\n\t\t\tif (modInst.state === 'passive') {\n\t\t\t\tmodInst.setState('loading');\n\t\t\t\tcheckActiveFlag = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmodInst = new ModuleInstance(modName);\n\t\t\tthis._module[modName] = modInst;\n\t\t}\n\n\t\tif (loadedBy) {\n\t\t\tmodInst.addDependant(loadedBy);\n\t\t} else {\n\t\t\tmodInst.setExplicit();\n\t\t}\n\n\t\tif (!modInst.promise) {\n\t\t\tmodInst.promise = this._getModuleClass(modName)\n\t\t\t\t.then(modClass => {\n\t\t\t\t\tlet params = this._getModuleParams(modInst.name);\n\n\t\t\t\t\t// Check if module defaults to being deactivated\n\t\t\t\t\tif (checkActiveFlag && !this._isTrue(params.active)) {\n\t\t\t\t\t\tmodInst.setState('deactivated');\n\t\t\t\t\t\treturn modInst;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this._createInstance(modInst, modClass, params);\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tmodInst.setState('unavailable', err);\n\t\t\t\t\treturn modInst;\n\t\t\t\t});\n\t\t}\n\n\t\treturn modInst.promise;\n\t}\n\n\t/**\n\t * Gets a module class from the cache, or fetches it using\n\t * @param {string} modName Name of the module.\n\t * @returns {Promise.} Promise of a AppModule class.\n\t * @private\n\t */\n\t_getModuleClass(modName) {\n\t\t// Check if module is already loaded\n\t\tlet modClass = this._moduleClass[modName];\n\t\tif (modClass) {\n\t\t\treturn Promise.resolve(modClass);\n\t\t}\n\n\t\t// Check if we have a callback to get it with\n\t\tif (this._moduleClassCallback) {\n\t\t\t// Get the class. We don't cache the promise\n\t\t\t// as we expect only one call per module instance\n\t\t\treturn this._moduleClassCallback(modName)\n\t\t\t\t.then(modClass => {\n\t\t\t\t\tthis._moduleClass[modName] = modClass;\n\t\t\t\t\treturn modClass;\n\t\t\t\t});\n\t\t}\n\n\t\treturn Promise.reject(new Error(\"No module class callback available.\"));\n\t}\n\n\t/**\n\t * Tries to create an instance of a module\n\t * @param {ModuleInstance} modInst Module instance object\n\t * @param {Class.} modClass AppModule class\n\t * @param {object} params Parameters to pass to modClass.\n\t * @returns {Promise.} A promise of the module instance. Will always resolve.\n\t * @private\n\t */\n\t_createInstance(modInst, modClass, params) {\n\t\t// Create new module instance\n\t\tthis._catchRequire = true;\n\t\ttry {\n\t\t\tmodInst.instance = new modClass(this, params);\n\t\t} catch (ex) {\n\t\t\tmodInst.setState('error', ex);\n\t\t\treturn Promise.resolve(modInst);\n\t\t}\n\t\tthis._catchRequire = false;\n\n\t\t// Quick escape if module had no dependencies\n\t\tif (!this._require) {\n\t\t\tmodInst.setState('ready');\n\t\t\treturn Promise.resolve(modInst);\n\t\t}\n\n\t\t// Store away the caught require\n\t\tlet require = this._require;\n\t\tthis._require = null;\n\n\t\t// Set requires\n\t\tmodInst.setRequires(require.moduleNames);\n\t\tmodInst.setState('require');\n\n\t\t// Check for circular dependencies\n\t\ttry {\n\t\t\tthis._checkCircularRef(modInst);\n\t\t} catch (ex) {\n\t\t\tmodInst.setState('circularDependency', ex);\n\t\t\treturn Promise.resolve(modInst);\n\t\t}\n\n\t\t// Load required modules\n\t\treturn this._loadInstances(\n\t\t\tmodInst.requires,\n\t\t\tmodInst.name\n\t\t).then(modInsts => {\n\t\t\tlet result = this._toLoadResults(modInsts);\n\n\t\t\tif (result.errors) {\n\t\t\t\tmodInst.setState('blocked', result.errors);\n\t\t\t\t// Clean up any implicitly loaded module\n\t\t\t\tthis._cleanImplicits(Object.keys(result.modules));\n\t\t\t} else {\n\t\t\t\tmodInst.setState('ready');\n\n\t\t\t\ttry {\n\t\t\t\t\t// Store error in a context that can be thrown later\n\t\t\t\t\trequire.callback(result.modules);\n\t\t\t\t} catch (ex) {\n\t\t\t\t\t// Defer throwing the exception\n\t\t\t\t\tif (ex) {\n\t\t\t\t\t\tsetTimeout(() => { throw ex; });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn modInst;\n\t\t});\n\t}\n\n\t/**\n\t * Goes through a module instance's dependencies\n\t * and removes itself. If a dependency is loaded implicitly\n\t * and has no other dependants, it is disposed.\n\t * @param {Array.} modNames Module names to clean.\n\t * @private\n\t */\n\t_cleanImplicits(modNames) {\n\t\tfor (let i = 0; i < modNames.length; i++) {\n\t\t\tvar modInst = this._module[modNames[i]];\n\t\t\tthis._cleanImplicit(modInst);\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a module instance is implicit and disposes it\n\t * if it has no active dependants.\n\t * @param {ModuleInstance} modInst Module instance\n\t * @private\n\t */\n\t_cleanImplicit(modInst) {\n\t\tif (modInst.explicit) return;\n\n\t\tlet d = modInst.dependants;\n\t\tfor (let i = 0; i < d.length; i++) {\n\t\t\tif (this._module[d[i]].isActive()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis._disposeInstance(modInst, 'passive');\n\t}\n\n\t/**\n\t * Disposes a module instance and all of its dependencies\n\t * @param {ModuleInstance} modInst Module instance to dispose\n\t * @param {string} state State reason for disposal. Must be 'blocked', 'passive', or 'deactivated'.\n\t * @private\n\t */\n\t_disposeInstance(modInst, state) {\n\t\t// Do nothing with instance if deactivated\n\t\tif (modInst.state === 'deactivated') return;\n\n\t\tlet instance = modInst.instance;\n\n\t\tif (state === 'blocked') {\n\t\t\tlet blockedBy = {};\n\t\t\tfor (let i = 0; i < modInst.requires.length; i++) {\n\t\t\t\tlet depInst = this._module[modInst.requires[i]];\n\t\t\t\tif (depInst.error) {\n\t\t\t\t\tblockedBy[depInst.name] = depInst.error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmodInst.setState('blocked', blockedBy);\n\t\t} else {\n\t\t\tmodInst.setState(state);\n\t\t}\n\n\t\t// Has the instance already been disposed?\n\t\tif (!instance) return;\n\n\t\t// Dispose any dependants\n\t\tfor (let i = 0; i < modInst.dependants.length; i++) {\n\t\t\tvar depName = modInst.dependants[i];\n\t\t\tthis._disposeInstance(this._module[depName], 'blocked');\n\t\t}\n\n\t\t// Dispose instance\n\t\tif (instance.dispose) {\n\t\t\tinstance.dispose();\n\t\t}\n\n\t\tthis._cleanImplicits(modInst.requires);\n\t}\n\n\n\t/**\n\t * Checks if value is true. Returns true unless the value is any of the following:
\n\t * * A boolean false
\n\t * * A string with the case-insensitive value of 'false', '0' or 'no'
\n\t * * A number with the value of 0
\n\t * @param {*} v Value\n\t * @returns {boolean}\n\t * @private\n\t */\n\t_isTrue(v) {\n\t\tswitch (typeof v) {\n\t\t\tcase 'boolean': return v;\n\t\t\tcase 'number': v = v.toString();\n\t\t\tcase 'string':\n\t\t\t\tv = v.toLowerCase();\n\t\t\t\tif (v == 'false' || v == '0' || v == 'no') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Returns module parameters based on configuration and query values for given module name\n\t * @param {string} modName Name of module\n\t * @returns {object} Configuration object\n\t * @private\n\t */\n\t_getModuleParams(modName) {\n\t\t// Query based params has priority over configuration provided on App creation\n\t\treturn Object.assign({}, this._moduleConfig[modName], this._query[modName]);\n\t}\n\n\t/**\n\t * Checks for circular references by traversing the require tree\n\t * for all modules in 'require' state.\n\t * @param {ModuleInstance} modInst Module instance to check\n\t * @param {Array.} [chain] Require chain\n\t * @private\n\t */\n\t_checkCircularRef(modInst, chain = []) {\n\t\tlet m, req = modInst.requires;\n\t\tchain.push(modInst.name);\n\n\t\tif (req.indexOf(chain[0]) > -1) {\n\t\t\tthrow chain;\n\t\t}\n\n\t\tfor (let i = 0; i < req.length; i++) {\n\t\t\tm = this._module[req[i]];\n\t\t\tif (m && m.state === 'require') {\n\t\t\t\tthis._checkCircularRef(m, chain);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport default App;\n","// Classes\nimport App from './App.js';\nimport eventBus from 'modapp-eventbus';\n\n/**\n * EventBus is a bus for subscribing to and emitting events.\n * @external EventBus\n * @see {@link https://github.com/jirenius/modapp-eventbus/blob/master/docs/docs.md#EventBus|modapp-eventbus}\n */\n\n/**\n * Event callback\n * @callback AppExt~eventCallback\n * @param {?object} data Event data object\n * @param {AppExt} target Target AppExt object\n * @param {string} event Event name including namespace\n */\n\n/**\n * A modular app container that extends {@link App} and adds an eventBus\n * in addition to implement the {@link Component} interface.\n * @implements {Component}\n */\nclass AppExt extends App {\n\n\t/**\n\t * Creates an extended App instance.
\n\t * The optional module configuration may be overridden using the url query.
\n\t * Eg. \"?login.auto=true\" would pass {auto: \"true\"} as parameter to the login app module.\n\t * If a module configuration has the property \"active\" set to the strings \"false\", \"no\",\n\t * or \"0\", or has value false or 0, it will automatically be deactivated on load.\n\t * @param {Object.} [moduleConfig] App module configuration key-value object where the key is the name of the module and the value is the parameters passed to the module on creation.\n\t * @param {object} [opt] App configuration\n\t * @param {App~moduleClassCallback} [opt.moduleClass] Callback for fetching the {@link AppModule} class for a given module name.\n\t * @param {string} [opt.queryNamespace] Namespace prefix for query params. Eg. 'mod' for ?mod.login.auto=true . Defaults to no namespace.\n\t * @param {object} [opt.props] App properties available for all modules through the props property.\n\t * @param {EventBus} [opt.eventBus] Event bus.\n\t * @param {string} [opt.eventBusNamespace] Namespace prefix for the event bus. Defaults to 'app'.\n\t */\n\tconstructor(moduleConfig, opt = {}) {\n\t\tsuper(moduleConfig, opt);\n\n\t\t// Module configuration\n\t\tthis._eventBus = opt.eventBus || eventBus;\n\t\tthis._eventBusNamespace = opt.eventBusNamespace || 'app';\n\t}\n\n\t/**\n\t * The event bus used by the AppExt\n\t */\n\tget eventBus() {\n\t\treturn this._eventBus;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more app events.
\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {AppExt~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._eventBusNamespace);\n\t}\n\n\t/**\n\t * Remove an app event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {AppExt~eventCallback} [handler] An optional handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._eventBusNamespace);\n\t}\n\n\t/**\n\t * Sets the screen component and renders it if the screen is rendered.
\n\t * Usually called by the app module responsible for displaying the initial\n\t * loading screen, the login screen, or the overall layout.\n\t * @param {Component} component Component to set.\n\t */\n\tsetComponent(component) {\n\t\tcomponent = component || null; // Ensure falsy values are cast to null\n\n\t\t// Has the component changed?\n\t\tif (component === this._component) return;\n\n\t\tif (!this._el) {\n\t\t\tthis._component = component;\n\t\t\treturn;\n\t\t}\n\n\t\t// Unrender if we have a component and it is rendered\n\t\tif (this._component) {\n\t\t\tthis._component.unrender();\n\t\t}\n\n\t\tthis._component = component;\n\t\tthis._renderScreen();\n\t}\n\n\t/**\n\t * Unsets a component if it matches the one set\n\t * @param {Component} component Component to unset\n\t */\n\tunsetComponent(component) {\n\t\tif (component === this._component) {\n\t\t\tthis.setComponent(null);\n\t\t}\n\t}\n\n\t/**\n\t * Check if a component has been set.\n\t * @returns {boolean} True if a component has been set, otherwise false\n\t */\n\thasComponent() {\n\t\treturn this._component ? true : false;\n\t}\n\n\t/**\n\t * Renders the component set with setComponent()\n\t * @param {HTMLElement|DocumentFragment} el Parent element in which to render the contents.\n \t * @returns {this}\n \t */\n\trender(el) {\n\t\tthis._el = el;\n\t\tthis._renderScreen();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unrenders the app\n\t */\n\tunrender() {\n\t\tif (!this._el) return;\n\t\tif (this._component) {\n\t\t\tthis._component.unrender();\n\t\t}\n\n\t\tthis._el = null;\n\t}\n\n\t/**\n\t * Renders the set component\n\t * @private\n\t */\n\t_renderScreen() {\n\t\tif (this._el && this._component) {\n\t\t\tthis._component.render(this._el);\n\t\t}\n\t}\n}\n\nexport default AppExt;\n","const config = {\n\tapi: {\n\t\thostUrl: 'wss://api.nercia.se/',\n\t\twebResourcePath: 'https://api.nercia.se/api/'\n\t},\n\tauth: {\n\t\tloginUrl: 'https://api.nercia.se/auth',\n\t\tlogoutUrl: 'https://api.nercia.se/auth/logout',\n\t\tauthenticateUrl: 'https://api.nercia.se/auth?noredirect',\n\t},\n\tfile: {\n\t\tuploadUrl: 'https://api.nercia.se/file/'\n\t},\n\tsentry: {\n\t\tdsn: 'https://c8b9dbbd6c85a22b3b5545f2653bd196@o4505799358021632.ingest.sentry.io/4505799365033984',\n\t\tenvironment: 'production',\n\t\ttracesSampleRate: 0.1,\n\t}\n};\n\nexport default config;\n","class CacheItem {\n\n\t/**\n\t * Creates a CacheItem instance\n\t * @param {string} rid Resource ID\n\t * @param {function} unsubscribe Unsubscribe callback\n\t */\n\tconstructor(rid, unsubscribe) {\n\t\tthis.rid = rid;\n\t\tthis._unsubscribe = unsubscribe;\n\n\t\tthis.type = null;\n\t\tthis.item = null;\n\t\tthis.direct = 0;\n\t\tthis.indirect = 0;\n\t\tthis.subscribed = 0; // Count of direct subscriptions towards Resgate\n\t\tthis.promise = null;\n\t}\n\n\t/**\n\t * Adds or subtracts from the subscribed counter.\n\t * @param {number} dir Value to add. If 0, the subscribed counter will be set to 0.\n\t */\n\taddSubscribed(dir) {\n\t\tthis.subscribed += dir ? dir : -this.subscribed;\n\t\tif (!this.subscribed && this.unsubTimeout) {\n\t\t\tclearTimeout(this.unsubTimeout);\n\t\t\tthis.unsubTimeout = null;\n\t\t}\n\t\t// Going from no subscription to having a subscription, from getting the\n\t\t// resource as a resource response, we should check if we should start\n\t\t// an unsubscribe timer.\n\t\tif (this.item && dir > 0 && this.subscribed == dir) {\n\t\t\tthis._checkUnsubscribe();\n\t\t}\n\t}\n\n\tsetPromise(promise) {\n\t\tif (!this.item) {\n\t\t\tthis.promise = promise;\n\t\t}\n\t\treturn promise;\n\t}\n\n\tsetItem(item, type) {\n\t\tthis.item = item;\n\t\tthis.type = type;\n\t\tthis.promise = null;\n\t\tthis._checkUnsubscribe();\n\t\treturn this;\n\t}\n\n\tsetType(modelType) {\n\t\tthis.type = modelType;\n\t\treturn this;\n\t}\n\n\taddDirect() {\n\t\tif (this.unsubTimeout) {\n\t\t\tclearTimeout(this.unsubTimeout);\n\t\t\tthis.unsubTimeout = null;\n\t\t}\n\t\tthis.direct++;\n\t}\n\n\tremoveDirect() {\n\t\tthis.direct--;\n\t\tif (this.direct < 0) {\n\t\t\tthrow \"Direct count reached below 0\";\n\t\t}\n\t\tif (this.subscribed) {\n\t\t\tthis._checkUnsubscribe();\n\t\t} else {\n\t\t\t// The subscription might be stale and should then be removed directly\n\t\t\tthis._unsubscribe(this);\n\t\t}\n\t}\n\n\tresetTimeout() {\n\t\tif (this.unsubTimeout) {\n\t\t\tclearTimeout(this.unsubTimeout);\n\t\t\tthis.unsubTimeout = null;\n\t\t\tthis._checkUnsubscribe();\n\t\t}\n\t}\n\n\t_checkUnsubscribe() {\n\t\tif (!this.subscribed || this.direct || this.unsubTimeout) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.unsubTimeout = this._unsubscribe(this, true);\n\t}\n\n\taddIndirect(n = 1) {\n\t\tthis.indirect += n;\n\t\tif (this.indirect < 0) {\n\t\t\tthrow \"Indirect count reached below 0\";\n\t\t}\n\t}\n\n}\n\nexport default CacheItem;\n","/**\n * TypeList holds registered resource factory callbacks\n */\nclass TypeList {\n\n\t/**\n\t * Creates a TypeList instance\n\t * @param {resourceFactoryCallback} defaultFactory Default factory function\n\t */\n\tconstructor(defaultFactory) {\n\t\tthis.root = {};\n\t\tthis.defaultFactory = defaultFactory;\n\t}\n\n\t/**\n\t * Adds a resource factory callback to a pattern.\n\t * The pattern may use the following wild cards:\n\t * * The asterisk (*) matches any part at any level of the resource name.\n\t * * The greater than symbol (>) matches one or more parts at the end of a resource name, and must be the last part.\n\t * @param {string} pattern Pattern of the resource type.\n\t * @param {resourceFactoryCallback} factory Resource factory callback\n\t */\n\taddFactory(pattern, factory) {\n\t\tlet tokens = pattern.split('.');\n\t\tlet l = this.root;\n\t\tlet n;\n\t\tlet sfwc = false;\n\n\t\tfor (let t of tokens) {\n\t\t\tlet lt = t.length;\n\t\t\tif (!lt || sfwc) {\n\t\t\t\tthrow new Error(\"Invalid pattern\");\n\t\t\t}\n\n\t\t\tif (lt > 1) {\n\t\t\t\tif (l.nodes) {\n\t\t\t\t\tn = l.nodes[t] = l.nodes[t] || {};\n\t\t\t\t} else {\n\t\t\t\t\tl.nodes = {};\n\t\t\t\t\tn = l.nodes[t] = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (t[0] === '*') {\n\t\t\t\t\tn = l.pwc = l.pwc || {};\n\t\t\t\t} else if (t[0] === '>') {\n\t\t\t\t\tn = l.fwc = l.fwc || {};\n\t\t\t\t\tsfwc = true;\n\t\t\t\t} else if (l.nodes) {\n\t\t\t\t\tn = l.nodes[t] = l.nodes[t] || {};\n\t\t\t\t} else {\n\t\t\t\t\tl.nodes = {};\n\t\t\t\t\tn = l.nodes[t] = {};\n\t\t\t\t}\n\t\t\t}\n\t\t\tl = n;\n\t\t}\n\n\t\tif (l.factory) {\n\t\t\tthrow new Error(\"Pattern already registered\");\n\t\t}\n\n\t\tl.factory = factory;\n\t}\n\n\t/**\n\t * Removes a resource factory callback.\n\t * @param {string} pattern Pattern of the resource type.\n\t * @returns {?resourceFactoryCallback} Factory callback or undefined if no callback is registered on the pattern\n\t */\n\tremoveFactory(pattern) {\n\t\tlet tokens = pattern.split('.');\n\t\tlet l = this.root;\n\t\tlet n;\n\t\tlet sfwc = false;\n\t\tlet lt;\n\n\t\tfor (let t of tokens) {\n\t\t\tn = null;\n\t\t\tlt = t.length;\n\t\t\tif (lt && !sfwc) {\n\t\t\t\tif (lt > 1) {\n\t\t\t\t\tif (l.nodes) {\n\t\t\t\t\t\tn = l.nodes[t];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (t[0] === '*') {\n\t\t\t\t\t\tn = l.pwc;\n\t\t\t\t\t} else if (t[0] === '>') {\n\t\t\t\t\t\tn = l.fwc;\n\t\t\t\t\t\tsfwc = true;\n\t\t\t\t\t} else if (l.nodes) {\n\t\t\t\t\t\tn = l.nodes[t];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!n) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tl = n;\n\t\t}\n\n\t\tlet f = l.factory;\n\t\tdelete l.factory;\n\t\treturn f;\n\t}\n\n\t/**\n\t * Gets the factory callback that best matches the pattern.\n\t * Matching will give priority to text, then to *-wildcards, and last to >-wildcards.\n\t * @param {string} rid Resource ID\n\t * @returns {resourceFactoryCallback} Factory callback\n\t */\n\tgetFactory(rid) {\n\t\tlet tokens = rid.replace(/\\?.*$/, '').split('.');\n\t\treturn this._match(tokens, 0, this.root) || this.defaultFactory;\n\t}\n\n\t_match(ts, i, l) {\n\t\tlet t = ts[i++];\n\t\tlet c = 2;\n\t\tlet n = l.nodes ? l.nodes[t] : undefined;\n\t\twhile (c--) {\n\t\t\tif (n) {\n\t\t\t\tif (ts.length === i) {\n\t\t\t\t\tif (n.factory) {\n\t\t\t\t\t\treturn n.factory;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet f = this._match(ts, i, n);\n\t\t\t\t\tif (f) {\n\t\t\t\t\t\treturn f;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tn = l.pwc;\n\t\t}\n\t\tn = l.fwc;\n\t\treturn n && n.factory;\n\t}\n}\n\nexport default TypeList;\n","import { obj } from 'modapp-utils';\n\n/**\n * Add event data\n * @typedef {object} ResCollection~addEvent\n * @property {*} item Item being added to the collection.\n * @property {number} idx Index where item was added.\n */\n\n/**\n * Add event emitted on any item being added to the collection.\n * @callback ResCollection~addCallback\n * @param {ResCollection~addEvent} event Add event data.\n * @param {ResCollection} collection Collection emitting event.\n * @param {string} event Event name including namespace.\n * @param {?string} action Event action.\n */\n\n/**\n * Remove event data\n * @typedef {object} ResCollection~removeEvent\n * @property {*} item Item being removed from the collection.\n * @property {number} idx Index from where the item was removed.\n */\n\n/**\n * Remove event emitted on any item being added to the collection.\n * @callback ResCollection~removeCallback\n * @param {ResCollection~removeEvent} event Remove event data.\n * @param {ResCollection} collection Collection emitting event.\n * @param {string} event Event name including namespace.\n * @param {?string} action Event action.\n */\n\n/**\n * ResCollection represents a collection provided over the RES API.\n * @implements {module:modapp~Collection}\n */\nclass ResCollection {\n\n\t/**\n\t * Creates an ResCollection instance\n\t * @param {ResClient} api ResClient instance\n\t * @param {string} rid Resource id.\n\t * @param {object} [opt] Optional settings\n\t * @param {function} [opt.idCallback] Id callback function.\n\t */\n\tconstructor(api, rid, opt) {\n\t\topt = obj.copy(opt, {\n\t\t\tidCallback: { type: '?function' }\n\t\t});\n\n\t\tthis._api = api;\n\t\tthis._rid = rid;\n\t\tthis._idCallback = opt.idCallback;\n\n\t\tthis._map = this._idCallback ? {} : null;\n\t\tthis._list = null;\n\t}\n\n\t/**\n\t * ResClient instance.\n\t * @returns {ResClient} ResClient instance\n\t */\n\tgetClient() {\n\t\treturn this._api;\n\t}\n\n\t/**\n\t * Collection resource ID\n\t * @returns {string} Resource ID\n\t */\n\tgetResourceId() {\n\t\treturn this._rid;\n\t}\n\n\t/**\n\t * Length of the collection\n\t */\n\tget length() {\n\t\treturn this._list.length;\n\t}\n\n\t/**\n\t * Internal collection array. Do not mutate directly.\n\t */\n\tget list() {\n\t\treturn this._list;\n\t}\n\n\t/**\n\t * Attach a collection event handler function for one or more events.\n\t * If no event or handler is provided, the collection will still be considered listened to,\n\t * until a matching off call without arguments is made.\n\t * Available events are 'add', 'remove', and custom events.\n\t * @param {?string} [events] One or more space-separated events. Null means any event.\n\t * @param {ResCollection~addCallback|ResCollection~removeCallback|eventCallback} [handler] Handler function to execute when the event is emitted.\n\t * @returns {this}\n\t */\n\ton(events, handler) {\n\t\tthis._api.resourceOn(this._rid, events, handler);\n\t\treturn this;\n\t}\n\n\t /**\n\t * Remove a collection event handler function.\n\t * Available events are 'add', 'remove', and custom events.\n\t * @param {?string} [events] One or more space-separated events. Null means any event.\n\t * @param {ResCollection~addCallback|ResCollection~removeCallback|eventCallback} [handler] Handler function to remove.\n\t * @returns {this}\n\t */\n\toff(events, handler) {\n\t\tthis._api.resourceOff(this._rid, events, handler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get an item from the collection by id.\n\t * Requires that id callback is defined for the collection.\n\t * @param {string} id Id of the item\n\t * @returns {*} Item with the id. Undefined if key doesn't exist\n\t */\n\tget(id) {\n\t\tthis._hasId();\n\t\treturn this._map[id];\n\t}\n\n\t/**\n\t * Retrieves the order index of an item.\n\t * @param {*} item Item to find\n\t * @returns {number} Order index of the first matching item. -1 if the item doesn't exist.\n\t */\n\tindexOf(item) {\n\t\treturn this._list.indexOf(item);\n\t}\n\n\t/**\n\t * Gets an item from the collection by index position\n\t * @param {number} idx Index of the item\n\t * @returns {*} Item at the given index. Undefined if the index is out of bounds.\n\t */\n\tatIndex(idx) {\n\t\treturn this._list[idx];\n\t}\n\n\t/**\n\t * Calls a method on the collection.\n\t * @param {string} method Method name\n\t * @param {*} params Method parameters\n\t * @returns {Promise.} Promise of the call result.\n\t */\n\tcall(method, params) {\n\t\treturn this._api.call(this._rid, method, params);\n\t}\n\n\t/**\n\t * Calls an auth method on the collection.\n\t * @param {string} method Auth method name\n\t * @param {*} params Method parameters\n\t * @returns {Promise.} Promise of the auth result.\n\t */\n\tauth(method, params) {\n\t\treturn this._api.authenticate(this._rid, method, params);\n\t}\n\n\t/**\n\t * Returns a shallow clone of the internal array.\n\t * @returns {Array.<*>} Clone of internal array\n\t */\n\ttoArray() {\n\t\treturn this._list.slice();\n\t}\n\n\t/**\n\t * Initializes the collection with a data array.\n\t * Should only be called by the ResClient instance.\n\t * @param {Array.<*>} data ResCollection data array\n\t * @private\n\t */\n\t__init(data) {\n\t\tthis._list = data || [];\n\n\t\tif (this._idCallback) {\n\t\t\tthis._map = {};\n\t\t\tthis._list.forEach(v => {\n\t\t\t\tlet id = String(this._idCallback(v));\n\t\t\t\tif (this._map[id]) {\n\t\t\t\t\tthrow new Error(\"Duplicate id - \" + id);\n\t\t\t\t}\n\t\t\t\tthis._map[id] = v;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Add an item to the collection.\n\t * Should only be called by the ResClient instance.\n\t * @param {*} item Item\n\t * @param {idx} [idx] Index value of where to insert the item.\n\t * @private\n\t */\n\t__add(item, idx) {\n\t\tthis._list.splice(idx, 0, item);\n\n\t\tif (this._idCallback) {\n\t\t\tlet id = String(this._idCallback(item));\n\t\t\tif (this._map[id]) {\n\t\t\t\tthrow new Error(\"Duplicate id - \" + id);\n\t\t\t}\n\t\t\tthis._map[id] = item;\n\t\t}\n\t}\n\n\t/**\n\t * Remove an item from the collection.\n\t * Should only be called by the ResClient instance.\n\t * @param {number} idx Index of the item to remove\n\t * @returns {*} Removed item or undefined if no item was removed\n\t * @private\n\t */\n\t__remove(idx) {\n\t\tlet item = this._list[idx];\n\t\tthis._list.splice(idx, 1);\n\n\t\tif (this._idCallback) {\n\t\t\tdelete this._map[this._idCallback(item)];\n\t\t}\n\n\t\treturn item;\n\t}\n\n\t_hasId() {\n\t\tif (!this._idCallback) {\n\t\t\tthrow new Error(\"No id callback defined\");\n\t\t}\n\t}\n\n\ttoJSON() {\n\t\treturn this._list.map(v => (\n\t\t\tv !== null && typeof v === 'object' && v.toJSON\n\t\t\t\t? v.toJSON()\n\t\t\t\t: v\n\t\t));\n\t}\n\n\t[Symbol.iterator]() {\n\t\tlet i = 0,\n\t\t\ta = this._list || [],\n\t\t\tl = a.length;\n\n\t\treturn {\n\t\t\tnext: function() {\n\t\t\t\treturn { value: a[i++], done: i > l };\n\t\t\t}\n\t\t};\n\t}\n}\n\nexport default ResCollection;\n","\n// Deep equal comparison\nfunction eq(a, b) {\n\tif (a === b) return true;\n\n\tif (a && b && typeof a == 'object' && typeof b == 'object') {\n\t\tvar length, i, keys;\n\t\tif (Array.isArray(a)) {\n\t\t\tlength = a.length;\n\t\t\tif (length != b.length) return false;\n\t\t\tfor (i = length; i-- !== 0;) {\n\t\t\t\tif (!eq(a[i], b[i])) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tkeys = Object.keys(a);\n\t\tlength = keys.length;\n\t\tif (length !== Object.keys(b).length) return false;\n\n\t\tfor (i = length; i-- !== 0;)\n\t\t\tif (!b.hasOwnProperty(keys[i])) return false;\n\n\t\tfor (i = length; i-- !== 0;) {\n\t\t\tvar key = keys[i];\n\t\t\tif (!eq(a[key], b[key])) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nexport default function(a, b) {\n\treturn typeof a === 'object' && a !== null && typeof a.equals === 'function'\n\t\t? a.equals(b)\n\t\t: eq(a, b);\n};\n","import { obj } from 'modapp-utils';\nimport equal from './equal';\n\n/**\n * Change event emitted on any change to one or more public (non-underscore) properties.\n * @callback ResModel~changeCallback\n * @param {Object.} changed Changed key/value object where key is the changed property, and value is the old property value.\n * @param {Model} model ResModel emitting the event.\n * @param {string} event Event name including namespace.\n * @param {?string} action Event action.\n */\n\n/**\n * ResModel represents a model provided over the RES API.\n * @implements {module:modapp~Model}\n */\nclass ResModel {\n\n\t/**\n\t * Creates a ResModel instance\n\t * @param {ResClient} api ResClient instance\n\t * @param {string} rid Resource id.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {object} [opt.definition] Object definition. If not provided, any value will be allowed.\n\t */\n\tconstructor(api, rid, opt) {\n\t\tobj.update(this, opt, {\n\t\t\tdefinition: { type: '?object', property: '_definition' }\n\t\t});\n\n\t\tthis._rid = rid;\n\t\tthis._api = api;\n\t\tthis._props = {};\n\t}\n\n\t/**\n\t * Model properties.\n\t * @returns {object} Anonymous object with all model properties.\n\t */\n\tget props() {\n\t\treturn this._props;\n\t}\n\n\t/**\n\t * ResClient instance.\n\t * @returns {ResClient} ResClient instance\n\t */\n\tgetClient() {\n\t\treturn this._api;\n\t}\n\n\t/**\n\t * Model resource ID\n\t * @returns {string} Resource ID\n\t */\n\tgetResourceId() {\n\t\treturn this._rid;\n\t}\n\n\t/**\n\t * Attach a model event handler function for one or more events.\n\t * If no event or handler is provided, the model will still be considered listened to,\n\t * until a matching off call without arguments is made.\n\t * Available events are 'change', or custom events.\n\t * @param {?string} [events] One or more space-separated events. Null means any event.\n\t * @param {ResModel~changeCallback|eventCallback} [handler] Handler function to execute when the event is emitted.\n\t * @returns {this}\n\t */\n\ton(events, handler) {\n\t\tthis._api.resourceOn(this._rid, events, handler);\n\t\treturn this;\n\t}\n\n\t /**\n\t * Remove a model event handler function.\n\t * Available events are 'change', or custom events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {ResModel~changeCallback|eventCallback} [handler] Handler function to remove.\n\t * @returns {this}\n\t */\n\toff(events, handler) {\n\t\tthis._api.resourceOff(this._rid, events, handler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls the set method to update model properties.\n\t * @param {object} props Properties. Set value to undefined to delete a property.\n\t * @returns {Promise.} Promise of the call being completed.\n\t */\n\tset(props) {\n\t\treturn this._api.setModel(this._rid, props);\n\t}\n\n\t/**\n\t * Calls a method on the model.\n\t * @param {string} method Method name\n\t * @param {*} params Method parameters\n\t * @returns {Promise.} Promise of the call result.\n\t */\n\tcall(method, params) {\n\t\treturn this._api.call(this._rid, method, params);\n\t}\n\n\t/**\n\t * Calls an auth method on the model.\n\t * @param {string} method Auth method name\n\t * @param {*} params Method parameters\n\t * @returns {Promise.} Promise of the auth result.\n\t */\n\tauth(method, params) {\n\t\treturn this._api.authenticate(this._rid, method, params);\n\t}\n\n\t/**\n\t * Initializes the model with a data object.\n\t * Should only be called by the ResClient instance.\n\t * @param {object} data Data object\n\t * @private\n\t */\n\t__init(data) {\n\t\tthis.__update(data);\n\t}\n\n\t/**\n\t * Updates the model.\n\t * Should only be called by the ResClient instance.\n\t * @param {object} props Properties to update\n\t * @param {boolean} reset Flag that sets if missing values should be deleted.\n\t * @returns {?object} Changed properties\n\t * @private\n\t */\n\t__update(props, reset) {\n\t\tif (!props) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet changed = null;\n\t\tlet v, promote;\n\t\tlet p = this._props;\n\n\t\tif (reset) {\n\t\t\tprops = Object.assign({}, props);\n\t\t\tfor (var k in p) {\n\t\t\t\tif (!props.hasOwnProperty(k)) {\n\t\t\t\t\tprops[k] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this._definition) {\n\t\t\tchanged = obj.update(p, props, this._definition);\n\t\t\tfor (let key in changed) {\n\t\t\t\tif ((this.hasOwnProperty(key) || !this[key]) && key[0] !== '_') {\n\t\t\t\t\tv = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let key in props) {\n\t\t\t\tv = props[key];\n\t\t\t\tpromote = (this.hasOwnProperty(key) || !this[key]) && key[0] !== '_';\n\t\t\t\tif (!equal(p[key], v)) {\n\t\t\t\t\tchanged = changed || {};\n\t\t\t\t\tchanged[key] = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete p[key];\n\t\t\t\t\t\tif (promote) delete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp[key] = v;\n\t\t\t\t\t\tif (promote) this[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\ttoJSON() {\n\t\tlet o = this._definition\n\t\t\t? obj.copy(this._props, this._definition)\n\t\t\t: Object.assign({}, this._props);\n\t\tfor (let k in o) {\n\t\t\tvar v = o[k];\n\t\t\tif (typeof v === 'object' && v !== null && v.toJSON) {\n\t\t\t\to[k] = v.toJSON();\n\t\t\t}\n\t\t}\n\t\treturn o;\n\t}\n}\n\nexport default ResModel;\n","/**\n * ResError represents a RES API error.\n */\nclass ResError {\n\n\tconstructor(rid, method, params) {\n\t\tthis.rid = rid;\n\t\tif (method) {\n\t\t\tthis.method = method;\n\t\t\tthis.params = params;\n\t\t}\n\t}\n\n\t__init(err) {\n\t\tthis._code = err.code || 'system.unknownError';\n\t\tthis._message = err.message || `Unknown error`;\n\t\tthis._data = err.data;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Error code\n\t * @type {string}\n\t */\n\tget code() {\n\t\treturn this._code;\n\t}\n\n\t/**\n\t * Error message\n\t * @type {string}\n\t */\n\tget message() {\n\t\treturn this._message;\n\t}\n\n\t/**\n\t * Error data object\n\t * @type {*}\n\t */\n\tget data() {\n\t\treturn this._data;\n\t}\n\n\t/**\n\t * Error resource ID\n\t * @returns {string} Resource ID\n\t */\n\tgetResourceId() {\n\t\treturn this.rid;\n\t}\n}\n\nexport default ResError;\n","/**\n * ResRef represents a soft resource reference value.\n */\nclass ResRef {\n\n\t/**\n\t * Creates a ResRef instance\n\t * @param {ResClient} api ResClient instance\n\t * @param {string} rid Resource id.\n\t */\n\tconstructor(api, rid) {\n\t\tthis._rid = rid;\n\t\tthis._api = api;\n\t}\n\n\t/**\n\t * Referenced resource ID.\n\t * @returns {string} Resource ID.\n\t */\n\tget rid() {\n\t\treturn this._rid;\n\t}\n\n\t/**\n\t * Get referenced resource.\n\t * @return {Promise.<(ResModel|ResCollection)>} Promise of the resource.\n\t */\n\tget() {\n\t\treturn this._api.get(this._rid);\n\t}\n\n\t/**\n\t * Tests if another ResRef object is equivalent to this instance.\n\t * @param {*} o Value to test equality against.\n\t * @returns {boolean} True if equal, otherwise false.\n\t */\n\tequals(o) {\n\t\treturn o instanceof ResRef && o._api === this._api && o._rid === this._rid;\n\t}\n\n\ttoJSON() {\n\t\treturn { \"rid\": this._rid };\n\t}\n}\n\nexport default ResRef;\n","\nimport eventBus from 'modapp-eventbus';\nimport { obj } from 'modapp-utils';\nimport CacheItem from './CacheItem';\nimport TypeList from './TypeList';\nimport ResCollection from './ResCollection';\nimport ResModel from './ResModel';\nimport ResError from './ResError';\nimport ResRef from './ResRef';\nimport equal from './equal';\n\nconst defaultModelFactory = function(api, rid) {\n\treturn new ResModel(api, rid);\n};\nconst defaultCollectionFactory = function(api, rid) {\n\treturn new ResCollection(api, rid);\n};\nconst errorFactory = function(api, rid) {\n\treturn new ResError(rid);\n};\n\nconst versionToInt = function(version) {\n\tif (!version) return 0;\n\tlet p = version.split('.');\n\tlet v = 0;\n\tfor (let i = 0; i < 3; i++) {\n\t\tv = v * 1000 + Number(p[i]);\n\t}\n\treturn v;\n};\n\nconst getRID = function(v) {\n\treturn v !== null && typeof v === 'object' && typeof v.getResourceId === 'function' ? v.getResourceId() : null;\n};\n\n// Resource types\nconst typeCollection = 'collection';\nconst typeModel = 'model';\nconst typeError = 'error';\nconst resourceTypes = [ typeModel, typeCollection, typeError ];\n// Actions\nconst actionDelete = { action: 'delete' };\n// Default settings\nconst defaultNamespace = 'resclient';\nconst defaultReconnectDelay = 3000;\nconst defaultSubscribeStaleDelay = 2000;\nconst defaultSubscribeRetryDelay = 10000;\nconst defaultUnsubscribeDelay = 5000;\n// Traverse states\nconst stateNone = 0;\nconst stateDelete = 1;\nconst stateKeep = 2;\nconst stateStale = 3;\n// RES Protocol version\nconst supportedProtocol = \"1.2.1\";\nconst legacyProtocol = versionToInt(\"1.1.1\");\nconst v1_2_1 = versionToInt(\"1.2.1\");\n\n/**\n * Connect event emitted on connect.\n * @callback ResClient~connectCallback\n * @param {object} event WebSocket open event object\n */\n\n/**\n * Disconnect event emitted on disconnect.\n * @callback ResClient~disconnectCallback\n * @param {object} event WebSocket close event object\n */\n\n/**\n * Error event emitted on error.\n * @callback ResClient~errorCallback\n * @param {ResError} err ResError object\n */\n\n/**\n * WebSocket factory function.\n * @callback ResClient~websocketFactory\n * @returns {WebSocket} WebSocket instance implementing the [WebSocket API]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebSocket}.\n */\n\n/**\n * OnConnect callback function.\n * @callback ResClient~onConnectCallback\n * @param {ResClient} ResClient instance\n * @returns {?Promise} Promise for the onConnect handlers completion. Must always resolve.\n */\n\n/**\n * ResClient represents a client connection to a RES API.\n */\nclass ResClient {\n\n\t/**\n\t * Creates a ResClient instance\n\t * @param {string|ResClient~websocketFactory} hostUrlOrFactory Websocket host path, or websocket factory function. Path may be relative to current path.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {function} [opt.onConnect] On connect callback called prior resolving the connect promise and subscribing to stale resources. May return a promise.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'resclient'.\n\t * @param {bool} [opt.reconnectDelay] Milliseconds between WebSocket reconnect attempts. Defaults to 3000.\n\t * @param {bool} [opt.subscribeStaleDelay] Milliseconds until a subscribe attempt is made on a stale resource. Zero means no attempt to subscribe. Defaults to 2000.\n\t * @param {bool} [opt.subscribeRetryDelay] Milliseconds between subscribe attempts on a stale resource after a failed stale subscribe. Zero means no retries. Defaults to 10000.\n\t * @param {bool} [opt.unsubscribeDelay] Milliseconds between stopping listening to a resource, and the resource being unsubscribed. Defaults to 5000.\n\t * @param {bool} [opt.debug] Flag to debug log all WebSocket communication. Defaults to false.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(hostUrlOrFactory, opt) {\n\t\tthis.hostUrl = null;\n\t\tif (typeof hostUrlOrFactory == 'function') {\n\t\t\tthis.wsFactory = hostUrlOrFactory;\n\t\t} else {\n\t\t\tthis.hostUrl = this._resolvePath(hostUrlOrFactory);\n\t\t\tthis.wsFactory = () => new WebSocket(this.hostUrl);\n\t\t}\n\t\tobj.update(this, opt, {\n\t\t\tonConnect: { type: '?function' },\n\t\t\tnamespace: { type: 'string', default: defaultNamespace },\n\t\t\treconnectDelay: { type: 'number', default: defaultReconnectDelay },\n\t\t\tsubscribeStaleDelay: { type: 'number', default: defaultSubscribeStaleDelay },\n\t\t\tsubscribeRetryDelay: { type: 'number', default: defaultSubscribeRetryDelay },\n\t\t\tunsubscribeDelay: { type: 'number', default: defaultUnsubscribeDelay },\n\t\t\tdebug: { type: 'boolean', default: false },\n\t\t\teventBus: { type: 'object', default: eventBus }\n\t\t});\n\n\t\tthis.tryConnect = false;\n\t\tthis.connected = false;\n\t\tthis.ws = null;\n\t\tthis.requests = {};\n\t\tthis.reqId = 1; // Incremental request id\n\t\tthis.cache = {};\n\t\tthis.stale = null;\n\n\t\t// Queue promises\n\t\tthis.connectPromise = null;\n\t\tthis.connectCallback = null;\n\n\t\t// Types\n\t\tthis.types = {\n\t\t\tmodel: {\n\t\t\t\tid: typeModel,\n\t\t\t\tlist: new TypeList(defaultModelFactory),\n\t\t\t\tprepareData: dta => {\n\t\t\t\t\tlet o = {};\n\t\t\t\t\tfor (let k in dta) {\n\t\t\t\t\t\to[k] = this._prepareValue(dta[k], true);\n\t\t\t\t\t}\n\t\t\t\t\treturn o;\n\t\t\t\t},\n\t\t\t\tgetFactory: function(rid) { return this.list.getFactory(rid); },\n\t\t\t\tsynchronize: this._syncModel.bind(this)\n\t\t\t},\n\t\t\tcollection: {\n\t\t\t\tid: typeCollection,\n\t\t\t\tlist: new TypeList(defaultCollectionFactory),\n\t\t\t\tprepareData: dta => dta.map(v => this._prepareValue(v, true)),\n\t\t\t\tgetFactory: function(rid) { return this.list.getFactory(rid); },\n\t\t\t\tsynchronize: this._syncCollection.bind(this)\n\t\t\t},\n\t\t\terror: {\n\t\t\t\tid: typeError,\n\t\t\t\tprepareData: dta => dta,\n\t\t\t\tgetFactory: rid => errorFactory,\n\t\t\t\tsynchronize: () => {}\n\t\t\t}\n\t\t};\n\n\t\t// Bind callbacks\n\t\tthis._handleOnopen = this._handleOnopen.bind(this);\n\t\tthis._handleOnerror = this._handleOnerror.bind(this);\n\t\tthis._handleOnmessage = this._handleOnmessage.bind(this);\n\t\tthis._handleOnclose = this._handleOnclose.bind(this);\n\t\tthis._unsubscribe = this._unsubscribe.bind(this);\n\t}\n\n\t/**\n\t * RES protocol level supported by this client version.\n\t * @returns {string} Supported RES protocol version.\n\t */\n\tget supportedProtocol() {\n\t\treturn supportedProtocol;\n\t}\n\n\t/**\n\t * Connects the instance to the server.\n\t * Can be called even if a connection is already established.\n\t * @returns {Promise} A promise to the established connection.\n\t */\n\tconnect() {\n\t\tthis.tryConnect = true;\n\t\tif (!this.connectPromise) {\n\t\t\tthis.connectPromise = new Promise((resolve, reject) => {\n\t\t\t\tthis.connectCallback = { resolve, reject };\n\t\t\t\tthis.ws = this.wsFactory();\n\n\t\t\t\tthis.ws.onopen = this._handleOnopen;\n\t\t\t\tthis.ws.onerror = this._handleOnerror;\n\t\t\t\tthis.ws.onmessage = this._handleOnmessage;\n\t\t\t\tthis.ws.onclose = this._handleOnclose;\n\t\t\t});\n\t\t\tthis.connectPromise.catch(err => this._emit('connectError', err));\n\t\t}\n\n\t\treturn this.connectPromise;\n\t}\n\n\t/**\n\t * Disconnects any current connection and stops attempts\n\t * of reconnecting.\n\t */\n\tdisconnect() {\n\t\tthis.tryConnect = false;\n\n\t\tif (this.ws) {\n\t\t\tlet ws = this.ws;\n\t\t\tlet err = { code: 'system.disconnect', message: \"Disconnect called\" };\n\t\t\tws.onclose = null;\n\t\t\tthis._handleOnclose(err);\n\t\t\tws.close();\n\t\t\tthis._connectReject(err);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the host URL to the RES API\n\t * @returns {string} Host URL\n\t */\n\tgetHostUrl() {\n\t\treturn this.hostUrl;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more instance events.\n\t * Available events are 'connect', 'disconnect', and 'error'.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {ResClient~connectCallback|ResClient~disconnectCallback|ResClient~errorCallback} handler Handler function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis.eventBus.on(this, events, handler, this.namespace);\n\t}\n\n\t/**\n\t * Remove an instance event handler.\n\t * Available events are 'connect', 'disconnect', and 'error'.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {ResClient~connectCallback|ResClient~disconnectCallback|ResClient~errorCallback} [handler] Handler function to remove.\n\t */\n\toff(events, handler) {\n\t\tthis.eventBus.off(this, events, handler, this.namespace);\n\t}\n\n\t/**\n\t * Sets the onConnect callback.\n\t * @param {?ResClient~onConnectCallback} onConnect On connect callback called prior resolving the connect promise and subscribing to stale resources. May return a promise.\n\t * @returns {this}\n\t */\n\tsetOnConnect(onConnect) {\n\t\tthis.onConnect = onConnect;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Model factory callback\n\t * @callback ResClient~modelFactory\n\t * @param {ResClient} api ResClient instance\n\t * @param {string} rid Resource ID\n\t * @returns {ResModel} Model instance object.\n\t */\n\n\t/**\n\t * Register a model type.\n\t * The pattern may use the following wild cards:\n\t * * The asterisk (*) matches any part at any level of the resource name.\n\t * * The greater than symbol (>) matches one or more parts at the end of a resource name, and must be the last part.\n\t * @param {string} pattern Pattern of the model type.\n\t * @param {ResClient~modelFactory} factory Model factory callback\n\t * @returns {this}\n\t */\n\tregisterModelType(pattern, factory) {\n\t\tthis.types.model.list.addFactory(pattern, factory);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unregister a previously registered model type pattern.\n\t * @param {string} pattern Pattern of the model type.\n\t * @returns {ResClient~modelFactory} Unregistered model factory callback\n\t */\n\tunregisterModelType(pattern) {\n\t\treturn this.types.model.list.removeFactory(pattern);\n\t}\n\n\t/**\n\t * Collection factory callback\n\t * @callback ResClient~collectionFactory\n\t * @param {ResClient} api ResClient instance\n\t * @param {string} rid Resource ID\n\t * @returns {ResCollection} Collection instance object.\n\t */\n\n\t/**\n\t * Register a collection type.\n\t * The pattern may use the following wild cards:\n\t * * The asterisk (*) matches any part at any level of the resource name.\n\t * * The greater than symbol (>) matches one or more parts at the end of a resource name, and must be the last part.\n\t * @param {string} pattern Pattern of the collection type.\n\t * @param {ResClient~collectionFactory} factory Collection factory callback\n\t * @returns {this}\n\t */\n\tregisterCollectionType(pattern, factory) {\n\t\tthis.types.collection.list.addFactory(pattern, factory);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unregister a previously registered collection type pattern.\n\t * @param {string} pattern Pattern of the collection type.\n\t * @returns {ResClient~collectionFactory} Unregistered collection factory callback\n\t */\n\tunregisterCollectionType(pattern) {\n\t\treturn this.types.collection.list.removeFactory(pattern);\n\t}\n\n\t/**\n\t * Get a resource from the API\n\t * @param {string} rid Resource ID\n\t * @param {function} [collectionFactory] Collection factory function.\n\t * @return {Promise.<(ResModel|ResCollection)>} Promise of the resource.\n\t */\n\tget(rid) {\n\t\t// Check for resource in cache\n\t\tlet ci = this.cache[rid];\n\t\tif (ci) {\n\t\t\tif (ci.promise) {\n\t\t\t\treturn ci.promise;\n\t\t\t}\n\t\t\tci.resetTimeout();\n\t\t\treturn Promise.resolve(ci.item);\n\t\t}\n\n\t\tci = new CacheItem(rid, this._unsubscribe);\n\t\tthis.cache[rid] = ci;\n\n\t\treturn ci.setPromise(\n\t\t\tthis._subscribe(ci, true).then(() => ci.item)\n\t\t);\n\t}\n\n\t/**\n\t * Calls a method on a resource.\n\t * @param {string} rid Resource ID.\n\t * @param {string} method Method name\n\t * @param {*} params Method parameters\n\t * @returns {Promise.} Promise of the call result.\n\t */\n\tcall(rid, method, params) {\n\t\treturn this._call('call', rid, method, params);\n\t}\n\n\t/**\n\t * Invokes a authentication method on a resource.\n\t * @param {string} rid Resource ID.\n\t * @param {string} method Method name\n\t * @param {*} params Method parameters\n\t * @returns {Promise.} Promise of the authentication result.\n\t */\n\tauthenticate(rid, method, params) {\n\t\treturn this._call('auth', rid, method, params);\n\t}\n\n\t/**\n\t * Creates a new resource by calling the 'new' method. \n\t * Use call with 'new' as method parameter instead.\n\t * @param {*} rid Resource ID\n\t * @param {*} params Method parameters\n\t * @return {Promise.<(ResModel|ResCollection)>} Promise of the resource.\n\t * @deprecated since version 2.1.0. Use call with 'new' as method parameter instead.\n\t */\n\tcreate(rid, params) {\n\t\treturn this._send('new', rid, null, params)\n\t\t\t.then(result => {\n\t\t\t\tthis._cacheResources(result);\n\t\t\t\tlet ci = this.cache[result.rid];\n\t\t\t\tci.addSubscribed(1);\n\t\t\t\treturn ci.item;\n\t\t\t});\n\t}\n\n\t/**\n\t * Calls the set method to update model properties.\n\t * @param {string} modelId Model resource ID.\n\t * @param {object} props Properties. Set value to undefined to delete a property.\n\t * @returns {Promise.} Promise of the call being completed.\n\t */\n\tsetModel(modelId, props) {\n\t\tprops = Object.assign({}, props);\n\t\t// Replace undefined with actionDelete object\n\t\tObject.keys(props).forEach(k => {\n\t\t\tif (props[k] === undefined) {\n\t\t\t\tprops[k] = actionDelete;\n\t\t\t}\n\t\t});\n\n\t\treturn this._send('call', modelId, 'set', props);\n\t}\n\n\tresourceOn(rid, events, handler) {\n\t\tlet cacheItem = this.cache[rid];\n\t\tif (!cacheItem) {\n\t\t\tthrow new Error(\"Resource \" + rid + \" not found in cache\");\n\t\t}\n\n\t\tthis.eventBus.on(cacheItem.item, events, handler, this.namespace + '.resource.' + rid);\n\n\t\tcacheItem.addDirect();\n\t}\n\n\tresourceOff(rid, events, handler) {\n\t\tlet cacheItem = this.cache[rid];\n\t\tif (!cacheItem) {\n\t\t\tthrow new Error(\"Resource \" + rid + \" not found in cache\");\n\t\t}\n\n\t\tthis.eventBus.off(cacheItem.item, events, handler, this.namespace + '.resource.' + rid, true);\n\n\t\tcacheItem.removeDirect();\n\t}\n\n\t/**\n\t * Sends a JsonRpc call to the API\n\t * @param {string} action Action name\n\t * @param {string} rid Resource ID\n\t * @param {?string} method Optional method name\n\t * @param {?object} params Optional parameters\n\t * @returns {Promise.} Promise to the response\n\t * @private\n\t */\n\t_send(action, rid, method, params) {\n\t\tif (!rid) {\n\t\t\tthrow new Error(\"Invalid resource ID\");\n\t\t}\n\n\t\tif (method === \"\") {\n\t\t\tthrow new Error(\"Invalid method\");\n\t\t}\n\n\t\tlet m = action + '.' + rid + (method ? '.' + method : '');\n\n\t\treturn this.connected\n\t\t\t? this._sendNow(m, params)\n\t\t\t: this.connect()\n\t\t\t\t.catch(e => { throw new ResError(rid, m, params).__init(e); })\n\t\t\t\t.then(() => this._sendNow(m, params));\n\t}\n\n\t_sendNow(method, params) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t// Prepare request object\n\t\t\tvar req = { id: this.reqId++, method: method, params: params || undefined };\n\n\t\t\tthis.requests[req.id] = {\n\t\t\t\tmethod: method,\n\t\t\t\tparams: req.params,\n\t\t\t\tresolve: resolve,\n\t\t\t\treject: reject\n\t\t\t};\n\n\t\t\tvar json = JSON.stringify(req);\n\t\t\tif (this.debug) {\n\t\t\t\tconsole.debug(\"<== \" + req.id + \":\" + json);\n\t\t\t}\n\t\t\tthis.ws.send(json);\n\t\t});\n\t}\n\n\t/**\n\t * Receives a incoming json encoded data string and executes the appropriate functions/callbacks.\n\t * @param {string} json Json encoded data\n\t * @private\n\t */\n\t_receive(json) {\n\t\tlet data = JSON.parse(json.trim());\n\n\t\tif (data.hasOwnProperty('id')) {\n\t\t\tif (this.debug) {\n\t\t\t\tconsole.debug(\"==> \" + data.id + \":\" + json);\n\t\t\t}\n\n\t\t\t// Find the stored request\n\t\t\tlet req = this.requests[data.id];\n\t\t\tif (!req) {\n\t\t\t\tthrow new Error(\"Server response without matching request\");\n\t\t\t}\n\n\t\t\tdelete this.requests[data.id];\n\n\t\t\tif (data.hasOwnProperty(\"error\")) {\n\t\t\t\tthis._handleErrorResponse(req, data);\n\t\t\t} else {\n\t\t\t\tthis._handleSuccessResponse(req, data);\n\t\t\t}\n\t\t} else if (data.hasOwnProperty('event')) {\n\t\t\tif (this.debug) {\n\t\t\t\tconsole.debug(\"--> \" + json);\n\t\t\t}\n\t\t\tthis._handleEvent(data);\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid message from server: \" + json);\n\t\t}\n\t}\n\n\t_call(type, rid, method, params) {\n\t\treturn this._send(type, rid, method || '', params)\n\t\t\t.then(result => {\n\t\t\t\t// Legacy v1.1.1 behavior\n\t\t\t\tif (this.protocol <= legacyProtocol) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tif (result.rid) {\n\t\t\t\t\tthis._cacheResources(result);\n\t\t\t\t\tlet ci = this.cache[result.rid];\n\t\t\t\t\tci.addSubscribed(1);\n\t\t\t\t\treturn ci.item;\n\t\t\t\t}\n\t\t\t\treturn result.payload;\n\t\t\t});\n\t}\n\n\t_handleErrorResponse(req, data) {\n\t\tlet m = req.method;\n\t\t// Extract the rid if possible\n\t\tlet rid = \"\";\n\t\tlet i = m.indexOf('.');\n\t\tif (i >= 0) {\n\t\t\trid = m.substr(i + 1);\n\t\t\tlet a = m.substr(0, i);\n\t\t\tif (a === 'call' || a === 'auth') {\n\t\t\t\ti = rid.lastIndexOf('.');\n\t\t\t\tif (i >= 0) {\n\t\t\t\t\trid = rid.substr(0, i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlet err = new ResError(\n\t\t\trid.trim(),\n\t\t\tm,\n\t\t\treq.params\n\t\t);\n\t\terr.__init(data.error);\n\t\ttry {\n\t\t\tthis._emit('error', err);\n\t\t} catch (ex) {}\n\n\t\t// Execute error callback bound to calling object\n\t\treq.reject(err);\n\t}\n\n\t_handleSuccessResponse(req, data) {\n\t\t// Execute success callback bound to calling object\n\t\treq.resolve(data.result);\n\t}\n\n\t_handleEvent(data) {\n\t\t// Event\n\t\tlet idx = data.event.lastIndexOf('.');\n\t\tif (idx < 0 || idx === data.event.length - 1) {\n\t\t\tthrow new Error(\"Malformed event name: \" + data.event);\n\t\t}\n\n\t\tlet rid = data.event.substr(0, idx);\n\n\t\tlet cacheItem = this.cache[rid];\n\t\tif (!cacheItem) {\n\t\t\tthrow new Error(\"Resource not found in cache\");\n\t\t}\n\n\t\tlet event = data.event.substr(idx + 1);\n\t\tlet handled = false;\n\t\tswitch (event) {\n\t\tcase 'change':\n\t\t\thandled = this._handleChangeEvent(cacheItem, event, data.data, false);\n\t\t\tbreak;\n\n\t\tcase 'add':\n\t\t\thandled = this._handleAddEvent(cacheItem, event, data.data);\n\t\t\tbreak;\n\n\t\tcase 'remove':\n\t\t\thandled = this._handleRemoveEvent(cacheItem, event, data.data);\n\t\t\tbreak;\n\n\t\tcase 'unsubscribe':\n\t\t\thandled = this._handleUnsubscribeEvent(cacheItem);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!handled) {\n\t\t\tthis.eventBus.emit(cacheItem.item, this.namespace + '.resource.' + rid + '.' + event, data.data);\n\t\t}\n\t}\n\n\t_handleChangeEvent(cacheItem, event, data, reset) {\n\t\tif (cacheItem.type !== typeModel) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._cacheResources(data);\n\n\t\t// Set deleted properties to undefined\n\t\tlet item = cacheItem.item;\n\t\tlet rid;\n\t\tlet vals = data.values;\n\t\tfor (let k in vals) {\n\t\t\tvals[k] = this._prepareValue(vals[k]);\n\t\t}\n\n\t\t// Update the model with new values\n\t\tlet changed = item.__update(vals, reset);\n\t\tif (!changed) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Used changed object to determine which resource references has been\n\t\t// added or removed.\n\t\tlet ind = {};\n\t\tfor (let k in changed) {\n\t\t\tif ((rid = getRID(changed[k]))) {\n\t\t\t\tind[rid] = (ind[rid] || 0) - 1;\n\t\t\t}\n\t\t\tif ((rid = getRID(vals[k]))) {\n\t\t\t\tind[rid] = (ind[rid] || 0) + 1;\n\t\t\t}\n\t\t}\n\n\t\t// Remove indirect reference to resources no longer referenced in the\n\t\t// model\n\t\tfor (rid in ind) {\n\t\t\tlet d = ind[rid];\n\t\t\tlet ci = this.cache[rid];\n\t\t\tci.addIndirect(d);\n\t\t\tif (d < 0) {\n\t\t\t\tthis._tryDelete(ci);\n\t\t\t}\n\t\t}\n\n\t\tthis.eventBus.emit(cacheItem.item, this.namespace + '.resource.' + cacheItem.rid + '.' + event, changed);\n\t\treturn true;\n\t}\n\n\t_handleAddEvent(ci, event, data) {\n\t\tif (ci.type !== typeCollection) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._cacheResources(data);\n\t\tlet v = this._prepareValue(data.value, true);\n\t\tlet idx = data.idx;\n\n\t\tci.item.__add(v, idx);\n\t\tthis.eventBus.emit(ci.item, this.namespace + '.resource.' + ci.rid + '.' + event, { item: v, idx });\n\t\treturn true;\n\t}\n\n\t_handleRemoveEvent(ci, event, data) {\n\t\tif (ci.type !== typeCollection) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet idx = data.idx;\n\t\tlet item = ci.item.__remove(idx);\n\t\tthis.eventBus.emit(ci.item, this.namespace + '.resource.' + ci.rid + '.' + event, { item, idx });\n\n\t\tlet rid = getRID(item);\n\t\tif (rid) {\n\t\t\tlet refItem = this.cache[rid];\n\t\t\tif (!refItem) {\n\t\t\t\tthrow new Error(\"Removed model is not in cache\");\n\t\t\t}\n\n\t\t\trefItem.addIndirect(-1);\n\t\t\tthis._tryDelete(refItem);\n\t\t}\n\t\treturn true;\n\t}\n\n\t_handleUnsubscribeEvent(ci) {\n\t\tci.addSubscribed(0);\n\t\tthis._tryDelete(ci);\n\t\tthis.eventBus.emit(ci.item, this.namespace + '.resource.' + ci.rid + '.unsubscribe', { item: ci.item });\n\t\treturn true;\n\t}\n\n\t_setStale(rid, isRetry) {\n\t\t// Only try subscribing if not already marked as stale.\n\t\tif (this._addStale(rid)) {\n\t\t\tlet delay = isRetry ? this.subscribeRetryDelay : this.subscribeStaleDelay;\n\t\t\tif (this.connected && delay) {\n\t\t\t\tsetTimeout(() => this._subscribeToStale(rid), delay);\n\t\t\t}\n\t\t}\n\t}\n\n\t_addStale(rid) {\n\t\tif (!this.stale) {\n\t\t\tthis.stale = {};\n\t\t}\n\t\tif (this.stale[rid]) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.stale[rid] = true;\n\t\treturn true;\n\t}\n\n\t_removeStale(rid) {\n\t\tif (this.stale) {\n\t\t\tdelete this.stale[rid];\n\t\t\tfor (let k in this.stale) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.stale = null;\n\t\t}\n\t}\n\n\t_subscribe(ci, throwError, isRetry) {\n\t\tlet rid = ci.rid;\n\t\tci.addSubscribed(1);\n\t\tthis._removeStale(rid);\n\t\treturn this._send('subscribe', rid)\n\t\t\t.then(response => this._cacheResources(response))\n\t\t\t.catch(err => {\n\t\t\t\tif (throwError) {\n\t\t\t\t\tthis._handleFailedSubscribe(ci, isRetry);\n\t\t\t\t\tthrow err;\n\t\t\t\t} else {\n\t\t\t\t\tthis._handleUnsubscribeEvent(ci);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_subscribeToStale(rid) {\n\t\tif (!this.connected || !this.stale || !this.stale[rid]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._subscribe(this.cache[rid], true, true).catch(err => {});\n\t}\n\n\t_subscribeToAllStale() {\n\t\tif (!this.stale) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let rid in this.stale) {\n\t\t\tthis._subscribeToStale(rid);\n\t\t}\n\t}\n\n\t/**\n\t * Handles the websocket onopen event\n\t * @param {object} e Open event object\n\t * @private\n\t */\n\t_handleOnopen(e) {\n\t\tif (this.debug) {\n\t\t\tconsole.debug(\"ResClient open\", e, this);\n\t\t}\n\t\tthis._sendNow('version', { protocol: this.supportedProtocol })\n\t\t\t.then(ver => {\n\t\t\t\tthis.protocol = versionToInt(ver.protocol) || legacyProtocol;\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\t// Invalid error means the gateway doesn't support\n\t\t\t\t// version requests. Default to legacy protocol.\n\t\t\t\tif (err.code && err.code == 'system.invalidRequest') {\n\t\t\t\t\tthis.protocol = legacyProtocol;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow err;\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\tif (this.onConnect) {\n\t\t\t\t\tthis.connected = true;\n\t\t\t\t\tlet promise = this.onConnect(this);\n\t\t\t\t\tthis.connected = false;\n\t\t\t\t\treturn promise;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\tthis.connected = true;\n\t\t\t\tthis._subscribeToAllStale();\n\t\t\t\tthis._emit('connect', e);\n\t\t\t\tthis._connectResolve();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tif (this.ws) {\n\t\t\t\t\tthis.ws.close();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/**\n\t * Handles the websocket onerror event\n\t * @param {object} e Error event object\n\t * @private\n\t */\n\t_handleOnerror(e) {\n\t\tif (this.debug) {\n\t\t\tconsole.debug(\"ResClient error\", e, this);\n\t\t}\n\t\tthis._connectReject({ code: 'system.connectionError', message: \"Connection error\", data: e });\n\t}\n\n\t/**\n\t * Handles the websocket onmessage event\n\t * @param {object} e Message event object\n\t * @private\n\t */\n\t_handleOnmessage(e) {\n\t\tthis._receive(e.data);\n\t}\n\n\t/**\n\t * Handles the websocket onclose event\n\t * @param {object} e Close event object\n\t * @private\n\t */\n\t_handleOnclose(e) {\n\t\tif (this.debug) {\n\t\t\tconsole.debug(\"ResClient close\", e, this);\n\t\t}\n\t\tthis.connectPromise = null;\n\t\tthis.ws = null;\n\t\tlet wasConnected = this.connected;\n\t\tif (this.connected) {\n\t\t\tthis.connected = false;\n\n\t\t\t// Set any subscribed item in cache to stale\n\t\t\tfor (let rid in this.cache) {\n\t\t\t\tlet ci = this.cache[rid];\n\t\t\t\tif (ci.subscribed) {\n\t\t\t\t\tci.addSubscribed(0);\n\t\t\t\t\tthis._addStale(rid);\n\t\t\t\t\tthis._tryDelete(ci);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._emit('disconnect', e);\n\t\t}\n\n\t\tlet hasStale = false;\n\t\tfor (let _ in this.cache) { // eslint-disable-line no-unused-vars\n\t\t\thasStale = true;\n\t\t\tbreak;\n\t\t}\n\n\t\tthis.tryConnect = hasStale && this.tryConnect;\n\n\t\tif (this.tryConnect) {\n\t\t\tthis._reconnect(wasConnected);\n\t\t}\n\t}\n\n\t/**\n\t * Resolves the connection promise\n\t * @private\n\t */\n\t_connectResolve() {\n\t\tif (this.connectCallback) {\n\t\t\tthis.connectCallback.resolve();\n\t\t\tthis.connectCallback = null;\n\t\t}\n\t}\n\n\t/**\n\t * Rejects the connection promise\n\t * @param {*} e Error event\n\t * @private\n\t */\n\t_connectReject(e) {\n\t\tthis.connectPromise = null;\n\t\tthis.ws = null;\n\n\t\tif (this.connectCallback) {\n\t\t\tthis.connectCallback.reject(e);\n\t\t\tthis.connectCallback = null;\n\t\t}\n\t}\n\n\t_emit(event, data) {\n\t\tthis.eventBus.emit(this, event, data, this.namespace);\n\t}\n\n\t/**\n\t * Tries to delete the cached item.\n\t * It will delete if there are no direct listeners, indirect references, or any subscription.\n\t * @param {object} ci Cache item to delete\n\t * @param {boolean} isRetry Flag to tell if call is made as part of a stale subscribe attempt.\n\t * @private\n\t */\n\t_tryDelete(ci, isRetry) {\n\t\tlet refs = this._getRefState(ci);\n\n\t\tfor (let rid in refs) {\n\t\t\tlet r = refs[rid];\n\t\t\tswitch (r.st) {\n\t\t\tcase stateStale:\n\t\t\t\tthis._setStale(rid, isRetry);\n\t\t\t\tbreak;\n\t\t\tcase stateDelete:\n\t\t\t\tthis._deleteRef(r.ci);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Reference State object\n\t * @typedef {object} RefState\n\t * @property {CacheItem} ci Cache item\n\t * @property {Number} rc Reference count from external references.\n\t * @property {Number} st State. Is either stateDelete, stateKeep, or stateStale.\n\t * @private\n\t */\n\n\t/**\n\t * Gets the reference state for a cacheItem and all its references\n\t * if the cacheItem was to be removed.\n\t * @param {CacheItem} ci Cache item\n\t * @return {Object.} A key value object with key being the rid, and value being a RefState array.\n\t * @private\n\t */\n\t_getRefState(ci) {\n\t\tlet refs = {};\n\t\t// Quick exit\n\t\tif (ci.subscribed) {\n\t\t\treturn refs;\n\t\t}\n\t\trefs[ci.rid] = { ci, rc: ci.indirect, st: stateNone };\n\t\tthis._traverse(ci, this._seekRefs.bind(this, refs), 0, true);\n\t\tthis._traverse(ci, this._markDelete.bind(this, refs), stateDelete);\n\t\treturn refs;\n\t}\n\n\t/**\n\t * Seeks for resources that no longer has any reference and may\n\t * be deleted.\n\t * Callback used with _traverse.\n\t * @param {*} refs References\n\t * @param {*} ci Cache item\n\t * @param {*} state State as returned from parent's traverse callback\n\t * @returns {*} State to pass to children. False means no traversing to children.\n\t * @private\n\t */\n\t_seekRefs(refs, ci, state) {\n\t\t// Quick exit if it is already subscribed\n\t\tif (ci.subscribed) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet rid = ci.rid;\n\t\tlet r = refs[rid];\n\t\tif (r) {\n\t\t\tr.rc--;\n\t\t\treturn false;\n\t\t}\n\n\t\trefs[rid] = { ci, rc: ci.indirect - 1, st: stateNone };\n\t\treturn true;\n\t}\n\n\t/**\n\t * Marks reference as stateDelete, stateKeep, or stateStale, depending on\n\t * the values returned from a _seekRefs traverse.\n\t * @param {*} refs References\n\t * @param {*} ci Cache item\n\t * @param {*} state State as returned from parent's traverse callback\n\t * @return {*} State to pass to children. False means no traversing to children.\n\t * @private\n\t */\n\t_markDelete(refs, ci, state) {\n\t\t// Quick exit if it is already subscribed\n\t\tif (ci.subscribed) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet rid = ci.rid;\n\t\tlet r = refs[rid];\n\n\t\tif (r.st === stateKeep) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (state === stateDelete) {\n\n\t\t\tif (r.rc > 0) {\n\t\t\t\tr.st = stateKeep;\n\t\t\t\treturn rid;\n\t\t\t}\n\n\t\t\tif (r.st !== stateNone) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (r.ci.direct) {\n\t\t\t\tr.st = stateStale;\n\t\t\t\treturn rid;\n\t\t\t}\n\n\t\t\tr.st = stateDelete;\n\t\t\treturn stateDelete;\n\t\t}\n\n\t\t// A stale item can never cover itself\n\t\tif (rid === state) {\n\t\t\treturn false;\n\t\t}\n\n\t\tr.st = stateKeep;\n\t\treturn r.rc > 0 ? rid : state;\n\t}\n\n\t_deleteRef(ci) {\n\t\tlet item = ci.item, ri;\n\t\tswitch (ci.type) {\n\t\tcase typeCollection:\n\t\t\tfor (let v of item) {\n\t\t\t\tri = this._getRefItem(v);\n\t\t\t\tif (ri) {\n\t\t\t\t\tri.addIndirect(-1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase typeModel:\n\t\t\tfor (let k in item) {\n\t\t\t\tif (item.hasOwnProperty(k)) {\n\t\t\t\t\tri = this._getRefItem(item[k]);\n\t\t\t\t\tif (ri) {\n\t\t\t\t\t\tri.addIndirect(-1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.debug(\"Cache delete: \" + ci.rid);\n\t\t}\n\t\tdelete this.cache[ci.rid];\n\t\tthis._removeStale(ci.rid);\n\t}\n\n\t_getRefItem(v) {\n\t\tlet rid = getRID(v);\n\t\tif (!rid) {\n\t\t\treturn null;\n\t\t}\n\t\tlet refItem = this.cache[rid];\n\t\t// refItem not in cache means\n\t\t// item has been deleted as part of\n\t\t// a refState object.\n\t\tif (!refItem) {\n\t\t\treturn null;\n\t\t}\n\t\treturn refItem;\n\t}\n\n\t_cacheResources(r) {\n\t\tif (!r || !(r.models || r.collections || r.errors)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet sync = {};\n\t\tresourceTypes.forEach(t => (sync[t] = this._createItems(r[t + 's'], this.types[t])));\n\t\tresourceTypes.forEach(t => this._initItems(r[t + 's'], this.types[t]));\n\t\tresourceTypes.forEach(t => this._syncItems(sync[t], this.types[t]));\n\t}\n\n\t_createItems(refs, type) {\n\t\tif (!refs) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet sync;\n\t\tfor (let rid in refs) {\n\t\t\tlet ci = this.cache[rid];\n\t\t\tif (!ci) {\n\t\t\t\tci = this.cache[rid] = new CacheItem(\n\t\t\t\t\trid,\n\t\t\t\t\tthis._unsubscribe\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Remove item as stale if needed\n\t\t\t\tthis._removeStale(rid);\n\t\t\t}\n\t\t\t// If an item is already set,\n\t\t\t// it has gone stale and needs to be synchronized.\n\t\t\tif (ci.item) {\n\t\t\t\tif (ci.type !== type.id) {\n\t\t\t\t\tconsole.error(\"Resource type inconsistency\");\n\t\t\t\t} else {\n\t\t\t\t\tsync = sync || {};\n\t\t\t\t\tsync[rid] = refs[rid];\n\t\t\t\t}\n\t\t\t\tdelete refs[rid];\n\t\t\t} else {\n\t\t\t\tlet f = type.getFactory(rid);\n\t\t\t\tci.setItem(f(this, rid), type.id);\n\t\t\t}\n\t\t}\n\n\t\treturn sync;\n\t}\n\n\t_initItems(refs, type) {\n\t\tif (!refs) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let rid in refs) {\n\t\t\tlet cacheItem = this.cache[rid];\n\t\t\tcacheItem.item.__init(type.prepareData(refs[rid]));\n\t\t}\n\t}\n\n\t_syncItems(refs, type) {\n\t\tif (!refs) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let rid in refs) {\n\t\t\tlet ci = this.cache[rid];\n\t\t\ttype.synchronize(ci, refs[rid]);\n\t\t}\n\t}\n\n\t_syncModel(cacheItem, data) {\n\t\tthis._handleChangeEvent(cacheItem, 'change', { values: data }, true);\n\t}\n\n\t_syncCollection(cacheItem, data) {\n\t\tlet collection = cacheItem.item;\n\t\tlet i = collection.length;\n\t\tlet a = new Array(i);\n\t\twhile (i--) {\n\t\t\ta[i] = collection.atIndex(i);\n\t\t}\n\n\t\tlet b = data.map(v => this._prepareValue(v));\n\t\tthis._patchDiff(a, b,\n\t\t\t(id, m, n, idx) => {},\n\t\t\t(id, n, idx) => this._handleAddEvent(cacheItem, 'add', {\n\t\t\t\tvalue: data[n],\n\t\t\t\tidx: idx\n\t\t\t}),\n\t\t\t(id, m, idx) => this._handleRemoveEvent(cacheItem, 'remove', { idx })\n\t\t);\n\t}\n\n\t_patchDiff(a, b, onKeep, onAdd, onRemove) {\n\t\t// Do a LCS matric calculation\n\t\t// https://en.wikipedia.org/wiki/Longest_common_subsequence_problem\n\t\tlet t, i, j, s = 0, aa, bb, m = a.length, n = b.length;\n\n\t\t// Trim of matches at the start and end\n\t\twhile (s < m && s < n && equal(a[s], b[s])) {\n\t\t\ts++;\n\t\t}\n\t\tif (s === m && s === n) {\n\t\t\treturn;\n\t\t}\n\t\twhile (s < m && s < n && equal(a[m - 1], b[n - 1])) {\n\t\t\tm--;\n\t\t\tn--;\n\t\t}\n\n\t\tif (s > 0 || m < a.length) {\n\t\t\taa = a.slice(s, m);\n\t\t\tm = aa.length;\n\t\t} else {\n\t\t\taa = a;\n\t\t}\n\t\tif (s > 0 || n < b.length) {\n\t\t\tbb = b.slice(s, n);\n\t\t\tn = bb.length;\n\t\t} else {\n\t\t\tbb = b;\n\t\t}\n\n\t\t// Create matrix and initialize it\n\t\tlet c = new Array(m + 1);\n\t\tfor (i = 0; i <= m; i++) {\n\t\t\tc[i] = t = new Array(n + 1);\n\t\t\tt[0] = 0;\n\t\t}\n\t\tt = c[0];\n\t\tfor (j = 1; j <= n; j++) {\n\t\t\tt[j] = 0;\n\t\t}\n\n\t\tfor (i = 0; i < m; i++) {\n\t\t\tfor (j = 0; j < n; j++) {\n\t\t\t\tc[i + 1][j + 1] = equal(aa[i], bb[j])\n\t\t\t\t\t? c[i][j] + 1\n\t\t\t\t\t: Math.max(c[i + 1][j], c[i][j + 1]);\n\t\t\t}\n\t\t}\n\n\t\tfor (i = a.length - 1; i >= s + m; i--) {\n\t\t\tonKeep(a[i], i, i - m + n, i);\n\t\t}\n\t\tlet idx = m + s;\n\t\ti = m;\n\t\tj = n;\n\t\tlet r = 0;\n\t\tlet adds = [];\n\t\twhile (true) {\n\t\t\tm = i - 1;\n\t\t\tn = j - 1;\n\t\t\tif (i > 0 && j > 0 && equal(aa[m], bb[n])) {\n\t\t\t\tonKeep(aa[m], m + s, n + s, --idx);\n\t\t\t\ti--;\n\t\t\t\tj--;\n\t\t\t} else if (j > 0 && (i === 0 || c[i][n] >= c[m][j])) {\n\t\t\t\tadds.push([ n, idx, r ]);\n\t\t\t\tj--;\n\t\t\t} else if (i > 0 && (j === 0 || c[i][n] < c[m][j])) {\n\t\t\t\tonRemove(aa[m], m + s, --idx);\n\t\t\t\tr++;\n\t\t\t\ti--;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfor (i = s - 1; i >= 0; i--) {\n\t\t\tonKeep(a[i], i, i, i);\n\t\t}\n\n\t\t// Do the adds\n\t\tlet len = adds.length - 1;\n\t\tfor (i = len; i >= 0; i--) {\n\t\t\t[ n, idx, j ] = adds[i];\n\t\t\tonAdd(bb[n], n + s, idx - r + j + len - i);\n\t\t}\n\t}\n\n\t_unsubscribe(ci, useDelay) {\n\t\tif (useDelay) {\n\t\t\treturn setTimeout(() => this._unsubscribe(ci), this.unsubscribeDelay);\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.debug(\"Unsubscribe \" + ci.rid);\n\t\t}\n\n\t\tif (!ci.subscribed) {\n\t\t\tif (this.stale && this.stale[ci.rid]) {\n\t\t\t\tthis._tryDelete(ci);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._subscribeReferred(ci);\n\n\t\tlet i = ci.subscribed;\n\t\tif (this.protocol < v1_2_1) {\n\t\t\twhile (i--) {\n\t\t\t\tthis._sendUnsubscribe(ci, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._sendUnsubscribe(ci, i);\n\t\t}\n\t}\n\n\t_sendUnsubscribe(ci, count) {\n\t\tthis._send('unsubscribe', ci.rid, null, count > 1 ? { count } : null)\n\t\t\t.then(() => {\n\t\t\t\tci.addSubscribed(-count);\n\t\t\t\tthis._tryDelete(ci);\n\t\t\t})\n\t\t\t.catch(() => this._tryDelete(ci));\n\t}\n\n\t_subscribeReferred(ci) {\n\t\tlet i = ci.subscribed;\n\t\tci.subscribed = 0;\n\t\tlet refs = this._getRefState(ci);\n\t\tci.subscribed = i;\n\n\t\tfor (let rid in refs) {\n\t\t\tlet r = refs[rid];\n\t\t\tif (r.st === stateStale) {\n\t\t\t\tthis._subscribe(r.ci);\n\t\t\t}\n\t\t}\n\t}\n\n\t_handleFailedSubscribe(cacheItem, isRetry) {\n\t\tcacheItem.addSubscribed(-1);\n\t\tthis._tryDelete(cacheItem, isRetry);\n\t}\n\n\t_reconnect(noDelay) {\n\t\tif (noDelay) {\n\t\t\tthis.connect();\n\t\t\treturn;\n\t\t}\n\t\tsetTimeout(() => {\n\t\t\tif (!this.tryConnect) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.connect();\n\t\t}, this.reconnectDelay);\n\t}\n\n\t_resolvePath(url) {\n\t\tif (url.match(/^wss?:\\/\\//) || typeof document == 'undefined' || !document.createElement) {\n\t\t\treturn url;\n\t\t}\n\n\t\tlet a = document.createElement('a');\n\t\ta.href = url;\n\n\t\treturn a.href.replace(/^http/, 'ws');\n\t}\n\n\t_traverse(ci, cb, state, skipFirst = false) {\n\t\t// Call callback to get new state to pass to\n\t\t// children. If false, we should not traverse deeper\n\t\tif (!skipFirst) {\n\t\t\tstate = cb(ci, state);\n\t\t\tif (state === false) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet item = ci.item;\n\t\tswitch (ci.type) {\n\t\tcase typeCollection:\n\t\t\tfor (let v of item) {\n\t\t\t\tlet ci = this._getRefItem(v);\n\t\t\t\tif (ci) {\n\t\t\t\t\tthis._traverse(ci, cb, state);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase typeModel:\n\t\t\tfor (let k in item) {\n\t\t\t\tif (item.hasOwnProperty(k)) {\n\t\t\t\t\tlet ci = this._getRefItem(item[k]);\n\t\t\t\t\tif (ci) {\n\t\t\t\t\t\tthis._traverse(ci, cb, state);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t_prepareValue(v, addIndirect) {\n\t\tif (v !== null && typeof v == 'object') {\n\t\t\tif (v.rid) {\n\t\t\t\t// Resource reference\n\t\t\t\tif (v.soft) {\n\t\t\t\t\t// Soft reference\n\t\t\t\t\tv = new ResRef(this, v.rid);\n\t\t\t\t} else {\n\t\t\t\t\t// Non-soft reference\n\t\t\t\t\tlet ci = this.cache[v.rid];\n\t\t\t\t\tif (addIndirect) {\n\t\t\t\t\t\tif (!ci) {\n\t\t\t\t\t\t\tlet err = \"resource \" + v.rid + \" not found in cache when trying to call addIndirect\";\n\t\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t\t\tthrow new Error(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tci.addIndirect();\n\t\t\t\t\t}\n\t\t\t\t\tv = ci.item;\n\t\t\t\t}\n\t\t\t} else if (v.hasOwnProperty('data')) {\n\t\t\t\t// Data value\n\t\t\t\tv = v.data;\n\t\t\t} else if (v.action === 'delete') {\n\t\t\t\tv = undefined;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Invalid value: \" + JSON.stringify(v));\n\t\t\t}\n\t\t}\n\t\treturn v;\n\t}\n}\n\nexport default ResClient;\n\nexport function isResError(o) {\n\treturn o instanceof ResError;\n};\n","/**\n * Locale string storing the string key and the default string.
\n * Use {@link L10n#l} to create new instances.\n * @implements {LocaleString}\n */\nclass LocaleStr {\n\n\t/**\n\t * Creates a LocaleStr instance\n\t * @param {L10n} l10n L10n instance.\n\t * @param {string} key Translation key of the string.\n\t * @param {string} defaultStr Default string tranlation.\n\t * @param {object} [defaultParams] Default string translation parameters.\n\t */\n\tconstructor(l10n, key, defaultStr, defaultParams) {\n\t\tthis._l10n = l10n;\n\t\tthis._key = key;\n\t\tthis._defaultStr = defaultStr;\n\t\tthis._defaultParams = typeof defaultParams === 'object'\n\t\t\t? defaultParams\n\t\t\t: null;\n\t}\n\n\t/**\n\t * Attaches an event handler function for one or more l10n events.\n\t * @param {?string} events One or more space-separated events. Null means any event. Supported event is 'localeUpdate'.\n\t * @param {EventBus~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._l10n.on(events, handler);\n\t}\n\n\t/**\n\t * Removes an l10n event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {function} [handler] An optional handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._l10n.off(events, handler);\n\t}\n\n\t/**\n\t * Returns a translated string\n\t * @param {*=} params Optional parameters for placeholder replacement.\n\t * @returns {string} Translated string\n\t */\n\ttranslate(params) {\n\t\treturn this._l10n.t(this, params);\n\t}\n\n\t/**\n\t * Gets the current locale language tag. Eg. 'en', 'pt-BR', etc.\n\t * @returns {string} Locale language tag.\n\t */\n\tgetLocale() {\n\t\treturn this._l10n.locale;\n\t}\n\n\t/**\n\t * Returns the translation key\n\t * @returns {string} Translation key\n\t */\n\ttranslationKey() {\n\t\treturn this._key;\n\t}\n\n\t/**\n\t * Returns the default translation\n\t * @returns {string} Default translation\n\t */\n\tdefaultStr() {\n\t\treturn this._defaultStr;\n\t}\n\n\t/**\n\t * Returns the default translation parameters\n\t * @returns {string} Default translation parameters\n\t */\n\tdefaultParams() {\n\t\treturn this._defaultParams;\n\t}\n}\n\nexport default LocaleStr;\n","import LocaleStr from './LocaleStr.js';\n\n/**\n * L10n handles localization and translation\n */\nclass L10n {\n\n\tconstructor(eventBus, namespace) {\n\t\tthis._ns = namespace ? namespace + '.' : '';\n\n\t\tthis._eventBus = eventBus;\n\t\tthis._locale = 'en';\n\t\tthis._dictionary = {};\n\t}\n\n\t/**\n\t * Currently set locale language tag\n\t * @type {string}\n\t */\n\tget locale() {\n\t\treturn this._locale;\n\t}\n\n\t/**\n\t * Translates a string and replaces tags with provided object.\n\t * @param {string|LocaleString} key Key id of string to translate. It might also be a LocaleString object previously returned from the l method.\n\t * @param {string} [defaultStr] Default string tranlation. Should not be provided if key is a LocaleString.\n\t * @param {object} [params] Params to use on tag replacement\n\t * @returns {string} Translated string.\n\t */\n\tt(key, defaultStr, params) {\n\t\tlet preParams = 2, defaultParams;\n\n\t\tif (key instanceof LocaleStr) {\n\t\t\tdefaultStr = key.defaultStr();\n\t\t\tdefaultParams = key.defaultParams();\n\t\t\tkey = key.translationKey();\n\t\t\tpreParams = 1;\n\t\t} else {\n\t\t\tif (this.isLocaleString(key)) {\n\t\t\t\treturn key.translate();\n\t\t\t}\n\n\t\t\tif (typeof key !== 'string') {\n\t\t\t\tconsole.error(`Translation key is of type ${typeof key} instead of string:`, key);\n\t\t\t\treturn defaultStr;\n\t\t\t}\n\n\t\t\t// If we only get one argument, we can assume\n\t\t\t// it is an already translated string.\n\t\t\tif (arguments.length <= 1) return key;\n\n\t\t\tkey = this._ns + key;\n\t\t}\n\n\t\tlet s = this._dictionary[key];\n\t\tif (typeof s !== 'string') {\n\t\t\ts = defaultStr;\n\t\t}\n\t\tparams = arguments[preParams];\n\n\t\tif (typeof params != \"undefined\" || defaultParams) {\n\t\t\tif (typeof params == \"string\") {\n\t\t\t\tparams = Array.prototype.slice.call(arguments, preParams);\n\t\t\t}\n\n\t\t\tif (defaultParams) {\n\t\t\t\tparams = Object.assign({}, defaultParams, params);\n\t\t\t}\n\n\t\t\ts = s.replace(/{([^}]+)}/g, (match, idx) => {\n\t\t\t\tlet p = params[idx];\n\t\t\t\treturn typeof p != 'undefined'\n\t\t\t\t\t? this.isLocaleString(p)\n\t\t\t\t\t\t? p.translate()\n\t\t\t\t\t\t: p\n\t\t\t\t\t: '???';\n\t\t\t});\n\t\t}\n\n\t\treturn s;\n\t}\n\n\t/**\n\t * Returns a LocaleString that can be passed to the t method for translation.\n\t * @param {string|LocaleStr} key Key id of string to translate.\n\t * @param {string} defaultStr Default string translation.\n\t * @param {object} [defaultParams] Default parameters.\n\t * @returns {LocaleStr} LocaleStr instance implementing the LocaleString interface.\n\t */\n\tl(key, defaultStr, defaultParams) {\n\t\tif (key instanceof LocaleStr) {\n\t\t\tif (typeof defaultStr === 'string') {\n\t\t\t\tdefaultStr = Array.prototype.slice.call(arguments, 1);\n\t\t\t}\n\n\t\t\tdefaultParams = key.defaultParams() && defaultStr\n\t\t\t\t? Object.assign({}, key.defaultParams(), defaultStr)\n\t\t\t\t: key.defaultParams() || defaultStr;\n\t\t\tdefaultStr = key.defaultStr();\n\t\t\tkey = key.translationKey();\n\t\t} else if (typeof defaultParams !== 'undefined') {\n\t\t\tif (typeof defaultParams === 'string') {\n\t\t\t\tdefaultParams = Array.prototype.slice.call(arguments, 2);\n\t\t\t}\n\t\t}\n\n\t\treturn new LocaleStr(this, this._ns + key, defaultStr, defaultParams);\n\t}\n\n\t/**\n\t * Creates a new L10n instance for the given namespace\n\t * @param {string} namespace Dot separated namespace to be added to the current namespace\n\t * @returns {L10n} An L10n instance.\n\t */\n\tnamespace(namespace = '') {\n\t\treturn new L10n(this._ns && namespace\n\t\t\t? this._ns + '.' + namespace\n\t\t\t: this._ns + namespace\n\t\t);\n\t}\n\n\t/**\n\t * Attaches an event handler function for one or more l10n events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {EventBus~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, 'l10n');\n\t}\n\n\t/**\n\t * Removes an l10n event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {function} [handler] An optional handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, 'l10n');\n\t}\n\n\t/**\n\t * Sets locale\n\t * @param {string} locale Locale language tag\n\t * @param {object} dictionary Key to text dictionary object.\n\t * @fires \"l10n.localeUpdate\"\n\t */\n\tsetLocale(locale, dictionary) {\n\t\tif (locale === this._locale && dictionary == this._dictionary) return;\n\n\t\tthis._locale = locale;\n\t\tthis._dictionary = dictionary || {};\n\n\t\t/**\n\t\t * L10N locale update event with the new locale.\n\t\t * @memberof L10n\n\t\t * @event \"l10n.localeUpdate\"\n\t\t * @type {object}\n\t\t * @property {string} locale Locale language tag of new locale\n\t\t */\n\t\tthis._eventBus.emit(this, 'l10n.localeUpdate', {\n\t\t\tlocale: this._locale\n\t\t});\n\t}\n\n\t/**\n\t * Checks if a value implements {@link LocaleString}.\n\t * @param {*} v Value to check\n\t * @returns {boolean} True if the string implements LocaleString interface, otherwise false.\n\t */\n\tisLocaleString(v) {\n\t\treturn v && typeof v === 'object' &&\n\t\t\ttypeof v.translate === 'function';\n\t}\n}\n\nexport default L10n;\n","const rm = function(hs, t, h, strict) {\n\tif (hs) {\n\t\tvar e, i = hs.length;\n\t\twhile (i--) {\n\t\t\te = hs[i];\n\t\t\tif ((e.t === t || (t === null && !strict)) && (h === e.h || (h === null && !strict))) {\n\t\t\t\ths.splice(i, 1);\n\t\t\t\tif (strict) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn !strict;\n};\n\n/**\n * Event callback\n * @callback EventBus~eventCallback\n * @param {?object} data Event data object\n * @param {object} target Target object\n * @param {string} event Event name including namespace\n * @param {?string} action Event action. This is the suffix of the event being listened to, or null if listening to the actual event.\n */\n\n/**\n * EventBus is a bus for subscribing to and emitting events.\n */\nclass EventBus {\n\n\t/**\n\t * Creates an event bus.\n\t */\n\tconstructor() {\n\t\tthis._evs = {};\n\t\tthis._qh = null;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more events.\n\t * @param {object} [target] An optional target object. The handler will only be called if target matches the target of the emitted event.\n\t * @param {?string} events One or more space-separated events (eg. 'disconnect'). Null or empty means any event.\n\t * @param {EventBus~eventCallback} handler A function to execute when the event is emitted.\n\t * @param {string} [namespace] Namespace string that will be added, separated with a dot, to every event name. If no events is null, only events with that namespace will be affected.\n\t * @returns {this}\n\t */\n\ton(target, events, handler, namespace) {\n\t\tvar i, hs, name, h;\n\n\t\t// Detect optional parameters\n\t\tif (typeof events == 'function') {\n\t\t\t// (events, handler, namespace)\n\t\t\tnamespace = handler;\n\t\t\thandler = events;\n\t\t\tevents = target;\n\t\t\ttarget = null;\n\t\t}\n\n\t\th = { t: target || null, h: handler };\n\n\t\tif (!events) {\n\t\t\tname = namespace || \"\";\n\n\t\t\ths = this._evs[name];\n\t\t\tif (!hs) {\n\t\t\t\tthis._evs[name] = [ h ];\n\t\t\t} else {\n\t\t\t\ths.push(h);\n\t\t\t}\n\n\t\t} else {\n\t\t\tnamespace = namespace ? namespace + '.' : '';\n\n\t\t\t// Handle multiple events separated by a space\n\t\t\tevents = events.match(/\\S+/g) || [];\n\n\t\t\tfor (i = 0; i < events.length; i++) {\n\t\t\t\tname = namespace + events[i];\n\n\t\t\t\ths = this._evs[name];\n\t\t\t\tif (!hs) {\n\t\t\t\t\tthis._evs[name] = [ h ];\n\t\t\t\t} else {\n\t\t\t\t\ths.push(h);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {object} [target] An optional target object. The handler will only be removed if target matches the target of the handler.\n\t * @param {?string} events One or more space-separated events (eg. 'disconnect'). Null or empty means any event.\n\t * @param {function} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t * @param {string} [namespace] Namespace string that will be added, separated with a dot, to every event name.\n\t * @param {boolean} [strict] Flag for strict mode where an error will be thrown if the handler doesn't exist.\n\t * @returns {this}\n\t */\n\toff(target, events, handler, namespace, strict) {\n\t\tvar i, hs, name;\n\n\t\t// Detect optional parameters\n\t\tif (target === null || typeof target == 'string') {\n\t\t\t// (events, handler, namespace)\n\t\t\tstrict = namespace;\n\t\t\tnamespace = handler;\n\t\t\thandler = events;\n\t\t\tevents = target;\n\t\t\ttarget = null;\n\t\t}\n\n\t\tif (!events) {\n\t\t\tevents = [ namespace || \"\" ];\n\t\t\tnamespace = \"\";\n\t\t} else {\n\t\t\tnamespace = namespace ? namespace + '.' : '';\n\t\t\t// Handle multiple events separated by a space.\n\t\t\tevents = events.match(/\\S+/g) || [];\n\t\t}\n\n\t\tfor (i = 0; i < events.length; i++) {\n\t\t\tname = namespace + events[i];\n\n\t\t\ths = this._evs[name];\n\t\t\tif (!rm(hs, target, handler, strict)) {\n\t\t\t\tlet err = new Error(\"Event handler not found\");\n\t\t\t\tconsole.error(err, { target: target, events: events, handler: handler, namespace: namespace });\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\t// No event handlers for event\n\t\t\tif (!hs) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Delete array if empty\n\t\t\tif (!hs.length) {\n\t\t\t\tdelete this._evs[name];\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Emits an event and triggers the base handler to be called, followed by any other handler bound.\n\t * @param {object} [target] Target object of the event\n\t * @param {string} event Name of the event. May include the namespace, if the namespace parameter is not provided.\n\t * @param {object} [data] Event data object. May be modified by the base handler, but shouldn't be changed any other handler.\n\t * @param {string} [namespace] Namespace string that will be added, separated with a dot, before the event name.\n\t * @returns {this}\n\t */\n\temit(target, event, data, namespace) {\n\t\tvar i, hs, h, sub, action;\n\n\t\t// Detect optional parameters\n\t\tif (typeof target == 'string') {\n\t\t\t// (events, data, namespace)\n\t\t\tnamespace = data;\n\t\t\tdata = event;\n\t\t\tevent = target;\n\t\t\ttarget = null;\n\t\t}\n\n\t\tevent = (namespace ? namespace + '.' : '') + event;\n\t\tsub = event;\n\n\t\twhile (true) {\n\t\t\ths = this._evs[sub];\n\n\t\t\tif (hs) {\n\t\t\t\taction = (sub ? event.substr(sub.length + 1) : event) || null;\n\t\t\t\ti = hs.length;\n\t\t\t\twhile (i--) {\n\t\t\t\t\th = hs[i];\n\t\t\t\t\tif (typeof h.h == 'function' && (h.t === null || h.t == target)) {\n\t\t\t\t\t\tthis._exec([ data, target, event, action, h.h ]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!sub) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Remove last namespace part\n\t\t\ti = sub.lastIndexOf('.');\n\t\t\tsub = i == -1 ? \"\" : sub.substr(0, i);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t_exec(cb) {\n\t\tif (this._qh) {\n\t\t\tthis._qh.push(cb);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._qh = [ cb ];\n\n\t\tsetTimeout(() => {\n\t\t\tlet f;\n\t\t\twhile (cb = this._qh.shift()) {\n\t\t\t\tf = cb.pop();\n\t\t\t\ttry {\n\t\t\t\t\tf(...cb);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._qh = null;\n\t\t}, 0);\n\t}\n}\n\nexport default EventBus;\n","/**\n * EventBus used for implementing modapp's Model interface, Collection interface, and LocaleString interface.\n */\n\nimport { default as EventBus } from './class/EventBus.js';\n\n/**\n * EventBus instance.\n * @type {EventBus}\n */\nlet eventBus = new EventBus();\n\nexport { EventBus };\nexport default eventBus;\n"],"names":["compare","list","map","add","key","value","idx","array","length","push","unshift","splice","remove","undefined","indexOf","get","indexOfKey","Collection","constructor","opt","obj","type","modelFactory","idAttribute","default","m","id","data","namespace","eventBus","this","_modelFactory","_idAttribute","_namespace","_eventBus","_map","SortedMap","item","_addItem","on","events","handler","off","Error","emit","removeAtIndex","move","atIndex","toArray","slice","Symbol","iterator","i","a","l","next","done","sortOrderCompare","b","sortOrder","getProps","props","k","hasOwnProperty","Array","isArray","from","patchDiff","onAdd","onRemove","t","j","aa","bb","s","n","c","Math","max","r","adds","len","CollectionWrapper","collection","_collection","property","filter","begin","end","autoDispose","_weakMap","WeakMap","_onAdd","bind","_onRemove","_listen","_filter","_compare","_onChange","_onCount","_timeout","_disposed","_initList","_setEventListeners","_checkAutoDispose","_list","_len","getModel","set","_wrapModel","f","sort","_beginIdx","e","_endIdx","getCollection","toJSON","_array","callback","setCollection","oldList","newList","refresh","_indexOf","_fIndexOf","cont","fidx","fi","_atFIndex","o","_begin","min","_end","arr","cb","_binarySearch","_","nf","nm","nfidx","_trySendRemove","_trySendAdd","cur_s","pre_s","cur_e","pre_e","_sendRemove","_sendAdd","delete","dt","ms","_autoDispose","clearTimeout","setTimeout","dispose","disposed","si","keyCallback","_props","_keyCallback","v","_onAddRemove","noEvents","change","mv","_promote","isAdd","ov","Object","assign","_definition","definition","_update","Promise","resolve","reset","getDefinition","promote","changed","p","hasProps","model","_model","_modification","_modProp","isModifiedProperty","_modifiedOnNew","modifiedOnNew","onChange","_setIsModified","_onModelChange","_setEventListener","prop","getModifications","keys","newIsModified","localeCompare","ModelToCollection","_filtered","setModel","_unlistenItem","_listenItem","_sendSyncEvents","_onItemChange","nv","_removeItem","show","_insertIdx","_indexOfItem","console","error","_indexOfKey","Model","super","_keyMap","keyMap","_dispose","_items","om","_removeItems","_prep","isDefined","mk","mvalue","_upsertItem","mkey","traceResgateOperation","name","operation","moduleConfig","sentry","dsn","Sentry","op","environment","integrations","CaptureConsole","levels","tracesSampleRate","replaysSessionSampleRate","replaysOnErrorSampleRate","tracePropagationTargets","api","hostUrl","webResourcePath","auth","loginUrl","Api","_ResClient","_inherits","_super","app","params","_this","_classCallCheck","debug","call","_resolveWebResourcePath","rid","rname","substr","query","replace","resource","isResError","Err","_typeof","url","match","document","createElement","href","disconnect","_this2","concat","_get","_getPrototypeOf","prototype","_this3","method","_this4","_this5","ResClient","FADE_DURATION","animate","progress","duration","step","token","startProgress","start","timestamp","requestId","window","requestAnimationFrame","slideDone","el","style","opacity","height","width","overflow","display","easeOut","unstyledCbs","getUnstyledDimensions","cs","cssText","offsetHeight","offsetWidth","fade","origin","Number","abs","swipeOut","direction","basePos","dirDist","distance","left","parseFloat","swipeIn","slideVertical","internalSlide","slideHorizontal","hori","target","d","offsetProp","unstyledHeight","unstyledWidth","dim","stop","cancelAnimationFrame","binarySearch","h","binaryInsert","duplicate","create","tagName","attributes","setAttribute","className","addEventListener","children","appendChild","text","textContent","append","parent","child","removeEventListener","parentNode","removeChild","empty","element","firstChild","getQuery","location","part","search","substring","exec","decodeURIComponent","startsWith","parts","split","l10n","L10n","defaultStr","defaultParams","_l10n","_key","_defaultStr","_defaultParams","translate","getLocale","locale","translationKey","_ns","_locale","preParams","isLocaleString","arguments","LocaleStr","setLocale","str","code","message","_code","_message","_data","equal","ak","bk","TYPES","assert","fromString","String","isNaN","toLowerCase","JSON","parse","update","source","def","strict","updated","updateObj","tkey","ex","copy","BlockedError","moduleName","blockedBy","join","CircularDependencyError","chain","UnavailableError","internalError","DeactivatedError","UnknownError","instance","requires","dependants","explicit","setState","setRequires","moduleNames","addDependant","state","param","promise","isActive","setExplicit","_moduleConfig","_query","uri","queryNamespace","_moduleClassCallback","moduleClass","_module","_moduleClass","_catchRequire","_require","loadBundle","bundle","modName","modNames","loadModules","_loadInstances","then","_toLoadResults","getModule","modInst","modInsts","modules","errors","deactivate","_disposeInstance","activate","_reloadInstance","_getModuleClass","catch","err","reject","modClass","_getModuleParams","_createInstance","deps","promises","all","require","loadedBy","_loadInstance","checkActiveFlag","ModuleInstance","_isTrue","active","_checkCircularRef","result","_cleanImplicits","_cleanImplicit","depInst","depName","toString","req","App","_eventBusNamespace","eventBusNamespace","setComponent","component","_component","_el","unrender","_renderScreen","unsetComponent","hasComponent","render","logoutUrl","authenticateUrl","file","uploadUrl","unsubscribe","_unsubscribe","direct","indirect","subscribed","addSubscribed","dir","unsubTimeout","_checkUnsubscribe","setPromise","setItem","setType","modelType","addDirect","removeDirect","resetTimeout","addIndirect","defaultFactory","root","addFactory","pattern","factory","tokens","sfwc","lt","nodes","pwc","fwc","removeFactory","getFactory","_match","ts","ResCollection","idCallback","_api","_rid","_idCallback","getClient","getResourceId","resourceOn","resourceOff","_hasId","authenticate","__init","forEach","__add","__remove","eq","equals","__update","ResRef","defaultModelFactory","ResModel","defaultCollectionFactory","errorFactory","ResError","versionToInt","version","getRID","typeCollection","typeModel","typeError","resourceTypes","actionDelete","action","legacyProtocol","v1_2_1","hostUrlOrFactory","wsFactory","_resolvePath","WebSocket","onConnect","reconnectDelay","subscribeStaleDelay","subscribeRetryDelay","unsubscribeDelay","tryConnect","connected","ws","requests","reqId","cache","stale","connectPromise","connectCallback","types","TypeList","prepareData","dta","_prepareValue","synchronize","_syncModel","_syncCollection","_handleOnopen","_handleOnerror","_handleOnmessage","_handleOnclose","supportedProtocol","connect","onopen","onerror","onmessage","onclose","_emit","close","_connectReject","getHostUrl","setOnConnect","registerModelType","unregisterModelType","registerCollectionType","unregisterCollectionType","ci","CacheItem","_subscribe","_call","_send","_cacheResources","modelId","cacheItem","_sendNow","json","stringify","send","_receive","trim","_handleErrorResponse","_handleSuccessResponse","_handleEvent","protocol","payload","lastIndexOf","event","handled","_handleChangeEvent","_handleAddEvent","_handleRemoveEvent","_handleUnsubscribeEvent","vals","values","ind","_tryDelete","refItem","_setStale","isRetry","_addStale","delay","_subscribeToStale","_removeStale","throwError","response","_handleFailedSubscribe","_subscribeToAllStale","ver","_connectResolve","wasConnected","hasStale","_reconnect","refs","_getRefState","st","_deleteRef","rc","_traverse","_seekRefs","_markDelete","ri","_getRefItem","models","collections","sync","_createItems","_initItems","_syncItems","_patchDiff","onKeep","useDelay","_subscribeReferred","_sendUnsubscribe","count","noDelay","skipFirst","soft","_dictionary","dictionary","rm","hs","_evs","_qh","sub","_exec","shift","pop","EventBus"],"sourceRoot":""}