@likecoin/epub-ts 0.3.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/dist/annotations.d.ts +159 -0
- package/dist/archive.d.ts +82 -0
- package/dist/book.d.ts +228 -0
- package/dist/container.d.ts +18 -0
- package/dist/contents.d.ts +351 -0
- package/dist/displayoptions.d.ts +20 -0
- package/dist/epub.cjs +10 -0
- package/dist/epub.cjs.map +1 -0
- package/dist/epub.d.ts +17 -0
- package/dist/epub.js +9500 -0
- package/dist/epub.js.map +1 -0
- package/dist/epub.umd.js +10 -0
- package/dist/epub.umd.js.map +1 -0
- package/dist/epubcfi.d.ts +116 -0
- package/dist/index.d.ts +8 -0
- package/dist/layout.d.ts +77 -0
- package/dist/locations.d.ts +117 -0
- package/dist/managers/continuous/index.d.ts +46 -0
- package/dist/managers/default/index.d.ts +117 -0
- package/dist/managers/helpers/snap.d.ts +63 -0
- package/dist/managers/helpers/stage.d.ts +41 -0
- package/dist/managers/helpers/views.d.ts +27 -0
- package/dist/managers/views/iframe.d.ts +114 -0
- package/dist/managers/views/inline.d.ts +65 -0
- package/dist/mapping.d.ts +97 -0
- package/dist/marks-pane/index.d.ts +40 -0
- package/dist/navigation.d.ts +108 -0
- package/dist/packaging.d.ts +104 -0
- package/dist/pagelist.d.ts +80 -0
- package/dist/rendition.d.ts +293 -0
- package/dist/resources.d.ts +97 -0
- package/dist/section.d.ts +88 -0
- package/dist/spine.d.ts +79 -0
- package/dist/store.d.ts +122 -0
- package/dist/themes.d.ts +103 -0
- package/dist/types.d.ts +269 -0
- package/dist/utils/constants.d.ts +59 -0
- package/dist/utils/core.d.ts +337 -0
- package/dist/utils/event-emitter.d.ts +6 -0
- package/dist/utils/hook.d.ts +30 -0
- package/dist/utils/mime.d.ts +5 -0
- package/dist/utils/path-utils.d.ts +14 -0
- package/dist/utils/path.d.ts +55 -0
- package/dist/utils/queue.d.ts +66 -0
- package/dist/utils/replacements.d.ts +11 -0
- package/dist/utils/request.d.ts +2 -0
- package/dist/utils/scrolltype.d.ts +2 -0
- package/dist/utils/url.d.ts +42 -0
- package/license +28 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epub.cjs","sources":["../src/utils/event-emitter.ts","../node_modules/@xmldom/xmldom/lib/conventions.js","../node_modules/@xmldom/xmldom/lib/dom.js","../node_modules/@xmldom/xmldom/lib/entities.js","../node_modules/@xmldom/xmldom/lib/sax.js","../node_modules/@xmldom/xmldom/lib/dom-parser.js","../node_modules/@xmldom/xmldom/lib/index.js","../src/utils/core.ts","../src/utils/path-utils.ts","../src/utils/path.ts","../src/utils/url.ts","../src/epubcfi.ts","../src/utils/hook.ts","../src/utils/replacements.ts","../src/utils/request.ts","../src/section.ts","../src/spine.ts","../src/utils/queue.ts","../src/utils/constants.ts","../src/locations.ts","../src/container.ts","../src/packaging.ts","../src/navigation.ts","../src/utils/mime.ts","../src/resources.ts","../src/pagelist.ts","../src/layout.ts","../src/themes.ts","../src/annotations.ts","../src/mapping.ts","../src/contents.ts","../src/marks-pane/index.ts","../src/managers/views/iframe.ts","../src/utils/scrolltype.ts","../src/managers/helpers/stage.ts","../src/managers/helpers/views.ts","../src/managers/default/index.ts","../src/managers/helpers/snap.ts","../src/managers/continuous/index.ts","../src/rendition.ts","../src/archive.ts","../node_modules/localforage/dist/localforage.js","../src/store.ts","../src/displayoptions.ts","../src/book.ts","../src/epub.ts"],"sourcesContent":["/**\n * Minimal EventEmitter mixin.\n * Drop-in replacement for the \"event-emitter\" npm package.\n * Supports on(type, fn), off(type, fn), emit(type, ...args).\n */\nexport default function EventEmitter(target: any): any {\n\tconst proto = typeof target === \"function\" ? target.prototype : target;\n\n\tproto.on = function (type: string, fn: (...args: any[]) => void) {\n\t\tif (!this.__listeners) this.__listeners = {};\n\t\tif (!this.__listeners[type]) this.__listeners[type] = [];\n\t\tthis.__listeners[type].push(fn);\n\t\treturn this;\n\t};\n\n\tproto.off = function (type: string, fn?: (...args: any[]) => void) {\n\t\tif (!this.__listeners || !this.__listeners[type]) return this;\n\t\tif (fn) {\n\t\t\tthis.__listeners[type] = this.__listeners[type].filter(function (f: any) { return f !== fn; });\n\t\t} else {\n\t\t\tdelete this.__listeners[type];\n\t\t}\n\t\treturn this;\n\t};\n\n\tproto.emit = function (type: string) {\n\t\tif (!this.__listeners || !this.__listeners[type]) return;\n\t\tconst args = Array.prototype.slice.call(arguments, 1);\n\t\tconst listeners = this.__listeners[type].slice();\n\t\tfor (let i = 0; i < listeners.length; i++) {\n\t\t\tlisteners[i].apply(this, args);\n\t\t}\n\t};\n\n\treturn target;\n}\n","'use strict'\n\n/**\n * \"Shallow freezes\" an object to render it immutable.\n * Uses `Object.freeze` if available,\n * otherwise the immutability is only in the type.\n *\n * Is used to create \"enum like\" objects.\n *\n * @template T\n * @param {T} object the object to freeze\n * @param {Pick<ObjectConstructor, 'freeze'> = Object} oc `Object` by default,\n * \t\t\t\tallows to inject custom object constructor for tests\n * @returns {Readonly<T>}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n */\nfunction freeze(object, oc) {\n\tif (oc === undefined) {\n\t\toc = Object\n\t}\n\treturn oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object\n}\n\n/**\n * All mime types that are allowed as input to `DOMParser.parseFromString`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec\n * @see DOMParser.prototype.parseFromString\n */\nvar MIME_TYPE = freeze({\n\t/**\n\t * `text/html`, the only mime type that triggers treating an XML document as HTML.\n\t *\n\t * @see DOMParser.SupportedType.isHTML\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec\n\t */\n\tHTML: 'text/html',\n\n\t/**\n\t * Helper method to check a mime type if it indicates an HTML document\n\t *\n\t * @param {string} [value]\n\t * @returns {boolean}\n\t *\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring \t */\n\tisHTML: function (value) {\n\t\treturn value === MIME_TYPE.HTML\n\t},\n\n\t/**\n\t * `application/xml`, the standard mime type for XML documents.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_APPLICATION: 'application/xml',\n\n\t/**\n\t * `text/html`, an alias for `application/xml`.\n\t *\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303\n\t * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_TEXT: 'text/xml',\n\n\t/**\n\t * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,\n\t * but is parsed as an XML document.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec\n\t * @see https://en.wikipedia.org/wiki/XHTML Wikipedia\n\t */\n\tXML_XHTML_APPLICATION: 'application/xhtml+xml',\n\n\t/**\n\t * `image/svg+xml`,\n\t *\n\t * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration\n\t * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1\n\t * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia\n\t */\n\tXML_SVG_IMAGE: 'image/svg+xml',\n})\n\n/**\n * Namespaces that are used in this code base.\n *\n * @see http://www.w3.org/TR/REC-xml-names\n */\nvar NAMESPACE = freeze({\n\t/**\n\t * The XHTML namespace.\n\t *\n\t * @see http://www.w3.org/1999/xhtml\n\t */\n\tHTML: 'http://www.w3.org/1999/xhtml',\n\n\t/**\n\t * Checks if `uri` equals `NAMESPACE.HTML`.\n\t *\n\t * @param {string} [uri]\n\t *\n\t * @see NAMESPACE.HTML\n\t */\n\tisHTML: function (uri) {\n\t\treturn uri === NAMESPACE.HTML\n\t},\n\n\t/**\n\t * The SVG namespace.\n\t *\n\t * @see http://www.w3.org/2000/svg\n\t */\n\tSVG: 'http://www.w3.org/2000/svg',\n\n\t/**\n\t * The `xml:` namespace.\n\t *\n\t * @see http://www.w3.org/XML/1998/namespace\n\t */\n\tXML: 'http://www.w3.org/XML/1998/namespace',\n\n\t/**\n\t * The `xmlns:` namespace\n\t *\n\t * @see https://www.w3.org/2000/xmlns/\n\t */\n\tXMLNS: 'http://www.w3.org/2000/xmlns/',\n})\n\nexports.freeze = freeze;\nexports.MIME_TYPE = MIME_TYPE;\nexports.NAMESPACE = NAMESPACE;\n","var conventions = require(\"./conventions\");\n\nvar NAMESPACE = conventions.NAMESPACE;\n\n/**\n * A prerequisite for `[].filter`, to drop elements that are empty\n * @param {string} input\n * @returns {boolean}\n */\nfunction notEmptyString (input) {\n\treturn input !== ''\n}\n/**\n * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * @param {string} input\n * @returns {string[]} (can be empty)\n */\nfunction splitOnASCIIWhitespace(input) {\n\t// U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE\n\treturn input ? input.split(/[\\t\\n\\f\\r ]+/).filter(notEmptyString) : []\n}\n\n/**\n * Adds element as a key to current if it is not already present.\n *\n * @param {Record<string, boolean | undefined>} current\n * @param {string} element\n * @returns {Record<string, boolean | undefined>}\n */\nfunction orderedSetReducer (current, element) {\n\tif (!current.hasOwnProperty(element)) {\n\t\tcurrent[element] = true;\n\t}\n\treturn current;\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ordered-set\n * @param {string} input\n * @returns {string[]}\n */\nfunction toOrderedSet(input) {\n\tif (!input) return [];\n\tvar list = splitOnASCIIWhitespace(input);\n\treturn Object.keys(list.reduce(orderedSetReducer, {}))\n}\n\n/**\n * Uses `list.indexOf` to implement something like `Array.prototype.includes`,\n * which we can not rely on being available.\n *\n * @param {any[]} list\n * @returns {function(any): boolean}\n */\nfunction arrayIncludes (list) {\n\treturn function(element) {\n\t\treturn list && list.indexOf(element) !== -1;\n\t}\n}\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tdest[p] = src[p];\n\t}\n}\n\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknown Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\n\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n/**\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n */\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0, \n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long \n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index. \n\t */\n\titem: function(index) {\n\t\treturn this[index] || null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i<this.length;i++){\n\t\t\tserializeToString(this[i],buf,isHTML,nodeFilter);\n\t\t}\n\t\treturn buf.join('');\n\t}\n};\n\nfunction LiveNodeList(node,refresh){\n\tthis._node = node;\n\tthis._refresh = refresh\n\t_updateLiveList(this);\n}\nfunction _updateLiveList(list){\n\tvar inc = list._node._inc || list._node.ownerDocument._inc;\n\tif(list._inc != inc){\n\t\tvar ls = list._refresh(list._node);\n\t\t//console.log(ls.length)\n\t\t__set__(list,'length',ls.length);\n\t\tcopy(ls,list);\n\t\tlist._inc = inc;\n\t}\n}\nLiveNodeList.prototype.item = function(i){\n\t_updateLiveList(this);\n\treturn this[i];\n}\n\n_extends(LiveNodeList,NodeList);\n\n/**\n * Objects implementing the NamedNodeMap interface are used\n * to represent collections of nodes that can be accessed by name.\n * Note that NamedNodeMap does not inherit from NodeList;\n * NamedNodeMaps are not maintained in any particular order.\n * Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index,\n * but this is simply to allow convenient enumeration of the contents of a NamedNodeMap,\n * and does not imply that the DOM specifies an order to these Nodes.\n * NamedNodeMap objects in the DOM are live.\n * used for attributes or DocumentType entities \n */\nfunction NamedNodeMap() {\n};\n\nfunction _findNodeIndex(list,node){\n\tvar i = list.length;\n\twhile(i--){\n\t\tif(list[i] === node){return i}\n\t}\n}\n\nfunction _addNamedNode(el,list,newAttr,oldAttr){\n\tif(oldAttr){\n\t\tlist[_findNodeIndex(list,oldAttr)] = newAttr;\n\t}else{\n\t\tlist[list.length++] = newAttr;\n\t}\n\tif(el){\n\t\tnewAttr.ownerElement = el;\n\t\tvar doc = el.ownerDocument;\n\t\tif(doc){\n\t\t\toldAttr && _onRemoveAttribute(doc,el,oldAttr);\n\t\t\t_onAddAttribute(doc,el,newAttr);\n\t\t}\n\t}\n}\nfunction _removeNamedNode(el,list,attr){\n\t//console.log('remove attr:'+attr)\n\tvar i = _findNodeIndex(list,attr);\n\tif(i>=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i<lastIndex){\n\t\t\tlist[i] = list[++i]\n\t\t}\n\t\tlist.length = lastIndex;\n\t\tif(el){\n\t\t\tvar doc = el.ownerDocument;\n\t\t\tif(doc){\n\t\t\t\t_onRemoveAttribute(doc,el,attr);\n\t\t\t\tattr.ownerElement = null;\n\t\t\t}\n\t\t}\n\t}else{\n\t\tthrow DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))\n\t}\n}\nNamedNodeMap.prototype = {\n\tlength:0,\n\titem:NodeList.prototype.item,\n\tgetNamedItem: function(key) {\n//\t\tif(key.indexOf(':')>0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t\t\n\t\t\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\t\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n\n/**\n * The DOMImplementation interface represents an object providing methods\n * which are not dependent on any particular document.\n * Such an object is returned by the `Document.implementation` property.\n *\n * __The individual methods describe the differences compared to the specs.__\n *\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN\n * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial)\n * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core\n * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core\n * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard\n */\nfunction DOMImplementation() {\n}\n\nDOMImplementation.prototype = {\n\t/**\n\t * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported.\n\t * The different implementations fairly diverged in what kind of features were reported.\n\t * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use.\n\t *\n\t * @deprecated It is deprecated and modern browsers return true in all cases.\n\t *\n\t * @param {string} feature\n\t * @param {string} [version]\n\t * @returns {boolean} always true\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN\n\t * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard\n\t */\n\thasFeature: function(feature, version) {\n\t\t\treturn true;\n\t},\n\t/**\n\t * Creates an XML Document object of the specified type with its document element.\n\t *\n\t * __It behaves slightly different from the description in the living standard__:\n\t * - There is no interface/class `XMLDocument`, it returns a `Document` instance.\n\t * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared.\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string|null} namespaceURI\n\t * @param {string} qualifiedName\n\t * @param {DocumentType=null} doctype\n\t * @returns {Document}\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial)\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocument: function(namespaceURI, qualifiedName, doctype){\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype || null;\n\t\tif (doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif (qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI, qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t/**\n\t * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`.\n\t *\n\t * __This behavior is slightly different from the in the specs__:\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string} qualifiedName\n\t * @param {string} [publicId]\n\t * @param {string} [systemId]\n\t * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation\n\t * \t\t\t\t or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()`\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocumentType: function(qualifiedName, publicId, systemId){\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId || '';\n\t\tnode.systemId = systemId || '';\n\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises \n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises \n\t\tthis.insertBefore(newChild,oldChild);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n\t/**\n\t * Look up the prefix associated to the given namespace URI, starting from this node.\n\t * **The default namespace declarations are ignored by this method.**\n\t * See Namespace Prefix Lookup for details on the algorithm used by this method.\n\t *\n\t * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._\n\t *\n\t * @param {string | null} namespaceURI\n\t * @returns {string | null}\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo\n\t * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix\n\t * @see https://github.com/xmldom/xmldom/issues/322\n\t */\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n \t\t\t\tif(map[n] == namespaceURI){\n \t\t\t\t\treturn n;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(prefix in map){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n}\n\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\n\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\n\nfunction _onUpdateChild(doc,el,newChild){\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif(newChild){\n\t\t\tcs[cs.length++] = newChild;\n\t\t}else{\n\t\t\t//console.log(1)\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile(child){\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild =child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t}\n\t}\n}\n\n/**\n * attributes;\n * children;\n * \n * writeable properties:\n * nodeValue,Attr:value,CharacterData:data\n * prefix\n */\nfunction _removeChild(parentNode,child){\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif(previous){\n\t\tprevious.nextSibling = next;\n\t}else{\n\t\tparentNode.firstChild = next\n\t}\n\tif(next){\n\t\tnext.previousSibling = previous;\n\t}else{\n\t\tparentNode.lastChild = previous;\n\t}\n\t_onUpdateChild(parentNode.ownerDocument,parentNode);\n\treturn child;\n}\n/**\n * preformance key(refChild == null)\n */\nfunction _insertBefore(parentNode,newChild,nextChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tcp.removeChild(newChild);//remove and update\n\t}\n\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = newChild.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn newChild;\n\t\t}\n\t\tvar newLast = newChild.lastChild;\n\t}else{\n\t\tnewFirst = newLast = newChild;\n\t}\n\tvar pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = nextChild;\n\t\n\t\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparentNode.firstChild = newFirst;\n\t}\n\tif(nextChild == null){\n\t\tparentNode.lastChild = newLast;\n\t}else{\n\t\tnextChild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parentNode;\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);\n\t//console.log(parentNode.lastChild.nextSibling == null)\n\tif (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnewChild.firstChild = newChild.lastChild = null;\n\t}\n\treturn newChild;\n}\nfunction _appendSingleChild(parentNode,newChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tvar pre = parentNode.lastChild;\n\t\tcp.removeChild(newChild);//remove and update\n\t\tvar pre = parentNode.lastChild;\n\t}\n\tvar pre = parentNode.lastChild;\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = pre;\n\tnewChild.nextSibling = null;\n\tif(pre){\n\t\tpre.nextSibling = newChild;\n\t}else{\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);\n\treturn newChild;\n\t//console.log(\"__aa\",parentNode.lastChild.nextSibling == null)\n}\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\t/**\n\t * The DocumentType node of the document.\n\t *\n\t * @readonly\n\t * @type DocumentType\n\t */\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\n\tinsertBefore : function(newChild, refChild){//raises\n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\tif(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\n\t\treturn _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\n\t/**\n\t * The `getElementsByClassName` method of `Document` interface returns an array-like object\n\t * of all child elements which have **all** of the given class name(s).\n\t *\n\t * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters.\n\t *\n\t *\n\t * Warning: This is a live LiveNodeList.\n\t * Changes in the DOM will reflect in the array as the changes occur.\n\t * If an element selected by this array no longer qualifies for the selector,\n\t * it will automatically be removed. Be aware of this for iteration purposes.\n\t *\n\t * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName\n\t * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname\n\t */\n\tgetElementsByClassName: function(classNames) {\n\t\tvar classNamesSet = toOrderedSet(classNames)\n\t\treturn new LiveNodeList(this, function(base) {\n\t\t\tvar ls = [];\n\t\t\tif (classNamesSet.length > 0) {\n\t\t\t\t_visitNode(base.documentElement, function(node) {\n\t\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\tvar nodeClassNames = node.getAttribute('class')\n\t\t\t\t\t\t// can be null if the attribute does not exist\n\t\t\t\t\t\tif (nodeClassNames) {\n\t\t\t\t\t\t\t// before splitting and iterating just compare them for the most common case\n\t\t\t\t\t\t\tvar matches = classNames === nodeClassNames;\n\t\t\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\t\t\tvar nodeClassNamesSet = toOrderedSet(nodeClassNames)\n\t\t\t\t\t\t\t\tmatches = classNamesSet.every(arrayIncludes(nodeClassNamesSet))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(matches) {\n\t\t\t\t\t\t\t\tls.push(node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ls;\n\t\t});\n\t},\n\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.localName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.target = target;\n\t\tnode.nodeValue= node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\t\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\t\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\t\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t\t\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\t\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9 && this.documentElement || this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\t\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\n\nfunction needNamespaceDefine(node, isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix || '';\n\tvar uri = node.namespaceURI;\n\t// According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) ,\n\t// and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl :\n\t// > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty.\n\t// in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using)\n\t// and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared :\n\t// > [...] Furthermore, the attribute value [...] must not be an empty string.\n\t// so serializing empty namespace value like xmlns:ds=\"\" would produce an invalid XML document.\n\tif (!uri) {\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) {\n\t\treturn false;\n\t}\n\t\n\tvar i = visibleNamespaces.length \n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\tif (ns.prefix === prefix) {\n\t\t\treturn ns.namespace !== uri;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * Well-formed constraint: No < in Attribute Values\n * The replacement text of any entity referred to directly or indirectly in an attribute value must not contain a <.\n * @see https://www.w3.org/TR/xml/#CleanAttrVals\n * @see https://www.w3.org/TR/xml/#NT-AttValue\n */\nfunction addSerializedAttribute(buf, qualifiedName, value) {\n\tbuf.push(' ', qualifiedName, '=\"', value.replace(/[<&\"]/g,_xmlEncoder), '\"')\n}\n\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif (!visibleNamespaces) {\n\t\tvisibleNamespaces = [];\n\t}\n\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\t\t\n\t\tisHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML\n\n\t\tvar prefixedNodeName = nodeName\n\t\tif (!isHTML && !node.prefix && node.namespaceURI) {\n\t\t\tvar defaultNS\n\t\t\t// lookup current default ns from `xmlns` attribute\n\t\t\tfor (var ai = 0; ai < attrs.length; ai++) {\n\t\t\t\tif (attrs.item(ai).name === 'xmlns') {\n\t\t\t\t\tdefaultNS = attrs.item(ai).value\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!defaultNS) {\n\t\t\t\t// lookup current default ns in visibleNamespaces\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.prefix === '' && namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tdefaultNS = namespace.namespace\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (defaultNS !== node.namespaceURI) {\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tif (namespace.prefix) {\n\t\t\t\t\t\t\tprefixedNodeName = namespace.prefix + ':' + nodeName\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbuf.push('<', prefixedNodeName);\n\n\t\tfor(var i=0;i<len;i++){\n\t\t\t// add namespaces for attributes\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (attr.prefix == 'xmlns') {\n\t\t\t\tvisibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });\n\t\t\t}else if(attr.nodeName == 'xmlns'){\n\t\t\t\tvisibleNamespaces.push({ prefix: '', namespace: attr.value });\n\t\t\t}\n\t\t}\n\n\t\tfor(var i=0;i<len;i++){\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {\n\t\t\t\tvar prefix = attr.prefix||'';\n\t\t\t\tvar uri = attr.namespaceURI;\n\t\t\t\taddSerializedAttribute(buf, prefix ? 'xmlns:' + prefix : \"xmlns\", uri);\n\t\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t\t}\n\t\t\tserializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t}\n\n\t\t// add namespace for current node\t\t\n\t\tif (nodeName === prefixedNodeName && needNamespaceDefine(node, isHTML, visibleNamespaces)) {\n\t\t\tvar prefix = node.prefix||'';\n\t\t\tvar uri = node.namespaceURI;\n\t\t\taddSerializedAttribute(buf, prefix ? 'xmlns:' + prefix : \"xmlns\", uri);\n\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t}\n\t\t\n\t\tif(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){\n\t\t\tbuf.push('>');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('</',prefixedNodeName,'>');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn addSerializedAttribute(buf, node.name, node.value);\n\tcase TEXT_NODE:\n\t\t/**\n\t\t * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form,\n\t\t * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section.\n\t\t * If they are needed elsewhere, they must be escaped using either numeric character references or the strings\n\t\t * `&` and `<` respectively.\n\t\t * The right angle bracket (>) may be represented using the string \" > \", and must, for compatibility,\n\t\t * be escaped using either `>` or a character reference when it appears in the string `]]>` in content,\n\t\t * when that string is not marking the end of a CDATA section.\n\t\t *\n\t\t * In the content of elements, character data is any string of characters\n\t\t * which does not contain the start-delimiter of any markup\n\t\t * and does not include the CDATA-section-close delimiter, `]]>`.\n\t\t *\n\t\t * @see https://www.w3.org/TR/xml/#NT-CharData\n\t\t */\n\t\treturn buf.push(node.data\n\t\t\t.replace(/[<&]/g,_xmlEncoder)\n\t\t\t.replace(/]]>/g, ']]>')\n\t\t);\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '<![CDATA[',node.data,']]>');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"<!--\",node.data,\"-->\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('<!DOCTYPE ',node.name);\n\t\tif(pubid){\n\t\t\tbuf.push(' PUBLIC ', pubid);\n\t\t\tif (sysid && sysid!='.') {\n\t\t\t\tbuf.push(' ', sysid);\n\t\t\t}\n\t\t\tbuf.push('>');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM ', sysid, '>');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"<?\",node.target,\" \",node.data,\"?>\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i<len;i++){\n\t\t\t//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));\n\t\t//}\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tbreak;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t\tbreak;\n\t//case ENTITY_REFERENCE_NODE:\n\t//case PROCESSING_INSTRUCTION_NODE:\n\t////case TEXT_NODE:\n\t//case CDATA_SECTION_NODE:\n\t//case COMMENT_NODE:\n\t//\tdeep = false;\n\t//\tbreak;\n\t//case DOCUMENT_NODE:\n\t//case DOCUMENT_TYPE_NODE:\n\t//cannot be imported.\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\t//can not hit in level3\n\t//default:throw e;\n\t}\n\tif(!node2){\n\t\tnode2 = node.cloneNode(false);//false\n\t}\n\tnode2.ownerDocument = doc;\n\tnode2.parentNode = null;\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(importNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n//\n//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,\n//\t\t\t\t\tattributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};\nfunction cloneNode(doc,node,deep){\n\tvar node2 = new node.constructor();\n\tfor(var n in node){\n\t\tvar v = node[n];\n\t\tif(typeof v != 'object' ){\n\t\t\tif(v != node2[n]){\n\t\t\t\tnode2[n] = v;\n\t\t\t}\n\t\t}\n\t}\n\tif(node.childNodes){\n\t\tnode2.childNodes = new NodeList();\n\t}\n\tnode2.ownerDocument = doc;\n\tswitch (node2.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tvar attrs\t= node.attributes;\n\t\tvar attrs2\t= node2.attributes = new NamedNodeMap();\n\t\tvar len = attrs.length\n\t\tattrs2._ownerElement = node2;\n\t\tfor(var i=0;i<len;i++){\n\t\t\tnode2.setAttributeNode(cloneNode(doc,attrs.item(i),true));\n\t\t}\n\t\tbreak;;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t}\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(cloneNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n\nfunction __set__(object,key,value){\n\tobject[key] = value\n}\n//do dynamic\ntry{\n\tif(Object.defineProperty){\n\t\tObject.defineProperty(LiveNodeList.prototype,'length',{\n\t\t\tget:function(){\n\t\t\t\t_updateLiveList(this);\n\t\t\t\treturn this.$$length;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(Node.prototype,'textContent',{\n\t\t\tget:function(){\n\t\t\t\treturn getTextContent(this);\n\t\t\t},\n\n\t\t\tset:function(data){\n\t\t\t\tswitch(this.nodeType){\n\t\t\t\tcase ELEMENT_NODE:\n\t\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\t\twhile(this.firstChild){\n\t\t\t\t\t\tthis.removeChild(this.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tif(data || String(data)){\n\t\t\t\t\t\tthis.appendChild(this.ownerDocument.createTextNode(data));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.value = data;\n\t\t\t\t\tthis.nodeValue = data;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t\n\t\tfunction getTextContent(node){\n\t\t\tswitch(node.nodeType){\n\t\t\tcase ELEMENT_NODE:\n\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\tvar buf = [];\n\t\t\t\tnode = node.firstChild;\n\t\t\t\twhile(node){\n\t\t\t\t\tif(node.nodeType!==7 && node.nodeType !==8){\n\t\t\t\t\t\tbuf.push(getTextContent(node));\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t}\n\t\t\t\treturn buf.join('');\n\t\t\tdefault:\n\t\t\t\treturn node.nodeValue;\n\t\t\t}\n\t\t}\n\n\t\t__set__ = function(object,key,value){\n\t\t\t//console.log(value)\n\t\t\tobject['$$'+key] = value\n\t\t}\n\t}\n}catch(e){//ie8\n}\n\n//if(typeof require == 'function'){\n\texports.DocumentType = DocumentType;\n\texports.DOMException = DOMException;\n\texports.DOMImplementation = DOMImplementation;\n\texports.Element = Element;\n\texports.Node = Node;\n\texports.NodeList = NodeList;\n\texports.XMLSerializer = XMLSerializer;\n//}\n","var freeze = require('./conventions').freeze;\n\n/**\n * The entities that are predefined in every XML document.\n *\n * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#sec-predefined-ent W3C XML 1.1\n * @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent W3C XML 1.0\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Predefined_entities_in_XML Wikipedia\n */\nexports.XML_ENTITIES = freeze({amp:'&', apos:\"'\", gt:'>', lt:'<', quot:'\"'})\n\n/**\n * A map of currently 241 entities that are detected in an HTML document.\n * They contain all entries from `XML_ENTITIES`.\n *\n * @see XML_ENTITIES\n * @see DOMParser.parseFromString\n * @see DOMImplementation.prototype.createHTMLDocument\n * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec\n * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names\n * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML)\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML)\n */\nexports.HTML_ENTITIES = freeze({\n lt: '<',\n gt: '>',\n amp: '&',\n quot: '\"',\n apos: \"'\",\n Agrave: \"À\",\n Aacute: \"Á\",\n Acirc: \"Â\",\n Atilde: \"Ã\",\n Auml: \"Ä\",\n Aring: \"Å\",\n AElig: \"Æ\",\n Ccedil: \"Ç\",\n Egrave: \"È\",\n Eacute: \"É\",\n Ecirc: \"Ê\",\n Euml: \"Ë\",\n Igrave: \"Ì\",\n Iacute: \"Í\",\n Icirc: \"Î\",\n Iuml: \"Ï\",\n ETH: \"Ð\",\n Ntilde: \"Ñ\",\n Ograve: \"Ò\",\n Oacute: \"Ó\",\n Ocirc: \"Ô\",\n Otilde: \"Õ\",\n Ouml: \"Ö\",\n Oslash: \"Ø\",\n Ugrave: \"Ù\",\n Uacute: \"Ú\",\n Ucirc: \"Û\",\n Uuml: \"Ü\",\n Yacute: \"Ý\",\n THORN: \"Þ\",\n szlig: \"ß\",\n agrave: \"à\",\n aacute: \"á\",\n acirc: \"â\",\n atilde: \"ã\",\n auml: \"ä\",\n aring: \"å\",\n aelig: \"æ\",\n ccedil: \"ç\",\n egrave: \"è\",\n eacute: \"é\",\n ecirc: \"ê\",\n euml: \"ë\",\n igrave: \"ì\",\n iacute: \"í\",\n icirc: \"î\",\n iuml: \"ï\",\n eth: \"ð\",\n ntilde: \"ñ\",\n ograve: \"ò\",\n oacute: \"ó\",\n ocirc: \"ô\",\n otilde: \"õ\",\n ouml: \"ö\",\n oslash: \"ø\",\n ugrave: \"ù\",\n uacute: \"ú\",\n ucirc: \"û\",\n uuml: \"ü\",\n yacute: \"ý\",\n thorn: \"þ\",\n yuml: \"ÿ\",\n nbsp: \"\\u00a0\",\n iexcl: \"¡\",\n cent: \"¢\",\n pound: \"£\",\n curren: \"¤\",\n yen: \"¥\",\n brvbar: \"¦\",\n sect: \"§\",\n uml: \"¨\",\n copy: \"©\",\n ordf: \"ª\",\n laquo: \"«\",\n not: \"¬\",\n shy: \"\",\n reg: \"®\",\n macr: \"¯\",\n deg: \"°\",\n plusmn: \"±\",\n sup2: \"²\",\n sup3: \"³\",\n acute: \"´\",\n micro: \"µ\",\n para: \"¶\",\n middot: \"·\",\n cedil: \"¸\",\n sup1: \"¹\",\n ordm: \"º\",\n raquo: \"»\",\n frac14: \"¼\",\n frac12: \"½\",\n frac34: \"¾\",\n iquest: \"¿\",\n times: \"×\",\n divide: \"÷\",\n forall: \"∀\",\n part: \"∂\",\n exist: \"∃\",\n empty: \"∅\",\n nabla: \"∇\",\n isin: \"∈\",\n notin: \"∉\",\n ni: \"∋\",\n prod: \"∏\",\n sum: \"∑\",\n minus: \"−\",\n lowast: \"∗\",\n radic: \"√\",\n prop: \"∝\",\n infin: \"∞\",\n ang: \"∠\",\n and: \"∧\",\n or: \"∨\",\n cap: \"∩\",\n cup: \"∪\",\n 'int': \"∫\",\n there4: \"∴\",\n sim: \"∼\",\n cong: \"≅\",\n asymp: \"≈\",\n ne: \"≠\",\n equiv: \"≡\",\n le: \"≤\",\n ge: \"≥\",\n sub: \"⊂\",\n sup: \"⊃\",\n nsub: \"⊄\",\n sube: \"⊆\",\n supe: \"⊇\",\n oplus: \"⊕\",\n otimes: \"⊗\",\n perp: \"⊥\",\n sdot: \"⋅\",\n Alpha: \"Α\",\n Beta: \"Β\",\n Gamma: \"Γ\",\n Delta: \"Δ\",\n Epsilon: \"Ε\",\n Zeta: \"Ζ\",\n Eta: \"Η\",\n Theta: \"Θ\",\n Iota: \"Ι\",\n Kappa: \"Κ\",\n Lambda: \"Λ\",\n Mu: \"Μ\",\n Nu: \"Ν\",\n Xi: \"Ξ\",\n Omicron: \"Ο\",\n Pi: \"Π\",\n Rho: \"Ρ\",\n Sigma: \"Σ\",\n Tau: \"Τ\",\n Upsilon: \"Υ\",\n Phi: \"Φ\",\n Chi: \"Χ\",\n Psi: \"Ψ\",\n Omega: \"Ω\",\n alpha: \"α\",\n beta: \"β\",\n gamma: \"γ\",\n delta: \"δ\",\n epsilon: \"ε\",\n zeta: \"ζ\",\n eta: \"η\",\n theta: \"θ\",\n iota: \"ι\",\n kappa: \"κ\",\n lambda: \"λ\",\n mu: \"μ\",\n nu: \"ν\",\n xi: \"ξ\",\n omicron: \"ο\",\n pi: \"π\",\n rho: \"ρ\",\n sigmaf: \"ς\",\n sigma: \"σ\",\n tau: \"τ\",\n upsilon: \"υ\",\n phi: \"φ\",\n chi: \"χ\",\n psi: \"ψ\",\n omega: \"ω\",\n thetasym: \"ϑ\",\n upsih: \"ϒ\",\n piv: \"ϖ\",\n OElig: \"Œ\",\n oelig: \"œ\",\n Scaron: \"Š\",\n scaron: \"š\",\n Yuml: \"Ÿ\",\n fnof: \"ƒ\",\n circ: \"ˆ\",\n tilde: \"˜\",\n ensp: \" \",\n emsp: \" \",\n thinsp: \" \",\n zwnj: \"\",\n zwj: \"\",\n lrm: \"\",\n rlm: \"\",\n ndash: \"–\",\n mdash: \"—\",\n lsquo: \"‘\",\n rsquo: \"’\",\n sbquo: \"‚\",\n ldquo: \"“\",\n rdquo: \"”\",\n bdquo: \"„\",\n dagger: \"†\",\n Dagger: \"‡\",\n bull: \"•\",\n hellip: \"…\",\n permil: \"‰\",\n prime: \"′\",\n Prime: \"″\",\n lsaquo: \"‹\",\n rsaquo: \"›\",\n oline: \"‾\",\n euro: \"€\",\n trade: \"™\",\n larr: \"←\",\n uarr: \"↑\",\n rarr: \"→\",\n darr: \"↓\",\n harr: \"↔\",\n crarr: \"↵\",\n lceil: \"⌈\",\n rceil: \"⌉\",\n lfloor: \"⌊\",\n rfloor: \"⌋\",\n loz: \"◊\",\n spades: \"♠\",\n clubs: \"♣\",\n hearts: \"♥\",\n diams: \"♦\"\n});\n\n/**\n * @deprecated use `HTML_ENTITIES` instead\n * @see HTML_ENTITIES\n */\nexports.entityMap = exports.HTML_ENTITIES\n","var NAMESPACE = require(\"./conventions\").NAMESPACE;\n\n//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\n\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\nvar S_TAG = 0;//tag name offerring\nvar S_ATTR = 1;//attr name offerring \nvar S_ATTR_SPACE=2;//attr name end and space offer\nvar S_EQ = 3;//=space?\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\nvar S_TAG_CLOSE = 7;//closed el<el />\n\n/**\n * Creates an error that will not be caught by XMLReader aka the SAX parser.\n *\n * @param {string} message\n * @param {any?} locator Optional, can provide details about the location in the source\n * @constructor\n */\nfunction ParseError(message, locator) {\n\tthis.message = message\n\tthis.locator = locator\n\tif(Error.captureStackTrace) Error.captureStackTrace(this, ParseError);\n}\nParseError.prototype = new Error();\nParseError.prototype.name = ParseError.name\n\nfunction XMLReader(){\n\t\n}\n\nXMLReader.prototype = {\n\tparse:function(source,defaultNSMap,entityMap){\n\t\tvar domBuilder = this.domBuilder;\n\t\tdomBuilder.startDocument();\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\n\t\tparse(source,defaultNSMap,entityMap,\n\t\t\t\tdomBuilder,this.errorHandler);\n\t\tdomBuilder.endDocument();\n\t}\n}\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\n\tfunction fixedFromCharCode(code) {\n\t\t// String.prototype.fromCharCode does not supports\n\t\t// > 2 bytes unicode chars directly\n\t\tif (code > 0xffff) {\n\t\t\tcode -= 0x10000;\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\n\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\n\t\t} else {\n\t\t\treturn String.fromCharCode(code);\n\t\t}\n\t}\n\tfunction entityReplacer(a){\n\t\tvar k = a.slice(1,-1);\n\t\tif(k in entityMap){\n\t\t\treturn entityMap[k]; \n\t\t}else if(k.charAt(0) === '#'){\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\n\t\t}else{\n\t\t\terrorHandler.error('entity not found:'+a);\n\t\t\treturn a;\n\t\t}\n\t}\n\tfunction appendText(end){//has some bugs\n\t\tif(end>start){\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\tlocator&&position(start);\n\t\t\tdomBuilder.characters(xt,0,end-start);\n\t\t\tstart = end\n\t\t}\n\t}\n\tfunction position(p,m){\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\n\t\t\tlineStart = m.index;\n\t\t\tlineEnd = lineStart + m[0].length;\n\t\t\tlocator.lineNumber++;\n\t\t\t//console.log('line++:',locator,startPos,endPos)\n\t\t}\n\t\tlocator.columnNumber = p-lineStart+1;\n\t}\n\tvar lineStart = 0;\n\tvar lineEnd = 0;\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\n\tvar locator = domBuilder.locator;\n\t\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\n\tvar closeMap = {};\n\tvar start = 0;\n\twhile(true){\n\t\ttry{\n\t\t\tvar tagStart = source.indexOf('<',start);\n\t\t\tif(tagStart<0){\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\n\t\t\t\t\tvar doc = domBuilder.doc;\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\n\t \t\t\tdoc.appendChild(text);\n\t \t\t\tdomBuilder.currentElement = text;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(tagStart>start){\n\t\t\t\tappendText(tagStart);\n\t\t\t}\n\t\t\tswitch(source.charAt(tagStart+1)){\n\t\t\tcase '/':\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\n\t\t\t\tvar tagName = source.substring(tagStart + 2, end).replace(/[ \\t\\n\\r]+$/g, '');\n\t\t\t\tvar config = parseStack.pop();\n\t\t\t\tif(end<0){\n\t\t\t\t\t\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\n\t \t\tend = tagStart+1+tagName.length;\n\t \t}else if(tagName.match(/\\s</)){\n\t \t\ttagName = tagName.replace(/[\\s<].*/,'');\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' maybe not complete');\n\t \t\tend = tagStart+1+tagName.length;\n\t\t\t\t}\n\t\t\t\tvar localNSMap = config.localNSMap;\n\t\t\t\tvar endMatch = config.tagName == tagName;\n\t\t\t\tvar endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()\n\t\t if(endIgnoreCaseMach){\n\t\t \tdomBuilder.endElement(config.uri,config.localName,tagName);\n\t\t\t\t\tif(localNSMap){\n\t\t\t\t\t\tfor(var prefix in localNSMap){\n\t\t\t\t\t\t\tdomBuilder.endPrefixMapping(prefix) ;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!endMatch){\n\t\t \terrorHandler.fatalError(\"end tag name: \"+tagName+' is not match the current start tagName:'+config.tagName ); // No known test case\n\t\t\t\t\t}\n\t\t }else{\n\t\t \tparseStack.push(config)\n\t\t }\n\t\t\t\t\n\t\t\t\tend++;\n\t\t\t\tbreak;\n\t\t\t\t// end elment\n\t\t\tcase '?':// <?...?>\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\n\t\t\t\tbreak;\n\t\t\tcase '!':// <!doctype,<![CDATA,<!--\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseDCC(source,tagStart,domBuilder,errorHandler);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tvar el = new ElementAttributes();\n\t\t\t\tvar currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\t\t\t\t//elStartEnd\n\t\t\t\tvar end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);\n\t\t\t\tvar len = el.length;\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tif(!entityMap.nbsp){\n\t\t\t\t\t\terrorHandler.warning('unclosed xml attribute');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(locator && len){\n\t\t\t\t\tvar locator2 = copyLocator(locator,{});\n\t\t\t\t\t//try{//attribute position fixed\n\t\t\t\t\tfor(var i = 0;i<len;i++){\n\t\t\t\t\t\tvar a = el[i];\n\t\t\t\t\t\tposition(a.offset);\n\t\t\t\t\t\ta.locator = copyLocator(locator,{});\n\t\t\t\t\t}\n\t\t\t\t\tdomBuilder.locator = locator2\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\n\t\t\t\t\t\tparseStack.push(el)\n\t\t\t\t\t}\n\t\t\t\t\tdomBuilder.locator = locator;\n\t\t\t\t}else{\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\n\t\t\t\t\t\tparseStack.push(el)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (NAMESPACE.isHTML(el.uri) && !el.closed) {\n\t\t\t\t\tend = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)\n\t\t\t\t} else {\n\t\t\t\t\tend++;\n\t\t\t\t}\n\t\t\t}\n\t\t}catch(e){\n\t\t\tif (e instanceof ParseError) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\terrorHandler.error('element parse error: '+e)\n\t\t\tend = -1;\n\t\t}\n\t\tif(end>start){\n\t\t\tstart = end;\n\t\t}else{\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\n\t\t\tappendText(Math.max(tagStart,start)+1);\n\t\t}\n\t}\n}\nfunction copyLocator(f,t){\n\tt.lineNumber = f.lineNumber;\n\tt.columnNumber = f.columnNumber;\n\treturn t;\n}\n\n/**\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\n */\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\n\n\t/**\n\t * @param {string} qname\n\t * @param {string} value\n\t * @param {number} startIndex\n\t */\n\tfunction addAttribute(qname, value, startIndex) {\n\t\tif (el.attributeNames.hasOwnProperty(qname)) {\n\t\t\terrorHandler.fatalError('Attribute ' + qname + ' redefined')\n\t\t}\n\t\tel.addValue(qname, value, startIndex)\n\t}\n\tvar attrName;\n\tvar value;\n\tvar p = ++start;\n\tvar s = S_TAG;//status\n\twhile(true){\n\t\tvar c = source.charAt(p);\n\t\tswitch(c){\n\t\tcase '=':\n\t\t\tif(s === S_ATTR){//attrName\n\t\t\t\tattrName = source.slice(start,p);\n\t\t\t\ts = S_EQ;\n\t\t\t}else if(s === S_ATTR_SPACE){\n\t\t\t\ts = S_EQ;\n\t\t\t}else{\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\n\t\t\t\tthrow new Error('attribute equal must after attrName'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '\\'':\n\t\tcase '\"':\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\n\t\t\t\t){//equal\n\t\t\t\tif(s === S_ATTR){\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t}\n\t\t\t\tstart = p+1;\n\t\t\t\tp = source.indexOf(c,start)\n\t\t\t\tif(p>0){\n\t\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\t\taddAttribute(attrName, value, start-1);\n\t\t\t\t\ts = S_ATTR_END;\n\t\t\t\t}else{\n\t\t\t\t\t//fatalError: no end quot match\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\n\t\t\t\t}\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\t//console.log(attrName,value,start,p)\n\t\t\t\taddAttribute(attrName, value, start);\n\t\t\t\t//console.dir(el)\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\n\t\t\t\tstart = p+1;\n\t\t\t\ts = S_ATTR_END\n\t\t\t}else{\n\t\t\t\t//fatalError: no equal before\n\t\t\t\tthrow new Error('attribute value must after \"=\"'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '/':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\ts =S_TAG_CLOSE;\n\t\t\t\tel.closed = true;\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\tcase S_ATTR:\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tbreak;\n\t\t\t//case S_EQ:\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\") // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ''://end document\n\t\t\terrorHandler.error('unexpected end of input');\n\t\t\tif(s == S_TAG){\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\t}\n\t\t\treturn p;\n\t\tcase '>':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\tbreak;//normal\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\n\t\t\tcase S_ATTR:\n\t\t\t\tvalue = source.slice(start,p);\n\t\t\t\tif(value.slice(-1) === '/'){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tvalue = value.slice(0,-1)\n\t\t\t\t}\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tif(s === S_ATTR_SPACE){\n\t\t\t\t\tvalue = attrName;\n\t\t\t\t}\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!');\n\t\t\t\t\taddAttribute(attrName, value.replace(/&#?\\w+;/g,entityReplacer), start)\n\t\t\t\t}else{\n\t\t\t\t\tif(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(value, value, start)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase S_EQ:\n\t\t\t\tthrow new Error('attribute value missed!!');\n\t\t\t}\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\n\t\t\treturn p;\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\n\t\tcase '\\u0080':\n\t\t\tc = ' ';\n\t\tdefault:\n\t\t\tif(c<= ' '){//space\n\t\t\t\tswitch(s){\n\t\t\t\tcase S_TAG:\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR:\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t\ts = S_ATTR_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\t\t\tvar value = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\t//case S_TAG_SPACE:\n\t\t\t\t//case S_EQ:\n\t\t\t\t//case S_ATTR_SPACE:\n\t\t\t\t//\tvoid();break;\n\t\t\t\t//case S_TAG_CLOSE:\n\t\t\t\t\t//ignore warning\n\t\t\t\t}\n\t\t\t}else{//not space\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\n\t\t\t\tswitch(s){\n\t\t\t\t//case S_TAG:void();break;\n\t\t\t\t//case S_ATTR:void();break;\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tvar tagName = el.tagName;\n\t\t\t\t\tif (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(attrName, attrName, start);\n\t\t\t\t\tstart = p;\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\n\t\t\t\tcase S_TAG_SPACE:\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_EQ:\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_TAG_CLOSE:\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\n\t\t\t\t}\n\t\t\t}\n\t\t}//end outer switch\n\t\t//console.log('p++',p)\n\t\tp++;\n\t}\n}\n/**\n * @return true if has new namespace define\n */\nfunction appendElement(el,domBuilder,currentNSMap){\n\tvar tagName = el.tagName;\n\tvar localNSMap = null;\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\tvar i = el.length;\n\twhile(i--){\n\t\tvar a = el[i];\n\t\tvar qName = a.qName;\n\t\tvar value = a.value;\n\t\tvar nsp = qName.indexOf(':');\n\t\tif(nsp>0){\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\n\t\t\tvar localName = qName.slice(nsp+1);\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\n\t\t}else{\n\t\t\tlocalName = qName;\n\t\t\tprefix = null\n\t\t\tnsPrefix = qName === 'xmlns' && ''\n\t\t}\n\t\t//can not set prefix,because prefix !== ''\n\t\ta.localName = localName ;\n\t\t//prefix == null for no ns prefix attribute \n\t\tif(nsPrefix !== false){//hack!!\n\t\t\tif(localNSMap == null){\n\t\t\t\tlocalNSMap = {}\n\t\t\t\t//console.log(currentNSMap,0)\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\n\t\t\t\t//console.log(currentNSMap,1)\n\t\t\t}\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\n\t\t\ta.uri = NAMESPACE.XMLNS\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value) \n\t\t}\n\t}\n\tvar i = el.length;\n\twhile(i--){\n\t\ta = el[i];\n\t\tvar prefix = a.prefix;\n\t\tif(prefix){//no prefix attribute has no namespace\n\t\t\tif(prefix === 'xml'){\n\t\t\t\ta.uri = NAMESPACE.XML;\n\t\t\t}if(prefix !== 'xmlns'){\n\t\t\t\ta.uri = currentNSMap[prefix || '']\n\t\t\t\t\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\n\t\t\t}\n\t\t}\n\t}\n\tvar nsp = tagName.indexOf(':');\n\tif(nsp>0){\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\n\t}else{\n\t\tprefix = null;//important!!\n\t\tlocalName = el.localName = tagName;\n\t}\n\t//no prefix element has default namespace\n\tvar ns = el.uri = currentNSMap[prefix || ''];\n\tdomBuilder.startElement(ns,localName,tagName,el);\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\n\t//localNSMap = null\n\tif(el.closed){\n\t\tdomBuilder.endElement(ns,localName,tagName);\n\t\tif(localNSMap){\n\t\t\tfor(prefix in localNSMap){\n\t\t\t\tdomBuilder.endPrefixMapping(prefix) \n\t\t\t}\n\t\t}\n\t}else{\n\t\tel.currentNSMap = currentNSMap;\n\t\tel.localNSMap = localNSMap;\n\t\t//parseStack.push(el);\n\t\treturn true;\n\t}\n}\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\n\tif(/^(?:script|textarea)$/i.test(tagName)){\n\t\tvar elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\n\t\tif(/[&<]/.test(text)){\n\t\t\tif(/^script$/i.test(tagName)){\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\n\t\t\t\t\t//lexHandler.startCDATA();\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\t\t//lexHandler.endCDATA();\n\t\t\t\t\treturn elEndStart;\n\t\t\t\t//}\n\t\t\t}//}else{//text area\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\treturn elEndStart;\n\t\t\t//}\n\t\t\t\n\t\t}\n\t}\n\treturn elStartEnd+1;\n}\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\n\t//if(tagName in closeMap){\n\tvar pos = closeMap[tagName];\n\tif(pos == null){\n\t\t//console.log(tagName)\n\t\tpos = source.lastIndexOf('</'+tagName+'>')\n\t\tif(pos<elStartEnd){//忘记闭合\n\t\t\tpos = source.lastIndexOf('</'+tagName)\n\t\t}\n\t\tcloseMap[tagName] =pos\n\t}\n\treturn pos<elStartEnd;\n\t//} \n}\nfunction _copy(source,target){\n\tfor(var n in source){target[n] = source[n]}\n}\nfunction parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'\n\tvar next= source.charAt(start+2)\n\tswitch(next){\n\tcase '-':\n\t\tif(source.charAt(start + 3) === '-'){\n\t\t\tvar end = source.indexOf('-->',start+4);\n\t\t\t//append comment source.substring(4,end)//<!--\n\t\t\tif(end>start){\n\t\t\t\tdomBuilder.comment(source,start+4,end-start-4);\n\t\t\t\treturn end+3;\n\t\t\t}else{\n\t\t\t\terrorHandler.error(\"Unclosed comment\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}else{\n\t\t\t//error\n\t\t\treturn -1;\n\t\t}\n\tdefault:\n\t\tif(source.substr(start+3,6) == 'CDATA['){\n\t\t\tvar end = source.indexOf(']]>',start+9);\n\t\t\tdomBuilder.startCDATA();\n\t\t\tdomBuilder.characters(source,start+9,end-start-9);\n\t\t\tdomBuilder.endCDATA() \n\t\t\treturn end+3;\n\t\t}\n\t\t//<!DOCTYPE\n\t\t//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) \n\t\tvar matchs = split(source,start);\n\t\tvar len = matchs.length;\n\t\tif(len>1 && /!doctype/i.test(matchs[0][0])){\n\t\t\tvar name = matchs[1][0];\n\t\t\tvar pubid = false;\n\t\t\tvar sysid = false;\n\t\t\tif(len>3){\n\t\t\t\tif(/^public$/i.test(matchs[2][0])){\n\t\t\t\t\tpubid = matchs[3][0];\n\t\t\t\t\tsysid = len>4 && matchs[4][0];\n\t\t\t\t}else if(/^system$/i.test(matchs[2][0])){\n\t\t\t\t\tsysid = matchs[3][0];\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar lastMatch = matchs[len-1]\n\t\t\tdomBuilder.startDTD(name, pubid, sysid);\n\t\t\tdomBuilder.endDTD();\n\t\t\t\n\t\t\treturn lastMatch.index+lastMatch[0].length\n\t\t}\n\t}\n\treturn -1;\n}\n\n\n\nfunction parseInstruction(source,start,domBuilder){\n\tvar end = source.indexOf('?>',start);\n\tif(end){\n\t\tvar match = source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);\n\t\tif(match){\n\t\t\tvar len = match[0].length;\n\t\t\tdomBuilder.processingInstruction(match[1], match[2]) ;\n\t\t\treturn end+2;\n\t\t}else{//error\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction ElementAttributes(){\n\tthis.attributeNames = {}\n}\nElementAttributes.prototype = {\n\tsetTagName:function(tagName){\n\t\tif(!tagNamePattern.test(tagName)){\n\t\t\tthrow new Error('invalid tagName:'+tagName)\n\t\t}\n\t\tthis.tagName = tagName\n\t},\n\taddValue:function(qName, value, offset) {\n\t\tif(!tagNamePattern.test(qName)){\n\t\t\tthrow new Error('invalid attribute:'+qName)\n\t\t}\n\t\tthis.attributeNames[qName] = this.length;\n\t\tthis[this.length++] = {qName:qName,value:value,offset:offset}\n\t},\n\tlength:0,\n\tgetLocalName:function(i){return this[i].localName},\n\tgetLocator:function(i){return this[i].locator},\n\tgetQName:function(i){return this[i].qName},\n\tgetURI:function(i){return this[i].uri},\n\tgetValue:function(i){return this[i].value}\n//\t,getIndex:function(uri, localName)){\n//\t\tif(localName){\n//\t\t\t\n//\t\t}else{\n//\t\t\tvar qName = uri\n//\t\t}\n//\t},\n//\tgetValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},\n//\tgetType:function(uri,localName){}\n//\tgetType:function(i){},\n}\n\n\n\nfunction split(source,start){\n\tvar match;\n\tvar buf = [];\n\tvar reg = /'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;\n\treg.lastIndex = start;\n\treg.exec(source);//skip <\n\twhile(match = reg.exec(source)){\n\t\tbuf.push(match);\n\t\tif(match[1])return buf;\n\t}\n}\n\nexports.XMLReader = XMLReader;\nexports.ParseError = ParseError;\n","var conventions = require(\"./conventions\");\nvar dom = require('./dom')\nvar entities = require('./entities');\nvar sax = require('./sax');\n\nvar DOMImplementation = dom.DOMImplementation;\n\nvar NAMESPACE = conventions.NAMESPACE;\n\nvar ParseError = sax.ParseError;\nvar XMLReader = sax.XMLReader;\n\nfunction DOMParser(options){\n\tthis.options = options ||{locator:{}};\n}\n\nDOMParser.prototype.parseFromString = function(source,mimeType){\n\tvar options = this.options;\n\tvar sax = new XMLReader();\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\n\tvar errorHandler = options.errorHandler;\n\tvar locator = options.locator;\n\tvar defaultNSMap = options.xmlns||{};\n\tvar isHTML = /\\/x?html?$/.test(mimeType);//mimeType.toLowerCase().indexOf('html') > -1;\n \tvar entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES;\n\tif(locator){\n\t\tdomBuilder.setDocumentLocator(locator)\n\t}\n\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\n\tsax.domBuilder = options.domBuilder || domBuilder;\n\tif(isHTML){\n\t\tdefaultNSMap[''] = NAMESPACE.HTML;\n\t}\n\tdefaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML;\n\tif(source && typeof source === 'string'){\n\t\tsax.parse(source,defaultNSMap,entityMap);\n\t}else{\n\t\tsax.errorHandler.error(\"invalid doc source\");\n\t}\n\treturn domBuilder.doc;\n}\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\n\tif(!errorImpl){\n\t\tif(domBuilder instanceof DOMHandler){\n\t\t\treturn domBuilder;\n\t\t}\n\t\terrorImpl = domBuilder ;\n\t}\n\tvar errorHandler = {}\n\tvar isCallback = errorImpl instanceof Function;\n\tlocator = locator||{}\n\tfunction build(key){\n\t\tvar fn = errorImpl[key];\n\t\tif(!fn && isCallback){\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\n\t\t}\n\t\terrorHandler[key] = fn && function(msg){\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\n\t\t}||function(){};\n\t}\n\tbuild('warning');\n\tbuild('error');\n\tbuild('fatalError');\n\treturn errorHandler;\n}\n\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\n/**\n * +ContentHandler+ErrorHandler\n * +LexicalHandler+EntityResolver2\n * -DeclHandler-DTDHandler\n *\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\n */\nfunction DOMHandler() {\n this.cdata = false;\n}\nfunction position(locator,node){\n\tnode.lineNumber = locator.lineNumber;\n\tnode.columnNumber = locator.columnNumber;\n}\n/**\n * @see org.xml.sax.ContentHandler#startDocument\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\n */\nDOMHandler.prototype = {\n\tstartDocument : function() {\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\n \tif (this.locator) {\n \tthis.doc.documentURI = this.locator.systemId;\n \t}\n\t},\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\n\t\tvar doc = this.doc;\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\n\t var len = attrs.length;\n\t appendElement(this, el);\n\t this.currentElement = el;\n\n\t\tthis.locator && position(this.locator,el)\n\t for (var i = 0 ; i < len; i++) {\n\t var namespaceURI = attrs.getURI(i);\n\t var value = attrs.getValue(i);\n\t var qName = attrs.getQName(i);\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\n\t\t\tattr.value = attr.nodeValue = value;\n\t\t\tel.setAttributeNode(attr)\n\t }\n\t},\n\tendElement:function(namespaceURI, localName, qName) {\n\t\tvar current = this.currentElement\n\t\tvar tagName = current.tagName;\n\t\tthis.currentElement = current.parentNode;\n\t},\n\tstartPrefixMapping:function(prefix, uri) {\n\t},\n\tendPrefixMapping:function(prefix) {\n\t},\n\tprocessingInstruction:function(target, data) {\n\t var ins = this.doc.createProcessingInstruction(target, data);\n\t this.locator && position(this.locator,ins)\n\t appendElement(this, ins);\n\t},\n\tignorableWhitespace:function(ch, start, length) {\n\t},\n\tcharacters:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t\t//console.log(chars)\n\t\tif(chars){\n\t\t\tif (this.cdata) {\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\n\t\t\t} else {\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\n\t\t\t}\n\t\t\tif(this.currentElement){\n\t\t\t\tthis.currentElement.appendChild(charNode);\n\t\t\t}else if(/^\\s*$/.test(chars)){\n\t\t\t\tthis.doc.appendChild(charNode);\n\t\t\t\t//process xml\n\t\t\t}\n\t\t\tthis.locator && position(this.locator,charNode)\n\t\t}\n\t},\n\tskippedEntity:function(name) {\n\t},\n\tendDocument:function() {\n\t\tthis.doc.normalize();\n\t},\n\tsetDocumentLocator:function (locator) {\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\n\t \tlocator.lineNumber = 0;\n\t }\n\t},\n\t//LexicalHandler\n\tcomment:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t var comm = this.doc.createComment(chars);\n\t this.locator && position(this.locator,comm)\n\t appendElement(this, comm);\n\t},\n\n\tstartCDATA:function() {\n\t //used in characters() methods\n\t this.cdata = true;\n\t},\n\tendCDATA:function() {\n\t this.cdata = false;\n\t},\n\n\tstartDTD:function(name, publicId, systemId) {\n\t\tvar impl = this.doc.implementation;\n\t if (impl && impl.createDocumentType) {\n\t var dt = impl.createDocumentType(name, publicId, systemId);\n\t this.locator && position(this.locator,dt)\n\t appendElement(this, dt);\n\t\t\t\t\tthis.doc.doctype = dt;\n\t }\n\t},\n\t/**\n\t * @see org.xml.sax.ErrorHandler\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\n\t */\n\twarning:function(error) {\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\n\t},\n\terror:function(error) {\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\n\t},\n\tfatalError:function(error) {\n\t\tthrow new ParseError(error, this.locator);\n\t}\n}\nfunction _locator(l){\n\tif(l){\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\n\t}\n}\nfunction _toString(chars,start,length){\n\tif(typeof chars == 'string'){\n\t\treturn chars.substr(start,length)\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\n\t\tif(chars.length >= start+length || start){\n\t\t\treturn new java.lang.String(chars,start,length)+'';\n\t\t}\n\t\treturn chars;\n\t}\n}\n\n/*\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\n * used method of org.xml.sax.ext.LexicalHandler:\n * #comment(chars, start, length)\n * #startCDATA()\n * #endCDATA()\n * #startDTD(name, publicId, systemId)\n *\n *\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\n * #endDTD()\n * #startEntity(name)\n * #endEntity(name)\n *\n *\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\n * IGNORED method of org.xml.sax.ext.DeclHandler\n * \t#attributeDecl(eName, aName, type, mode, value)\n * #elementDecl(name, model)\n * #externalEntityDecl(name, publicId, systemId)\n * #internalEntityDecl(name, value)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\n * IGNORED method of org.xml.sax.EntityResolver2\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\n * #resolveEntity(publicId, systemId)\n * #getExternalSubset(name, baseURI)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\n * IGNORED method of org.xml.sax.DTDHandler\n * #notationDecl(name, publicId, systemId) {};\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\n */\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\n\tDOMHandler.prototype[key] = function(){return null}\n})\n\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\nfunction appendElement (hander,node) {\n if (!hander.currentElement) {\n hander.doc.appendChild(node);\n } else {\n hander.currentElement.appendChild(node);\n }\n}//appendChild and setAttributeNS are preformance key\n\nexports.__DOMHandler = DOMHandler;\nexports.DOMParser = DOMParser;\n\n/**\n * @deprecated Import/require from main entry point instead\n */\nexports.DOMImplementation = dom.DOMImplementation;\n\n/**\n * @deprecated Import/require from main entry point instead\n */\nexports.XMLSerializer = dom.XMLSerializer;\n","var dom = require('./dom')\nexports.DOMImplementation = dom.DOMImplementation\nexports.XMLSerializer = dom.XMLSerializer\nexports.DOMParser = require('./dom-parser').DOMParser\n","/**\n * Core Utilities and Helpers\n * @module Core\n*/\nimport { DOMParser as XMLDOMParser } from \"@xmldom/xmldom\";\n\n/**\n * Vendor prefixed requestAnimationFrame\n * @returns {function} requestAnimationFrame\n * @memberof Core\n */\nexport const requestAnimationFrame = (typeof window != \"undefined\") ? ((window as any).requestAnimationFrame || (window as any).mozRequestAnimationFrame || (window as any).webkitRequestAnimationFrame || (window as any).msRequestAnimationFrame) : false;\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst _COMMENT_NODE = 8;\nconst _DOCUMENT_NODE = 9;\nconst _URL = typeof URL != \"undefined\" ? URL : (typeof window != \"undefined\" ? ((window as any).URL || (window as any).webkitURL || (window as any).mozURL) : undefined);\n\n/**\n * Generates a UUID\n * based on: http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\n * @returns {string} uuid\n * @memberof Core\n */\nexport function uuid(): string {\n\tlet d = new Date().getTime();\n\tconst uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n\t\tconst r = (d + Math.random()*16)%16 | 0;\n\t\td = Math.floor(d/16);\n\t\treturn (c==\"x\" ? r : (r&0x7|0x8)).toString(16);\n\t});\n\treturn uuid;\n}\n\n/**\n * Gets the height of a document\n * @returns {number} height\n * @memberof Core\n */\nexport function documentHeight(): number {\n\treturn Math.max(\n\t\t\tdocument.documentElement.clientHeight,\n\t\t\tdocument.body.scrollHeight,\n\t\t\tdocument.documentElement.scrollHeight,\n\t\t\tdocument.body.offsetHeight,\n\t\t\tdocument.documentElement.offsetHeight\n\t);\n}\n\n/**\n * Checks if a node is an element\n * @param {object} obj\n * @returns {boolean}\n * @memberof Core\n */\nexport function isElement(obj: unknown): boolean {\n\treturn !!(obj && (obj as Node).nodeType == 1);\n}\n\n/**\n * @param {any} n\n * @returns {boolean}\n * @memberof Core\n */\nexport function isNumber(n: unknown): boolean {\n\treturn !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\n/**\n * @param {any} n\n * @returns {boolean}\n * @memberof Core\n */\nexport function isFloat(n: unknown): boolean {\n\tconst f = parseFloat(n as string);\n\n\tif (isNumber(n) === false) {\n\t\treturn false;\n\t}\n\n\tif (typeof n === \"string\" && n.indexOf(\".\") > -1) {\n\t\treturn true;\n\t}\n\n\treturn Math.floor(f) !== f;\n}\n\n/**\n * Get a prefixed css property\n * @param {string} unprefixed\n * @returns {string}\n * @memberof Core\n */\nexport function prefixed(unprefixed: string): string {\n\tconst vendors = [\"Webkit\", \"webkit\", \"Moz\", \"O\", \"ms\" ];\n\tconst prefixes = [\"-webkit-\", \"-webkit-\", \"-moz-\", \"-o-\", \"-ms-\"];\n\tconst lower = unprefixed.toLowerCase();\n\tconst length = vendors.length;\n\n\tif (typeof(document) === \"undefined\" || typeof((document.body.style as any)[lower]) != \"undefined\") {\n\t\treturn unprefixed;\n\t}\n\n\tfor (let i = 0; i < length; i++) {\n\t\tif (typeof((document.body.style as any)[prefixes[i] + lower]) != \"undefined\") {\n\t\t\treturn prefixes[i] + lower;\n\t\t}\n\t}\n\n\treturn unprefixed;\n}\n\n/**\n * Apply defaults to an object\n * @param {object} obj\n * @returns {object}\n * @memberof Core\n */\nexport function defaults(obj: any, ..._sources: any[]): any {\n\tfor (let i = 1, length = arguments.length; i < length; i++) {\n\t\tconst source = arguments[i];\n\t\tfor (const prop in source) {\n\t\t\tif (obj[prop] === void 0) obj[prop] = source[prop];\n\t\t}\n\t}\n\treturn obj;\n}\n\n/**\n * Extend properties of an object\n * @param {object} target\n * @returns {object}\n * @memberof Core\n */\nexport function extend(target: any, ..._args: any[]): any {\n\tconst sources = [].slice.call(arguments, 1);\n\tsources.forEach(function (source: any) {\n\t\tif(!source) return;\n\t\tObject.getOwnPropertyNames(source).forEach(function(propName) {\n\t\t\tObject.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName)!);\n\t\t});\n\t});\n\treturn target;\n}\n\n/**\n * Fast quicksort insert for sorted array -- based on:\n * http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers\n * @param {any} item\n * @param {array} array\n * @param {function} [compareFunction]\n * @returns {number} location (in array)\n * @memberof Core\n */\nexport function insert(item: any, array: any[], compareFunction?: (a: any, b: any) => number): number {\n\tconst location = locationOf(item, array, compareFunction);\n\tarray.splice(location, 0, item);\n\n\treturn location;\n}\n\n/**\n * Finds where something would fit into a sorted array\n * @param {any} item\n * @param {array} array\n * @param {function} [compareFunction]\n * @param {function} [_start]\n * @param {function} [_end]\n * @returns {number} location (in array)\n * @memberof Core\n */\nexport function locationOf(item: any, array: any[], compareFunction?: (a: any, b: any) => number, _start?: number, _end?: number): number {\n\tconst start = _start || 0;\n\tconst end = _end || array.length;\n\tconst pivot = parseInt(start + (end - start) / 2 as any);\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\treturn 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn pivot;\n\t}\n\n\tconst compared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared >= 0 ? pivot : pivot + 1;\n\t}\n\tif(compared === 0) {\n\t\treturn pivot;\n\t}\n\tif(compared === -1) {\n\t\treturn locationOf(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn locationOf(item, array, compareFunction, start, pivot);\n\t}\n}\n\n/**\n * Finds index of something in a sorted array\n * Returns -1 if not found\n * @param {any} item\n * @param {array} array\n * @param {function} [compareFunction]\n * @param {function} [_start]\n * @param {function} [_end]\n * @returns {number} index (in array) or -1\n * @memberof Core\n */\nexport function indexOfSorted(item: any, array: any[], compareFunction?: (a: any, b: any) => number, _start?: number, _end?: number): number {\n\tconst start = _start || 0;\n\tconst end = _end || array.length;\n\tconst pivot = parseInt(start + (end - start) / 2 as any);\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\treturn 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn -1; // Not found\n\t}\n\n\tconst compared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared === 0 ? pivot : -1;\n\t}\n\tif(compared === 0) {\n\t\treturn pivot; // Found\n\t}\n\tif(compared === -1) {\n\t\treturn indexOfSorted(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn indexOfSorted(item, array, compareFunction, start, pivot);\n\t}\n}\n/**\n * Find the bounds of an element\n * taking padding and margin into account\n * @param {element} el\n * @returns {{ width: Number, height: Number}}\n * @memberof Core\n */\nexport function bounds(el: Element): { width: number; height: number } {\n\n\tconst style = window.getComputedStyle(el);\n\tconst widthProps = [\"width\", \"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tconst heightProps = [\"height\", \"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tlet width = 0;\n\tlet height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat((style as any)[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat((style as any)[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n}\n\n/**\n * Find the bounds of an element\n * taking padding, margin and borders into account\n * @param {element} el\n * @returns {{ width: Number, height: Number}}\n * @memberof Core\n */\nexport function borders(el: Element): { width: number; height: number } {\n\n\tconst style = window.getComputedStyle(el);\n\tconst widthProps = [\"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tconst heightProps = [\"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tlet width = 0;\n\tlet height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat((style as any)[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat((style as any)[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n}\n\n/**\n * Find the bounds of any node\n * allows for getting bounds of text nodes by wrapping them in a range\n * @param {node} node\n * @returns {BoundingClientRect}\n * @memberof Core\n */\nexport function nodeBounds(node: Node): DOMRect {\n\tlet elPos;\n\tconst doc = node.ownerDocument;\n\tif(node.nodeType == Node.TEXT_NODE){\n\t\tconst elRange = doc!.createRange();\n\t\telRange.selectNodeContents(node);\n\t\telPos = elRange.getBoundingClientRect();\n\t} else {\n\t\telPos = (node as Element).getBoundingClientRect();\n\t}\n\treturn elPos;\n}\n\n/**\n * Find the equivalent of getBoundingClientRect of a browser window\n * @returns {{ width: Number, height: Number, top: Number, left: Number, right: Number, bottom: Number }}\n * @memberof Core\n */\nexport function windowBounds(): { top: number; left: number; right: number; bottom: number; width: number; height: number } {\n\n\tconst width = window.innerWidth;\n\tconst height = window.innerHeight;\n\n\treturn {\n\t\ttop: 0,\n\t\tleft: 0,\n\t\tright: width,\n\t\tbottom: height,\n\t\twidth: width,\n\t\theight: height\n\t};\n\n}\n\n/**\n * Gets the index of a node in its parent\n * @param {Node} node\n * @param {string} typeId\n * @return {number} index\n * @memberof Core\n */\nexport function indexOfNode(node: Node, typeId: number): number {\n\tconst parent = node.parentNode!;\n\tconst children = parent.childNodes;\n\tlet sib;\n\tlet index = -1;\n\tfor (let i = 0; i < children.length; i++) {\n\t\tsib = children[i];\n\t\tif (sib.nodeType === typeId) {\n\t\t\tindex++;\n\t\t}\n\t\tif (sib == node) break;\n\t}\n\n\treturn index;\n}\n\n/**\n * Gets the index of a text node in its parent\n * @param {node} textNode\n * @returns {number} index\n * @memberof Core\n */\nexport function indexOfTextNode(textNode: Node): number {\n\treturn indexOfNode(textNode, TEXT_NODE);\n}\n\n/**\n * Gets the index of an element node in its parent\n * @param {element} elementNode\n * @returns {number} index\n * @memberof Core\n */\nexport function indexOfElementNode(elementNode: Node): number {\n\treturn indexOfNode(elementNode, ELEMENT_NODE);\n}\n\n/**\n * Check if extension is xml\n * @param {string} ext\n * @returns {boolean}\n * @memberof Core\n */\nexport function isXml(ext: string): boolean {\n\treturn [\"xml\", \"opf\", \"ncx\"].indexOf(ext) > -1;\n}\n\n/**\n * Create a new blob\n * @param {any} content\n * @param {string} mime\n * @returns {Blob}\n * @memberof Core\n */\nexport function createBlob(content: BlobPart, mime: string): Blob {\n\treturn new Blob([content], {type : mime });\n}\n\n/**\n * Create a new blob url\n * @param {any} content\n * @param {string} mime\n * @returns {string} url\n * @memberof Core\n */\nexport function createBlobUrl(content: BlobPart, mime: string): string {\n\tconst blob = createBlob(content, mime);\n\n\tconst tempUrl = _URL.createObjectURL(blob);\n\n\treturn tempUrl;\n}\n\n/**\n * Remove a blob url\n * @param {string} url\n * @memberof Core\n */\nexport function revokeBlobUrl(url: string): void {\n\treturn _URL.revokeObjectURL(url);\n}\n\n/**\n * Create a new base64 encoded url\n * @param {any} content\n * @param {string} mime\n * @returns {string} url\n * @memberof Core\n */\nexport function createBase64Url(content: string, mime: string): string | undefined {\n\tif (typeof(content) !== \"string\") {\n\t\t// Only handles strings\n\t\treturn;\n\t}\n\n\tconst data = btoa(content);\n\n\tconst datauri = \"data:\" + mime + \";base64,\" + data;\n\n\treturn datauri;\n}\n\n/**\n * Get type of an object\n * @param {object} obj\n * @returns {string} type\n * @memberof Core\n */\nexport function type(obj: unknown): string {\n\treturn Object.prototype.toString.call(obj).slice(8, -1);\n}\n\n/**\n * Parse xml (or html) markup\n * @param {string} markup\n * @param {string} mime\n * @param {boolean} forceXMLDom force using xmlDom to parse instead of native parser\n * @returns {document} document\n * @memberof Core\n */\nexport function parse(markup: string, mime: string, forceXMLDom?: boolean): Document {\n\tlet Parser;\n\n\tif (typeof DOMParser === \"undefined\" || forceXMLDom) {\n\t\tParser = XMLDOMParser;\n\t} else {\n\t\tParser = DOMParser;\n\t}\n\n\t// Remove byte order mark before parsing\n\t// https://www.w3.org/International/questions/qa-byte-order-mark\n\tif(markup.charCodeAt(0) === 0xFEFF) {\n\t\tmarkup = markup.slice(1);\n\t}\n\n\tconst doc = new Parser().parseFromString(markup, mime as DOMParserSupportedType);\n\n\treturn doc;\n}\n\n/**\n * querySelector polyfill\n * @param {element} el\n * @param {string} sel selector string\n * @returns {element} element\n * @memberof Core\n */\nexport function qs(el: Document | Element, sel: string): Element | undefined {\n\tlet elements;\n\tif (!el) {\n\t\tthrow new Error(\"No Element Provided\");\n\t}\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelector(sel) ?? undefined;\n\t} else {\n\t\telements = el.getElementsByTagName(sel);\n\t\tif (elements.length) {\n\t\t\treturn elements[0];\n\t\t}\n\t}\n}\n\n/**\n * querySelectorAll polyfill\n * @param {element} el\n * @param {string} sel selector string\n * @returns {element[]} elements\n * @memberof Core\n */\nexport function qsa(el: Document | Element, sel: string): NodeListOf<Element> | HTMLCollectionOf<Element> {\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelectorAll(sel);\n\t} else {\n\t\treturn el.getElementsByTagName(sel);\n\t}\n}\n\n/**\n * querySelector by property\n * @param {element} el\n * @param {string} sel selector string\n * @param {object[]} props\n * @returns {element[]} elements\n * @memberof Core\n */\nexport function qsp(el: Document | Element, sel: string, props: Record<string, string>): Element | undefined {\n\tlet q, filtered;\n\tif (typeof el.querySelector != \"undefined\") {\n\t\tsel += \"[\";\n\t\tfor (const prop in props) {\n\t\t\tsel += prop + \"~='\" + props[prop] + \"'\";\n\t\t}\n\t\tsel += \"]\";\n\t\treturn el.querySelector(sel) ?? undefined;\n\t} else {\n\t\tq = el.getElementsByTagName(sel);\n\t\tfiltered = Array.prototype.slice.call(q, 0).filter(function(el: Element) {\n\t\t\tfor (const prop in props) {\n\t\t\t\tif(el.getAttribute(prop) === props[prop]){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (filtered) {\n\t\t\treturn filtered[0];\n\t\t}\n\t}\n}\n\n/**\n * Sprint through all text nodes in a document\n * @memberof Core\n * @param {element} root element to start with\n * @param {function} func function to run on each element\n */\nexport function sprint(root: Node, func: (node: Node) => void): void {\n\tconst doc = root.ownerDocument || root;\n\tif (typeof((doc as Document).createTreeWalker) !== \"undefined\") {\n\t\ttreeWalker(root, func, NodeFilter.SHOW_TEXT);\n\t} else {\n\t\twalk(root, function(node) {\n\t\t\tif (node && node.nodeType === 3) { // Node.TEXT_NODE\n\t\t\t\tfunc(node);\n\t\t\t}\n\t\t\treturn false;\n\t\t}, true);\n\t}\n}\n\n/**\n * Create a treeWalker\n * @memberof Core\n * @param {element} root element to start with\n * @param {function} func function to run on each element\n * @param {function | object} filter function or object to filter with\n */\nexport function treeWalker(root: Node, func: (node: Node) => void, filter: number): void {\n\tconst treeWalker = document.createTreeWalker(root, filter, null);\n\tlet node;\n\twhile ((node = treeWalker.nextNode())) {\n\t\tfunc(node);\n\t}\n}\n\n/**\n * @memberof Core\n * @param {node} node\n * @param {callback} return false for continue,true for break inside callback\n */\nexport function walk(node: Node, callback: (node: Node) => boolean, _unused?: boolean): boolean | undefined {\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tlet child: Node | null = node.firstChild;\n\tif(child){\n\t\tdo{\n\t\t\tconst walked = walk(child,callback);\n\t\t\tif(walked){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tchild = child.nextSibling;\n\t\t} while(child);\n\t}\n}\n\n/**\n * Convert a blob to a base64 encoded string\n * @param {Blog} blob\n * @returns {string}\n * @memberof Core\n */\nexport function blob2base64(blob: Blob): Promise<string | ArrayBuffer> {\n\treturn new Promise(function(resolve, _reject) {\n\t\tconst reader = new FileReader();\n\t\treader.readAsDataURL(blob);\n\t\treader.onloadend = function() {\n\t\t\tresolve(reader.result!);\n\t\t};\n\t});\n}\n\n\n/**\n * Creates a new pending promise and provides methods to resolve or reject it.\n * From: https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred#backwards_forwards_compatible\n * @memberof Core\n */\nexport class defer {\n\tid: string;\n\tresolve!: (value?: any) => void;\n\treject!: (reason?: any) => void;\n\tpromise: Promise<any>;\n\n\tconstructor() {\n\t\tthis.id = uuid();\n\n\t\t/* A newly created Promise object.\n\t\t * Initially in pending state.\n\t\t */\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve;\n\t\t\tthis.reject = reject;\n\t\t});\n\t\tObject.freeze(this);\n\t}\n}\n\n/**\n * querySelector with filter by epub type\n * @param {element} html\n * @param {string} element element type to find\n * @param {string} type epub type to find\n * @returns {element[]} elements\n * @memberof Core\n */\nexport function querySelectorByType(html: Document | Element, element: string, type: string): Element | undefined {\n\tlet query;\n\tif (typeof html.querySelector != \"undefined\") {\n\t\tquery = html.querySelector(`${element}[*|type=\"${type}\"]`);\n\t}\n\t// Handle IE not supporting namespaced epub:type in querySelector\n\tif(!query || (query as any).length === 0) {\n\t\tquery = qsa(html, element);\n\t\tfor (let i = 0; i < query.length; i++) {\n\t\t\tif(query[i].getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") === type ||\n\t\t\t\t query[i].getAttribute(\"epub:type\") === type) {\n\t\t\t\treturn query[i];\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn query;\n\t}\n}\n\n/**\n * Find direct descendents of an element\n * @param {element} el\n * @returns {element[]} children\n * @memberof Core\n */\nexport function findChildren(el: Element): Element[] {\n\tconst result = [];\n\tconst childNodes = el.childNodes;\n\tfor (let i = 0; i < childNodes.length; i++) {\n\t\tconst node = childNodes[i];\n\t\tif (node.nodeType === 1) {\n\t\t\tresult.push(node as Element);\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Find all parents (ancestors) of an element\n * @param {element} node\n * @returns {element[]} parents\n * @memberof Core\n */\nexport function parents(node: Node | null | undefined): Node[] {\n\tconst nodes: Node[] = [];\n\tfor (let current: Node | null = node ?? null; current; current = current.parentNode) {\n\t\tnodes.unshift(current);\n\t}\n\treturn nodes\n}\n\n/**\n * Find all direct descendents of a specific type\n * @param {element} el\n * @param {string} nodeName\n * @param {boolean} [single]\n * @returns {element[]} children\n * @memberof Core\n */\nexport function filterChildren(el: Element, nodeName: string, single?: boolean): Element | Element[] | undefined {\n\tconst result = [];\n\tconst childNodes = el.childNodes;\n\tfor (let i = 0; i < childNodes.length; i++) {\n\t\tconst node = childNodes[i];\n\t\tif (node.nodeType === 1 && node.nodeName.toLowerCase() === nodeName) {\n\t\t\tif (single) {\n\t\t\t\treturn node as Element;\n\t\t\t} else {\n\t\t\t\tresult.push(node as Element);\n\t\t\t}\n\t\t}\n\t}\n\tif (!single) {\n\t\treturn result;\n\t}\n}\n\n/**\n * Filter all parents (ancestors) with tag name\n * @param {element} node\n * @param {string} tagname\n * @returns {element[]} parents\n * @memberof Core\n */\nexport function getParentByTagName(node: Node, tagname: string): Element | undefined {\n\tlet parent;\n\tif (node === null || tagname === \"\") return;\n\tparent = node.parentNode;\n\twhile (parent && parent.nodeType === 1) {\n\t\tif ((parent as Element).tagName.toLowerCase() === tagname) {\n\t\t\treturn parent as Element;\n\t\t}\n\t\tparent = parent.parentNode;\n\t}\n}\n\n/**\n * Lightweight Polyfill for DOM Range\n * @class\n * @memberof Core\n */\nexport class RangeObject {\n\tcollapsed: boolean;\n\tcommonAncestorContainer: Node | undefined;\n\tendContainer: Node | undefined;\n\tendOffset: number | undefined;\n\tstartContainer: Node | undefined;\n\tstartOffset: number | undefined;\n\n\tconstructor() {\n\t\tthis.collapsed = false;\n\t\tthis.commonAncestorContainer = undefined;\n\t\tthis.endContainer = undefined;\n\t\tthis.endOffset = undefined;\n\t\tthis.startContainer = undefined;\n\t\tthis.startOffset = undefined;\n\t}\n\n\tsetStart(startNode: Node, startOffset: number): void {\n\t\tthis.startContainer = startNode;\n\t\tthis.startOffset = startOffset;\n\n\t\tif (!this.endContainer) {\n\t\t\tthis.collapse(true);\n\t\t} else {\n\t\t\tthis.commonAncestorContainer = this._commonAncestorContainer();\n\t\t}\n\n\t\tthis._checkCollapsed();\n\t}\n\n\tsetEnd(endNode: Node, endOffset: number): void {\n\t\tthis.endContainer = endNode;\n\t\tthis.endOffset = endOffset;\n\n\t\tif (!this.startContainer) {\n\t\t\tthis.collapse(false);\n\t\t} else {\n\t\t\tthis.collapsed = false;\n\t\t\tthis.commonAncestorContainer = this._commonAncestorContainer();\n\t\t}\n\n\t\tthis._checkCollapsed();\n\t}\n\n\tcollapse(toStart: boolean): void {\n\t\tthis.collapsed = true;\n\t\tif (toStart) {\n\t\t\tthis.endContainer = this.startContainer;\n\t\t\tthis.endOffset = this.startOffset;\n\t\t\tthis.commonAncestorContainer = this.startContainer?.parentNode ?? undefined;\n\t\t} else {\n\t\t\tthis.startContainer = this.endContainer;\n\t\t\tthis.startOffset = this.endOffset;\n\t\t\tthis.commonAncestorContainer = this.endContainer?.parentNode ?? undefined;\n\t\t}\n\t}\n\n\tselectNode(referenceNode: Node): void {\n\t\tconst parent = referenceNode.parentNode!;\n\t\tconst index = Array.prototype.indexOf.call(parent.childNodes, referenceNode);\n\t\tthis.setStart(parent, index);\n\t\tthis.setEnd(parent, index + 1);\n\t}\n\n\tselectNodeContents(referenceNode: Node): void {\n\t\tconst endIndex = (referenceNode.nodeType === 3) ?\n\t\t\t\t(referenceNode.textContent ?? \"\").length : referenceNode.childNodes.length;\n\t\tthis.setStart(referenceNode, 0);\n\t\tthis.setEnd(referenceNode, endIndex);\n\t}\n\n\t_commonAncestorContainer(startContainer?: Node, endContainer?: Node): Node | undefined {\n\t\tconst startParents = parents(startContainer ?? this.startContainer);\n\t\tconst endParents = parents(endContainer ?? this.endContainer);\n\n\t\tif (startParents[0] != endParents[0]) return undefined;\n\n\t\tfor (let i = 0; i < startParents.length; i++) {\n\t\t\tif (startParents[i] != endParents[i]) {\n\t\t\t\treturn startParents[i - 1];\n\t\t\t}\n\t\t}\n\t}\n\n\t_checkCollapsed(): void {\n\t\tif (this.startContainer === this.endContainer &&\n\t\t\t\tthis.startOffset === this.endOffset) {\n\t\t\tthis.collapsed = true;\n\t\t} else {\n\t\t\tthis.collapsed = false;\n\t\t}\n\t}\n\n\ttoString(): string {\n\t\t// TODO: implement walking between start and end to find text\n\t\treturn \"\";\n\t}\n}\n","/**\n * Minimal POSIX path utilities for browser use.\n * Replaces the path-webpack dependency.\n */\nimport type { ParsedPath } from \"../types\";\n\nfunction assertPath(path: any): void {\n\tif (typeof path !== \"string\") {\n\t\tthrow new TypeError(\"Path must be a string. Received \" + path);\n\t}\n}\n\nfunction normalizeStringPosix(path: string, allowAboveRoot: boolean): string {\n\tlet res = \"\";\n\tlet lastSlash = -1;\n\tlet dots = 0;\n\tlet code;\n\tfor (let i = 0; i <= path.length; ++i) {\n\t\tif (i < path.length)\n\t\t\tcode = path.charCodeAt(i);\n\t\telse if (code === 47)\n\t\t\tbreak;\n\t\telse\n\t\t\tcode = 47;\n\t\tif (code === 47) {\n\t\t\tif (lastSlash === i - 1 || dots === 1) {\n\t\t\t\t// NOOP\n\t\t\t} else if (lastSlash !== i - 1 && dots === 2) {\n\t\t\t\tif (res.length < 2 ||\n\t\t\t\t\tres.charCodeAt(res.length - 1) !== 46 ||\n\t\t\t\t\tres.charCodeAt(res.length - 2) !== 46) {\n\t\t\t\t\tif (res.length > 2) {\n\t\t\t\t\t\tconst start = res.length - 1;\n\t\t\t\t\t\tlet j = start;\n\t\t\t\t\t\tfor (; j >= 0; --j) {\n\t\t\t\t\t\t\tif (res.charCodeAt(j) === 47)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j !== start) {\n\t\t\t\t\t\t\tif (j === -1)\n\t\t\t\t\t\t\t\tres = \"\";\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tres = res.slice(0, j);\n\t\t\t\t\t\t\tlastSlash = i;\n\t\t\t\t\t\t\tdots = 0;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (res.length === 2 || res.length === 1) {\n\t\t\t\t\t\tres = \"\";\n\t\t\t\t\t\tlastSlash = i;\n\t\t\t\t\t\tdots = 0;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (allowAboveRoot) {\n\t\t\t\t\tif (res.length > 0)\n\t\t\t\t\t\tres += \"/..\";\n\t\t\t\t\telse\n\t\t\t\t\t\tres = \"..\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (res.length > 0)\n\t\t\t\t\tres += \"/\" + path.slice(lastSlash + 1, i);\n\t\t\t\telse\n\t\t\t\t\tres = path.slice(lastSlash + 1, i);\n\t\t\t}\n\t\t\tlastSlash = i;\n\t\t\tdots = 0;\n\t\t} else if (code === 46 && dots !== -1) {\n\t\t\t++dots;\n\t\t} else {\n\t\t\tdots = -1;\n\t\t}\n\t}\n\treturn res;\n}\n\nexport function resolve(..._args: string[]): string {\n\tlet resolvedPath = \"\";\n\tlet resolvedAbsolute = false;\n\n\tfor (let i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n\t\tlet path;\n\t\tif (i >= 0)\n\t\t\tpath = arguments[i];\n\t\telse {\n\t\t\tpath = \"/\";\n\t\t}\n\n\t\tassertPath(path);\n\n\t\tif (path.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tresolvedPath = path + \"/\" + resolvedPath;\n\t\tresolvedAbsolute = path.charCodeAt(0) === 47;\n\t}\n\n\tresolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n\tif (resolvedAbsolute) {\n\t\tif (resolvedPath.length > 0)\n\t\t\treturn \"/\" + resolvedPath;\n\t\telse\n\t\t\treturn \"/\";\n\t} else if (resolvedPath.length > 0) {\n\t\treturn resolvedPath;\n\t} else {\n\t\treturn \".\";\n\t}\n}\n\nexport function relative(from: string, to: string): string {\n\tassertPath(from);\n\tassertPath(to);\n\n\tif (from === to)\n\t\treturn \"\";\n\n\tfrom = resolve(from);\n\tto = resolve(to);\n\n\tif (from === to)\n\t\treturn \"\";\n\n\tlet fromStart = 1;\n\tfor (; fromStart < from.length; ++fromStart) {\n\t\tif (from.charCodeAt(fromStart) !== 47)\n\t\t\tbreak;\n\t}\n\tconst fromEnd = from.length;\n\tconst fromLen = (fromEnd - fromStart);\n\n\tlet toStart = 1;\n\tfor (; toStart < to.length; ++toStart) {\n\t\tif (to.charCodeAt(toStart) !== 47)\n\t\t\tbreak;\n\t}\n\tconst toEnd = to.length;\n\tconst toLen = (toEnd - toStart);\n\n\tconst length = (fromLen < toLen ? fromLen : toLen);\n\tlet lastCommonSep = -1;\n\tlet i = 0;\n\tfor (; i <= length; ++i) {\n\t\tif (i === length) {\n\t\t\tif (toLen > length) {\n\t\t\t\tif (to.charCodeAt(toStart + i) === 47) {\n\t\t\t\t\treturn to.slice(toStart + i + 1);\n\t\t\t\t} else if (i === 0) {\n\t\t\t\t\treturn to.slice(toStart + i);\n\t\t\t\t}\n\t\t\t} else if (fromLen > length) {\n\t\t\t\tif (from.charCodeAt(fromStart + i) === 47) {\n\t\t\t\t\tlastCommonSep = i;\n\t\t\t\t} else if (i === 0) {\n\t\t\t\t\tlastCommonSep = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tconst fromCode = from.charCodeAt(fromStart + i);\n\t\tconst toCode = to.charCodeAt(toStart + i);\n\t\tif (fromCode !== toCode)\n\t\t\tbreak;\n\t\telse if (fromCode === 47)\n\t\t\tlastCommonSep = i;\n\t}\n\n\tlet out = \"\";\n\tfor (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n\t\tif (i === fromEnd || from.charCodeAt(i) === 47) {\n\t\t\tif (out.length === 0)\n\t\t\t\tout += \"..\";\n\t\t\telse\n\t\t\t\tout += \"/..\";\n\t\t}\n\t}\n\n\tif (out.length > 0)\n\t\treturn out + to.slice(toStart + lastCommonSep);\n\telse {\n\t\ttoStart += lastCommonSep;\n\t\tif (to.charCodeAt(toStart) === 47)\n\t\t\t++toStart;\n\t\treturn to.slice(toStart);\n\t}\n}\n\nexport function dirname(path: string): string {\n\tassertPath(path);\n\tif (path.length === 0)\n\t\treturn \".\";\n\tlet code = path.charCodeAt(0);\n\tconst hasRoot = (code === 47);\n\tlet end = -1;\n\tlet matchedSlash = true;\n\tfor (let i = path.length - 1; i >= 1; --i) {\n\t\tcode = path.charCodeAt(i);\n\t\tif (code === 47) {\n\t\t\tif (!matchedSlash) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tmatchedSlash = false;\n\t\t}\n\t}\n\n\tif (end === -1)\n\t\treturn hasRoot ? \"/\" : \".\";\n\tif (hasRoot && end === 1)\n\t\treturn \"//\";\n\treturn path.slice(0, end);\n}\n\nexport function isAbsolute(path: string): boolean {\n\tassertPath(path);\n\treturn path.length > 0 && path.charCodeAt(0) === 47;\n}\n\nexport function parse(path: string): ParsedPath {\n\tassertPath(path);\n\n\tconst ret = { root: \"\", dir: \"\", base: \"\", ext: \"\", name: \"\" };\n\tif (path.length === 0)\n\t\treturn ret;\n\tlet code = path.charCodeAt(0);\n\tconst isAbs = (code === 47);\n\tlet start;\n\tif (isAbs) {\n\t\tret.root = \"/\";\n\t\tstart = 1;\n\t} else {\n\t\tstart = 0;\n\t}\n\tlet startDot = -1;\n\tlet startPart = 0;\n\tlet end = -1;\n\tlet matchedSlash = true;\n\tlet i = path.length - 1;\n\tlet preDotState = 0;\n\n\tfor (; i >= start; --i) {\n\t\tcode = path.charCodeAt(i);\n\t\tif (code === 47) {\n\t\t\tif (!matchedSlash) {\n\t\t\t\tstartPart = i + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (end === -1) {\n\t\t\tmatchedSlash = false;\n\t\t\tend = i + 1;\n\t\t}\n\t\tif (code === 46) {\n\t\t\tif (startDot === -1)\n\t\t\t\tstartDot = i;\n\t\t\telse if (preDotState !== 1)\n\t\t\t\tpreDotState = 1;\n\t\t} else if (startDot !== -1) {\n\t\t\tpreDotState = -1;\n\t\t}\n\t}\n\n\tif (startDot === -1 ||\n\t\tend === -1 ||\n\t\tpreDotState === 0 ||\n\t\t(preDotState === 1 &&\n\t\t\tstartDot === end - 1 &&\n\t\t\tstartDot === startPart + 1)) {\n\t\tif (end !== -1) {\n\t\t\tif (startPart === 0 && isAbs)\n\t\t\t\tret.base = ret.name = path.slice(1, end);\n\t\t\telse\n\t\t\t\tret.base = ret.name = path.slice(startPart, end);\n\t\t}\n\t} else {\n\t\tif (startPart === 0 && isAbs) {\n\t\t\tret.name = path.slice(1, startDot);\n\t\t\tret.base = path.slice(1, end);\n\t\t} else {\n\t\t\tret.name = path.slice(startPart, startDot);\n\t\t\tret.base = path.slice(startPart, end);\n\t\t}\n\t\tret.ext = path.slice(startDot, end);\n\t}\n\n\tif (startPart > 0)\n\t\tret.dir = path.slice(0, startPart - 1);\n\telse if (isAbs)\n\t\tret.dir = \"/\";\n\n\treturn ret;\n}\n\nconst pathUtils = { resolve, relative, dirname, isAbsolute, parse };\nexport default pathUtils;\n","import path from \"./path-utils\";\nimport type { ParsedPath } from \"../types\";\n\n/**\n * Creates a Path object for parsing and manipulation of a path strings\n *\n * Uses a polyfill for Nodejs path: https://nodejs.org/api/path.html\n * @param\t{string} pathString\ta url string (relative or absolute)\n * @class\n */\nclass Path {\n\tpath: string;\n\tdirectory: string;\n\tfilename: string;\n\textension: string;\n\n\tconstructor(pathString: string) {\n\t\tconst protocol = pathString.indexOf(\"://\");\n\t\tif (protocol > -1) {\n\t\t\tpathString = new URL(pathString).pathname;\n\t\t}\n\n\t\tconst parsed = this.parse(pathString);\n\n\t\tthis.path = pathString;\n\n\t\tif (this.isDirectory(pathString)) {\n\t\t\tthis.directory = pathString;\n\t\t\tthis.filename = \"\";\n\t\t\tthis.extension = \"\";\n\t\t} else {\n\t\t\tthis.directory = parsed.dir + \"/\";\n\t\t\tthis.filename = parsed.base;\n\t\t\tthis.extension = parsed.ext.slice(1);\n\t\t}\n\n\t}\n\n\t/**\n\t * Parse the path: https://nodejs.org/api/path.html#path_path_parse_path\n\t * @param\t{string} what\n\t * @returns {object}\n\t */\n\tparse (what: string): ParsedPath {\n\t\treturn path.parse(what);\n\t}\n\n\t/**\n\t * @param\t{string} what\n\t * @returns {boolean}\n\t */\n\tisAbsolute (what?: string): boolean {\n\t\treturn path.isAbsolute(what || this.path);\n\t}\n\n\t/**\n\t * Check if path ends with a directory\n\t * @param\t{string} what\n\t * @returns {boolean}\n\t */\n\tisDirectory (what: string): boolean {\n\t\treturn (what.charAt(what.length-1) === \"/\");\n\t}\n\n\t/**\n\t * Resolve a path against the directory of the Path\n\t *\n\t * https://nodejs.org/api/path.html#path_path_resolve_paths\n\t * @param\t{string} what\n\t * @returns {string} resolved\n\t */\n\tresolve (what: string): string {\n\t\treturn path.resolve(this.directory, what);\n\t}\n\n\t/**\n\t * Resolve a path relative to the directory of the Path\n\t *\n\t * https://nodejs.org/api/path.html#path_path_relative_from_to\n\t * @param\t{string} what\n\t * @returns {string} relative\n\t */\n\trelative (what: string): string {\n\t\tconst isAbsolute = what && (what.indexOf(\"://\") > -1);\n\n\t\tif (isAbsolute) {\n\t\t\treturn what;\n\t\t}\n\n\t\treturn path.relative(this.directory, what);\n\t}\n\n\tsplitPath(filename: string): string[] {\n\t\treturn (this as any).splitPathRe.exec(filename).slice(1);\n\t}\n\n\t/**\n\t * Return the path string\n\t * @returns {string} path\n\t */\n\ttoString (): string {\n\t\treturn this.path;\n\t}\n}\n\nexport default Path;\n","import Path from \"./path\";\nimport path from \"./path-utils\";\n\n/**\n * creates a Url object for parsing and manipulation of a url string\n * @param\t{string} urlString\ta url string (relative or absolute)\n * @param\t{string} [baseString] optional base for the url,\n * default to window.location.href\n */\nclass Url {\n\tUrl: URL | undefined;\n\thref: string;\n\tprotocol: string;\n\torigin: string;\n\thash: string;\n\tsearch: string;\n\tbase: string | false | undefined;\n\tPath: Path;\n\tdirectory: string;\n\tfilename: string;\n\textension: string;\n\n\tconstructor(urlString: string, baseString?: string | false) {\n\t\tconst absolute = (urlString.indexOf(\"://\") > -1);\n\t\tlet pathname = urlString;\n\t\tlet basePath;\n\n\t\tthis.Url = undefined;\n\t\tthis.href = urlString;\n\t\tthis.protocol = \"\";\n\t\tthis.origin = \"\";\n\t\tthis.hash = \"\";\n\t\tthis.hash = \"\";\n\t\tthis.search = \"\";\n\t\tthis.base = baseString;\n\n\t\tif (!absolute &&\n\t\t\t\tbaseString !== false &&\n\t\t\t\ttypeof(baseString) !== \"string\" &&\n\t\t\t\twindow && window.location) {\n\t\t\tthis.base = window.location.href;\n\t\t}\n\n\t\t// URL Polyfill doesn't throw an error if base is empty\n\t\tif (absolute || this.base) {\n\t\t\ttry {\n\t\t\t\tif (this.base) { // Safari doesn't like an undefined base\n\t\t\t\t\tthis.Url = new URL(urlString, this.base);\n\t\t\t\t} else {\n\t\t\t\t\tthis.Url = new URL(urlString);\n\t\t\t\t}\n\t\t\t\tthis.href = this.Url.href;\n\n\t\t\t\tthis.protocol = this.Url.protocol;\n\t\t\t\tthis.origin = this.Url.origin;\n\t\t\t\tif (this.origin === \"null\" && this.protocol === \"file:\") {\n\t\t\t\t\tthis.origin = \"file://\";\n\t\t\t\t}\n\t\t\t\tthis.hash = this.Url.hash;\n\t\t\t\tthis.search = this.Url.search;\n\n\t\t\t\tpathname = this.Url.pathname + (this.Url.search ? this.Url.search : \"\");\n\t\t\t} catch (_e) {\n\t\t\t\t// Skip URL parsing\n\t\t\t\tthis.Url = undefined;\n\t\t\t\t// resolve the pathname from the base\n\t\t\t\tif (this.base) {\n\t\t\t\t\tbasePath = new Path(this.base);\n\t\t\t\t\tpathname = basePath.resolve(pathname);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.Path = new Path(pathname);\n\n\t\tthis.directory = this.Path.directory;\n\t\tthis.filename = this.Path.filename;\n\t\tthis.extension = this.Path.extension;\n\n\t}\n\n\t/**\n\t * @returns {Path}\n\t */\n\tpath (): Path {\n\t\treturn this.Path;\n\t}\n\n\t/**\n\t * Resolves a relative path to a absolute url\n\t * @param {string} what\n\t * @returns {string} url\n\t */\n\tresolve (what: string): string {\n\t\tconst isAbsolute = (what.indexOf(\"://\") > -1);\n\n\t\tif (isAbsolute) {\n\t\t\treturn what;\n\t\t}\n\n\t\tconst fullpath = path.resolve(this.directory, what);\n\t\treturn this.origin + fullpath;\n\t}\n\n\t/**\n\t * Resolve a path relative to the url\n\t * @param {string} what\n\t * @returns {string} path\n\t */\n\trelative (what: string): string {\n\t\treturn path.relative(what, this.directory);\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\ttoString (): string {\n\t\treturn this.href;\n\t}\n}\n\nexport default Url;\n","import {extend, type, findChildren, RangeObject, isNumber} from \"./utils/core\";\nimport type { EpubCFIStep, EpubCFIComponent } from \"./types\";\n\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst _COMMENT_NODE = 8;\nconst DOCUMENT_NODE = 9;\n\n/**\n\t* Parsing and creation of EpubCFIs: http://www.idpf.org/epub/linking/cfi/epub-cfi.html\n\n\t* Implements:\n\t* - Character Offset: epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3)\n\t* - Simple Ranges : epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4)\n\n\t* Does Not Implement:\n\t* - Temporal Offset (~)\n\t* - Spatial Offset (@)\n\t* - Temporal-Spatial Offset (~ + @)\n\t* - Text Location Assertion ([)\n\t* @class\n\t@param {string | Range | Node } [cfiFrom]\n\t@param {string | object} [base]\n\t@param {string} [ignoreClass] class to ignore when parsing DOM\n*/\nclass EpubCFI {\n\tstr: string;\n\tbase: EpubCFIComponent | any;\n\tspinePos: number;\n\trange: boolean;\n\tpath: EpubCFIComponent | any;\n\tstart: EpubCFIComponent | null;\n\tend: EpubCFIComponent | null;\n\tid: string | null;\n\n\tconstructor(cfiFrom?: string | Range | Node | EpubCFI, base?: string | EpubCFIComponent, ignoreClass?: string) {\n\t\tthis.str = \"\";\n\n\t\tthis.base = {};\n\t\tthis.spinePos = 0; // For compatibility\n\n\t\tthis.range = false; // true || false;\n\n\t\tthis.path = {};\n\t\tthis.start = null;\n\t\tthis.end = null;\n\n\t\t// Allow instantiation without the \"new\" keyword\n\t\tif (!(this instanceof EpubCFI)) {\n\t\t\treturn new EpubCFI(cfiFrom, base, ignoreClass);\n\t\t}\n\n\t\tif(typeof base === \"string\") {\n\t\t\tthis.base = this.parseComponent(base);\n\t\t} else if(typeof base === \"object\" && base.steps) {\n\t\t\tthis.base = base;\n\t\t}\n\n\t\tconst type = this.checkType(cfiFrom);\n\n\n\t\tif(type === \"string\") {\n\t\t\tthis.str = cfiFrom as string;\n\t\t\treturn extend(this, this.parse(cfiFrom as string));\n\t\t} else if (type === \"range\") {\n\t\t\treturn extend(this, this.fromRange(cfiFrom as Range, this.base, ignoreClass));\n\t\t} else if (type === \"node\") {\n\t\t\treturn extend(this, this.fromNode(cfiFrom as Node, this.base, ignoreClass));\n\t\t} else if (type === \"EpubCFI\" && (cfiFrom as EpubCFI).path) {\n\t\t\treturn cfiFrom as EpubCFI;\n\t\t} else if (!cfiFrom) {\n\t\t\treturn this;\n\t\t} else {\n\t\t\tthrow new TypeError(\"not a valid argument for EpubCFI\");\n\t\t}\n\n\t}\n\n\t/**\n\t * Check the type of constructor input\n\t * @private\n\t */\n\tcheckType(cfi: string | Range | Node | EpubCFI | undefined): string | false {\n\n\t\tif (this.isCfiString(cfi)) {\n\t\t\treturn \"string\";\n\t\t// Is a range object\n\t\t} else if (cfi && typeof cfi === \"object\" && (type(cfi) === \"Range\" || typeof((cfi as Range).startContainer) != \"undefined\")){\n\t\t\treturn \"range\";\n\t\t} else if (cfi && typeof cfi === \"object\" && typeof((cfi as Node).nodeType) != \"undefined\" ){ // || typeof cfi === \"function\"\n\t\t\treturn \"node\";\n\t\t} else if (cfi && typeof cfi === \"object\" && cfi instanceof EpubCFI){\n\t\t\treturn \"EpubCFI\";\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Parse a cfi string to a CFI object representation\n\t * @param {string} cfiStr\n\t * @returns {object} cfi\n\t */\n\tparse(cfiStr: string): any {\n\t\tconst cfi: any = {\n\t\t\tspinePos: -1,\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\t\tif(typeof cfiStr !== \"string\") {\n\t\t\treturn {spinePos: -1};\n\t\t}\n\n\t\tif(cfiStr.indexOf(\"epubcfi(\") === 0 && cfiStr[cfiStr.length-1] === \")\") {\n\t\t\t// Remove initial epubcfi( and ending )\n\t\t\tcfiStr = cfiStr.slice(8, cfiStr.length-1);\n\t\t}\n\n\t\tconst baseComponent = this.getChapterComponent(cfiStr);\n\n\t\t// Make sure this is a valid cfi or return\n\t\tif(!baseComponent) {\n\t\t\treturn {spinePos: -1};\n\t\t}\n\n\t\tcfi.base = this.parseComponent(baseComponent);\n\n\t\tconst pathComponent = this.getPathComponent(cfiStr);\n\t\tcfi.path = this.parseComponent(pathComponent!);\n\n\t\tconst range = this.getRange(cfiStr);\n\n\t\tif(range) {\n\t\t\tcfi.range = true;\n\t\t\tcfi.start = this.parseComponent(range[0]);\n\t\t\tcfi.end = this.parseComponent(range[1]);\n\t\t}\n\n\t\t// Get spine node position\n\t\t// cfi.spineSegment = cfi.base.steps[1];\n\n\t\t// Chapter segment is always the second step\n\t\tcfi.spinePos = cfi.base.steps[1].index;\n\n\t\treturn cfi;\n\t}\n\n\tparseComponent(componentStr: string): EpubCFIComponent {\n\t\tconst component: EpubCFIComponent = {\n\t\t\tsteps: [],\n\t\t\tterminal: {\n\t\t\t\toffset: null,\n\t\t\t\tassertion: null\n\t\t\t}\n\t\t};\n\t\tconst parts = componentStr.split(\":\");\n\t\tconst steps = parts[0].split(\"/\");\n\t\tlet terminal;\n\n\t\tif(parts.length > 1) {\n\t\t\tterminal = parts[1];\n\t\t\tcomponent.terminal = this.parseTerminal(terminal);\n\t\t}\n\n\t\tif (steps[0] === \"\") {\n\t\t\tsteps.shift(); // Ignore the first slash\n\t\t}\n\n\t\tcomponent.steps = steps.map(function(step: string){\n\t\t\treturn this.parseStep(step);\n\t\t}.bind(this));\n\n\t\treturn component;\n\t}\n\n\tparseStep(stepStr: string): EpubCFIStep | undefined {\n\t\tlet type, index, id;\n\n\t\tconst has_brackets = stepStr.match(/\\[(.*)\\]/);\n\t\tif(has_brackets && has_brackets[1]){\n\t\t\tid = has_brackets[1];\n\t\t}\n\n\t\t//-- Check if step is a text node or element\n\t\tconst num = parseInt(stepStr);\n\n\t\tif(isNaN(num)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(num % 2 === 0) { // Even = is an element\n\t\t\ttype = \"element\";\n\t\t\tindex = num / 2 - 1;\n\t\t} else {\n\t\t\ttype = \"text\";\n\t\t\tindex = (num - 1 ) / 2;\n\t\t}\n\n\t\treturn {\n\t\t\t\"type\" : type,\n\t\t\t\"index\" : index,\n\t\t\t\"id\" : id || null,\n\t\t\t\"tagName\" : \"\"\n\t\t};\n\t}\n\n\tparseTerminal(termialStr: string): { offset: number | null; assertion: string | null } {\n\t\tlet characterOffset: number | null;\n\t\tlet textLocationAssertion: string | null = null;\n\t\tconst assertion = termialStr.match(/\\[(.*)\\]/);\n\n\t\tif(assertion && assertion[1]){\n\t\t\tcharacterOffset = parseInt(termialStr.split(\"[\")[0]);\n\t\t\ttextLocationAssertion = assertion[1];\n\t\t} else {\n\t\t\tcharacterOffset = parseInt(termialStr);\n\t\t}\n\n\t\tif (!isNumber(characterOffset)) {\n\t\t\tcharacterOffset = null;\n\t\t}\n\n\t\treturn {\n\t\t\t\"offset\": characterOffset,\n\t\t\t\"assertion\": textLocationAssertion\n\t\t};\n\n\t}\n\n\tgetChapterComponent(cfiStr: string): string {\n\n\t\tconst indirection = cfiStr.split(\"!\");\n\n\t\treturn indirection[0];\n\t}\n\n\tgetPathComponent(cfiStr: string): string | undefined {\n\n\t\tconst indirection = cfiStr.split(\"!\");\n\n\t\tif(indirection[1]) {\n\t\t\tconst ranges = indirection[1].split(\",\");\n\t\t\treturn ranges[0];\n\t\t}\n\n\t}\n\n\tgetRange(cfiStr: string): [string, string] | false {\n\n\t\tconst ranges = cfiStr.split(\",\");\n\n\t\tif(ranges.length === 3){\n\t\t\treturn [\n\t\t\t\tranges[1],\n\t\t\t\tranges[2]\n\t\t\t];\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetCharecterOffsetComponent(cfiStr: string): string {\n\t\tconst splitStr = cfiStr.split(\":\");\n\t\treturn splitStr[1] || \"\";\n\t}\n\n\tjoinSteps(steps: EpubCFIStep[]): string {\n\t\tif(!steps) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn steps.map(function(part){\n\t\t\tlet segment = \"\";\n\n\t\t\tif(part.type === \"element\") {\n\t\t\t\tsegment += (part.index + 1) * 2;\n\t\t\t}\n\n\t\t\tif(part.type === \"text\") {\n\t\t\t\tsegment += 1 + (2 * part.index); // TODO: double check that this is odd\n\t\t\t}\n\n\t\t\tif(part.id) {\n\t\t\t\tsegment += \"[\" + part.id + \"]\";\n\t\t\t}\n\n\t\t\treturn segment;\n\n\t\t}).join(\"/\");\n\n\t}\n\n\tsegmentString(segment: EpubCFIComponent): string {\n\t\tlet segmentString = \"/\";\n\n\t\tsegmentString += this.joinSteps(segment.steps);\n\n\t\tif(segment.terminal && segment.terminal.offset != null){\n\t\t\tsegmentString += \":\" + segment.terminal.offset;\n\t\t}\n\n\t\tif(segment.terminal && segment.terminal.assertion != null){\n\t\t\tsegmentString += \"[\" + segment.terminal.assertion + \"]\";\n\t\t}\n\n\t\treturn segmentString;\n\t}\n\n\t/**\n\t * Convert CFI to a epubcfi(...) string\n\t * @returns {string} epubcfi\n\t */\n\ttoString(): string {\n\t\tlet cfiString = \"epubcfi(\";\n\n\t\tcfiString += this.segmentString(this.base);\n\n\t\tcfiString += \"!\";\n\t\tcfiString += this.segmentString(this.path);\n\n\t\t// Add Range, if present\n\t\tif(this.range && this.start) {\n\t\t\tcfiString += \",\";\n\t\t\tcfiString += this.segmentString(this.start);\n\t\t}\n\n\t\tif(this.range && this.end) {\n\t\t\tcfiString += \",\";\n\t\t\tcfiString += this.segmentString(this.end);\n\t\t}\n\n\t\tcfiString += \")\";\n\n\t\treturn cfiString;\n\t}\n\n\n\t/**\n\t * Compare which of two CFIs is earlier in the text\n\t * @returns {number} First is earlier = -1, Second is earlier = 1, They are equal = 0\n\t */\n\tcompare(cfiOne: string | EpubCFI, cfiTwo: string | EpubCFI): number {\n\t\tlet stepsA, stepsB;\n\t\tlet terminalA, terminalB;\n\n\t\tlet _rangeAStartSteps, _rangeAEndSteps;\n\t\tlet _rangeBStartSteps, _rangeBEndSteps;\n\t\tlet _rangeAStartTerminal, _rangeAEndTerminal;\n\t\tlet _rangeBStartTerminal, _rangeBEndTerminal;\n\n\t\tif(typeof cfiOne === \"string\") {\n\t\t\tcfiOne = new EpubCFI(cfiOne);\n\t\t}\n\t\tif(typeof cfiTwo === \"string\") {\n\t\t\tcfiTwo = new EpubCFI(cfiTwo);\n\t\t}\n\t\t// Compare Spine Positions\n\t\tif(cfiOne.spinePos > cfiTwo.spinePos) {\n\t\t\treturn 1;\n\t\t}\n\t\tif(cfiOne.spinePos < cfiTwo.spinePos) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (cfiOne.range) {\n\t\t\tstepsA = cfiOne.path.steps.concat(cfiOne.start!.steps);\n\t\t\tterminalA = cfiOne.start!.terminal;\n\t\t} else {\n\t\t\tstepsA = cfiOne.path.steps;\n\t\t\tterminalA = cfiOne.path.terminal;\n\t\t}\n\n\t\tif (cfiTwo.range) {\n\t\t\tstepsB = cfiTwo.path.steps.concat(cfiTwo.start!.steps);\n\t\t\tterminalB = cfiTwo.start!.terminal;\n\t\t} else {\n\t\t\tstepsB = cfiTwo.path.steps;\n\t\t\tterminalB = cfiTwo.path.terminal;\n\t\t}\n\n\t\t// Compare Each Step in the First item\n\t\tfor (let i = 0; i < stepsA.length; i++) {\n\t\t\tif(!stepsA[i]) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif(!stepsB[i]) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif(stepsA[i].index > stepsB[i].index) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif(stepsA[i].index < stepsB[i].index) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\t// Otherwise continue checking\n\t\t}\n\n\t\t// All steps in First equal to Second and First is Less Specific\n\t\tif(stepsA.length < stepsB.length) {\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Compare the character offset of the text node\n\t\tif(terminalA.offset > terminalB.offset) {\n\t\t\treturn 1;\n\t\t}\n\t\tif(terminalA.offset < terminalB.offset) {\n\t\t\treturn -1;\n\t\t}\n\n\t\t// CFI's are equal\n\t\treturn 0;\n\t}\n\n\tstep(node: Node): EpubCFIStep {\n\t\tconst nodeType = (node.nodeType === TEXT_NODE) ? \"text\" : \"element\";\n\n\t\treturn {\n\t\t\t\"id\" : (node as Element).id,\n\t\t\t\"tagName\" : (node as Element).tagName,\n\t\t\t\"type\" : nodeType,\n\t\t\t\"index\" : this.position(node)\n\t\t};\n\t}\n\n\tfilteredStep(node: Node, ignoreClass: string): EpubCFIStep | undefined {\n\t\tconst filteredNode = this.filter(node, ignoreClass);\n\n\t\t// Node filtered, so ignore\n\t\tif (!filteredNode) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Otherwise add the filter node in\n\t\tconst nodeType = (filteredNode.nodeType === TEXT_NODE) ? \"text\" : \"element\";\n\n\t\treturn {\n\t\t\t\"id\" : (filteredNode as Element).id,\n\t\t\t\"tagName\" : (filteredNode as Element).tagName,\n\t\t\t\"type\" : nodeType,\n\t\t\t\"index\" : this.filteredPosition(filteredNode, ignoreClass)\n\t\t};\n\t}\n\n\tpathTo(node: Node, offset: number | null, ignoreClass?: string): EpubCFIComponent {\n\t\tconst segment: EpubCFIComponent = {\n\t\t\tsteps: [],\n\t\t\tterminal: {\n\t\t\t\toffset: null,\n\t\t\t\tassertion: null\n\t\t\t}\n\t\t};\n\t\tlet currentNode = node;\n\t\tlet step;\n\n\t\twhile(currentNode && currentNode.parentNode &&\n\t\t\t\t\tcurrentNode.parentNode.nodeType != DOCUMENT_NODE) {\n\n\t\t\tif (ignoreClass) {\n\t\t\t\tstep = this.filteredStep(currentNode, ignoreClass);\n\t\t\t} else {\n\t\t\t\tstep = this.step(currentNode);\n\t\t\t}\n\n\t\t\tif (step) {\n\t\t\t\tsegment.steps.unshift(step);\n\t\t\t}\n\n\t\t\tcurrentNode = currentNode.parentNode;\n\n\t\t}\n\n\t\tif (offset != null && offset >= 0) {\n\n\t\t\tsegment.terminal.offset = offset;\n\n\t\t\t// Make sure we are getting to a textNode if there is an offset\n\t\t\tif(segment.steps[segment.steps.length-1].type != \"text\") {\n\t\t\t\tsegment.steps.push({\n\t\t\t\t\t\"type\" : \"text\",\n\t\t\t\t\t\"index\" : 0,\n\t\t\t\t\t\"id\" : null,\n\t\t\t\t\t\"tagName\" : \"\"\n\t\t\t\t});\n\t\t\t}\n\n\t\t}\n\n\n\t\treturn segment;\n\t}\n\n\tequalStep(stepA: EpubCFIStep, stepB: EpubCFIStep): boolean {\n\t\tif (!stepA || !stepB) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(stepA.index === stepB.index &&\n\t\t\t stepA.id === stepB.id &&\n\t\t\t stepA.type === stepB.type) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Create a CFI object from a Range\n\t * @param {Range} range\n\t * @param {string | object} base\n\t * @param {string} [ignoreClass]\n\t * @returns {object} cfi\n\t */\n\tfromRange(range: Range, base: string | EpubCFIComponent, ignoreClass?: string): Partial<EpubCFI> {\n\t\tconst cfi: any = {\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\n\t\tconst start = range.startContainer;\n\t\tconst end = range.endContainer;\n\n\t\tlet startOffset = range.startOffset;\n\t\tlet endOffset = range.endOffset;\n\n\t\tlet needsIgnoring = false;\n\n\t\tif (ignoreClass) {\n\t\t\t// Tell pathTo if / what to ignore\n\t\t\tneedsIgnoring = (start.ownerDocument!.querySelector(\".\" + ignoreClass) != null);\n\t\t}\n\n\n\t\tif (typeof base === \"string\") {\n\t\t\tcfi.base = this.parseComponent(base);\n\t\t\tcfi.spinePos = cfi.base.steps[1].index;\n\t\t} else if (typeof base === \"object\") {\n\t\t\tcfi.base = base;\n\t\t}\n\n\t\tif (range.collapsed) {\n\t\t\tif (needsIgnoring) {\n\t\t\t\tstartOffset = this.patchOffset(start, startOffset, ignoreClass!);\n\t\t\t}\n\t\t\tcfi.path = this.pathTo(start, startOffset, ignoreClass);\n\t\t} else {\n\t\t\tcfi.range = true;\n\n\t\t\tif (needsIgnoring) {\n\t\t\t\tstartOffset = this.patchOffset(start, startOffset, ignoreClass!);\n\t\t\t}\n\n\t\t\tcfi.start = this.pathTo(start, startOffset, ignoreClass);\n\t\t\tif (needsIgnoring) {\n\t\t\t\tendOffset = this.patchOffset(end, endOffset, ignoreClass!);\n\t\t\t}\n\n\t\t\tcfi.end = this.pathTo(end, endOffset, ignoreClass);\n\n\t\t\t// Create a new empty path\n\t\t\tcfi.path = {\n\t\t\t\tsteps: [],\n\t\t\t\tterminal: null\n\t\t\t};\n\n\t\t\t// Push steps that are shared between start and end to the common path\n\t\t\tconst len = cfi.start.steps.length;\n\t\t\tlet i;\n\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tif (this.equalStep(cfi.start.steps[i], cfi.end.steps[i])) {\n\t\t\t\t\tif(i === len-1) {\n\t\t\t\t\t\t// Last step is equal, check terminals\n\t\t\t\t\t\tif(cfi.start.terminal === cfi.end.terminal) {\n\t\t\t\t\t\t\t// CFI's are equal\n\t\t\t\t\t\t\tcfi.path.steps.push(cfi.start.steps[i]);\n\t\t\t\t\t\t\t// Not a range\n\t\t\t\t\t\t\tcfi.range = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcfi.path.steps.push(cfi.start.steps[i]);\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcfi.start.steps = cfi.start.steps.slice(cfi.path.steps.length);\n\t\t\tcfi.end.steps = cfi.end.steps.slice(cfi.path.steps.length);\n\n\t\t\t// TODO: Add Sanity check to make sure that the end if greater than the start\n\t\t}\n\n\t\treturn cfi;\n\t}\n\n\t/**\n\t * Create a CFI object from a Node\n\t * @param {Node} anchor\n\t * @param {string | object} base\n\t * @param {string} [ignoreClass]\n\t * @returns {object} cfi\n\t */\n\tfromNode(anchor: Node, base: string | EpubCFIComponent, ignoreClass?: string): Partial<EpubCFI> {\n\t\tconst cfi: any = {\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\n\t\tif (typeof base === \"string\") {\n\t\t\tcfi.base = this.parseComponent(base);\n\t\t\tcfi.spinePos = cfi.base.steps[1].index;\n\t\t} else if (typeof base === \"object\") {\n\t\t\tcfi.base = base;\n\t\t}\n\n\t\tcfi.path = this.pathTo(anchor, null, ignoreClass);\n\n\t\treturn cfi;\n\t}\n\n\tfilter(anchor: Node, ignoreClass: string): Node | false {\n\t\tlet needsIgnoring;\n\t\tlet sibling; // to join with\n\t\tlet parent, previousSibling, nextSibling;\n\t\tlet isText = false;\n\n\t\tif (anchor.nodeType === TEXT_NODE) {\n\t\t\tisText = true;\n\t\t\tparent = anchor.parentNode;\n\t\t\tneedsIgnoring = (anchor.parentNode as Element).classList.contains(ignoreClass);\n\t\t} else {\n\t\t\tisText = false;\n\t\t\tneedsIgnoring = (anchor as Element).classList.contains(ignoreClass);\n\t\t}\n\n\t\tif (needsIgnoring && isText) {\n\t\t\tpreviousSibling = parent!.previousSibling;\n\t\t\tnextSibling = parent!.nextSibling;\n\n\t\t\t// If the sibling is a text node, join the nodes\n\t\t\tif (previousSibling && previousSibling.nodeType === TEXT_NODE) {\n\t\t\t\tsibling = previousSibling;\n\t\t\t} else if (nextSibling && nextSibling.nodeType === TEXT_NODE) {\n\t\t\t\tsibling = nextSibling;\n\t\t\t}\n\n\t\t\tif (sibling) {\n\t\t\t\treturn sibling;\n\t\t\t} else {\n\t\t\t\t// Parent will be ignored on next step\n\t\t\t\treturn anchor;\n\t\t\t}\n\n\t\t} else if (needsIgnoring && !isText) {\n\t\t\t// Otherwise just skip the element node\n\t\t\treturn false;\n\t\t} else {\n\t\t\t// No need to filter\n\t\t\treturn anchor;\n\t\t}\n\n\t}\n\n\tpatchOffset(anchor: Node, offset: number, ignoreClass: string): number {\n\t\tif (anchor.nodeType != TEXT_NODE) {\n\t\t\tthrow new Error(\"Anchor must be a text node\");\n\t\t}\n\n\t\tlet curr = anchor;\n\t\tlet totalOffset = offset;\n\n\t\t// If the parent is a ignored node, get offset from it's start\n\t\tif ((anchor.parentNode as Element).classList.contains(ignoreClass)) {\n\t\t\tcurr = anchor.parentNode!;\n\t\t}\n\n\t\twhile (curr.previousSibling) {\n\t\t\tif(curr.previousSibling.nodeType === ELEMENT_NODE) {\n\t\t\t\t// Originally a text node, so join\n\t\t\t\tif((curr.previousSibling as Element).classList.contains(ignoreClass)){\n\t\t\t\t\ttotalOffset += (curr.previousSibling.textContent ?? \"\").length;\n\t\t\t\t} else {\n\t\t\t\t\tbreak; // Normal node, dont join\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the previous sibling is a text node, join the nodes\n\t\t\t\ttotalOffset += (curr.previousSibling.textContent ?? \"\").length;\n\t\t\t}\n\n\t\t\tcurr = curr.previousSibling;\n\t\t}\n\n\t\treturn totalOffset;\n\n\t}\n\n\tnormalizedMap(children: NodeListOf<ChildNode>, nodeType: number, ignoreClass: string): Record<number, number> {\n\t\tconst output: Record<number, number> = {};\n\t\tlet prevIndex = -1;\n\t\tlet i;\n\t\tconst len = children.length;\n\t\tlet currNodeType;\n\t\tlet prevNodeType;\n\n\t\tfor (i = 0; i < len; i++) {\n\n\t\t\tcurrNodeType = children[i].nodeType;\n\n\t\t\t// Check if needs ignoring\n\t\t\tif (currNodeType === ELEMENT_NODE &&\n\t\t\t\t\t(children[i] as Element).classList.contains(ignoreClass)) {\n\t\t\t\tcurrNodeType = TEXT_NODE;\n\t\t\t}\n\n\t\t\tif (i > 0 &&\n\t\t\t\t\tcurrNodeType === TEXT_NODE &&\n\t\t\t\t\tprevNodeType === TEXT_NODE) {\n\t\t\t\t// join text nodes\n\t\t\t\toutput[i] = prevIndex;\n\t\t\t} else if (nodeType === currNodeType){\n\t\t\t\tprevIndex = prevIndex + 1;\n\t\t\t\toutput[i] = prevIndex;\n\t\t\t}\n\n\t\t\tprevNodeType = currNodeType;\n\n\t\t}\n\n\t\treturn output;\n\t}\n\n\tposition(anchor: Node): number {\n\t\tlet children, index;\n\t\tif (anchor.nodeType === ELEMENT_NODE) {\n\t\t\tchildren = (anchor.parentNode as Element).children;\n\t\t\tif (!children) {\n\t\t\t\tchildren = findChildren(anchor.parentNode as Element);\n\t\t\t}\n\t\t\tindex = Array.prototype.indexOf.call(children, anchor);\n\t\t} else {\n\t\t\tchildren = this.textNodes(anchor.parentNode!);\n\t\t\tindex = children.indexOf(anchor);\n\t\t}\n\n\t\treturn index;\n\t}\n\n\tfilteredPosition(anchor: Node, ignoreClass: string): number {\n\t\tlet children, map;\n\n\t\tif (anchor.nodeType === ELEMENT_NODE) {\n\t\t\tchildren = (anchor.parentNode as Element).children;\n\t\t\tmap = this.normalizedMap(children as any, ELEMENT_NODE, ignoreClass);\n\t\t} else {\n\t\t\tchildren = anchor.parentNode!.childNodes;\n\t\t\t// Inside an ignored node\n\t\t\tif((anchor.parentNode as Element).classList.contains(ignoreClass)) {\n\t\t\t\tanchor = anchor.parentNode!;\n\t\t\t\tchildren = anchor.parentNode!.childNodes;\n\t\t\t}\n\t\t\tmap = this.normalizedMap(children, TEXT_NODE, ignoreClass);\n\t\t}\n\n\n\t\tconst index = Array.prototype.indexOf.call(children, anchor);\n\n\t\treturn map[index];\n\t}\n\n\tstepsToXpath(steps: EpubCFIStep[]): string {\n\t\tconst xpath = [\".\", \"*\"];\n\n\t\tsteps.forEach(function(step){\n\t\t\tconst position = step.index + 1;\n\n\t\t\tif(step.id){\n\t\t\t\txpath.push(\"*[position()=\" + position + \" and @id='\" + step.id + \"']\");\n\t\t\t} else if(step.type === \"text\") {\n\t\t\t\txpath.push(\"text()[\" + position + \"]\");\n\t\t\t} else {\n\t\t\t\txpath.push(\"*[\" + position + \"]\");\n\t\t\t}\n\t\t});\n\n\t\treturn xpath.join(\"/\");\n\t}\n\n\n\t/*\n\n\tTo get the last step if needed:\n\n\t// Get the terminal step\n\tlastStep = steps[steps.length-1];\n\t// Get the query string\n\tquery = this.stepsToQuery(steps);\n\t// Find the containing element\n\tstartContainerParent = doc.querySelector(query);\n\t// Find the text node within that element\n\tif(startContainerParent && lastStep.type == \"text\") {\n\t\tcontainer = startContainerParent.childNodes[lastStep.index];\n\t}\n\t*/\n\tstepsToQuerySelector(steps: EpubCFIStep[]): string {\n\t\tconst query = [\"html\"];\n\n\t\tsteps.forEach(function(step){\n\t\t\tconst position = step.index + 1;\n\n\t\t\tif(step.id){\n\t\t\t\tquery.push(\"#\" + step.id);\n\t\t\t} else if(step.type === \"text\") {\n\t\t\t\t// unsupported in querySelector\n\t\t\t\t// query.push(\"text()[\" + position + \"]\");\n\t\t\t} else {\n\t\t\t\tquery.push(\"*:nth-child(\" + position + \")\");\n\t\t\t}\n\t\t});\n\n\t\treturn query.join(\">\");\n\n\t}\n\n\ttextNodes(container: Node, ignoreClass?: string): Node[] {\n\t\treturn Array.prototype.slice.call(container.childNodes).\n\t\t\tfilter(function (node: Node) {\n\t\t\t\tif (node.nodeType === TEXT_NODE) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else if (ignoreClass && (node as Element).classList.contains(ignoreClass)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t}\n\n\twalkToNode(steps: EpubCFIStep[], _doc?: Document, ignoreClass?: string): Node | undefined {\n\t\tconst doc = _doc || document;\n\t\tlet container: Node = doc.documentElement;\n\t\tlet children;\n\t\tlet step;\n\t\tconst len = steps.length;\n\t\tlet i;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tstep = steps[i];\n\n\t\t\tif(step.type === \"element\") {\n\t\t\t\t//better to get a container using id as some times step.index may not be correct\n\t\t\t\t//For ex.https://github.com/futurepress/epub.js/issues/561\n\t\t\t\tif(step.id) {\n\t\t\t\t\tcontainer = doc.getElementById(step.id)!;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tchildren = (container as Element).children || findChildren(container as Element);\n\t\t\t\t\tcontainer = children[step.index];\n\t\t\t\t}\n\t\t\t} else if(step.type === \"text\") {\n\t\t\t\tcontainer = this.textNodes(container, ignoreClass)[step.index];\n\t\t\t}\n\t\t\tif(!container) {\n\t\t\t\t//Break the for loop as due to incorrect index we can get error if\n\t\t\t\t//container is undefined so that other functionailties works fine\n\t\t\t\t//like navigation\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\n\t\treturn container;\n\t}\n\n\tfindNode(steps: EpubCFIStep[], _doc?: Document, ignoreClass?: string): Node | undefined {\n\t\tconst doc = _doc || document;\n\t\tlet container;\n\t\tlet xpath;\n\n\t\tif(!ignoreClass && typeof doc.evaluate != \"undefined\") {\n\t\t\txpath = this.stepsToXpath(steps);\n\t\t\tcontainer = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue ?? undefined;\n\t\t} else if(ignoreClass) {\n\t\t\tcontainer = this.walkToNode(steps, doc, ignoreClass);\n\t\t} else {\n\t\t\tcontainer = this.walkToNode(steps, doc);\n\t\t}\n\n\t\treturn container;\n\t}\n\n\tfixMiss(steps: EpubCFIStep[], offset: number, _doc?: Document, ignoreClass?: string): { container: Node; offset: number } {\n\t\tlet container = this.findNode(steps.slice(0,-1), _doc, ignoreClass)!;\n\t\tconst children = container.childNodes;\n\t\tconst map = this.normalizedMap(children, TEXT_NODE, ignoreClass!);\n\t\tlet child;\n\t\tlet len;\n\t\tconst lastStepIndex = steps[steps.length-1].index;\n\n\t\tfor (const childIndex in map) {\n\t\t\tif (!map.hasOwnProperty(childIndex)) continue;\n\n\t\t\tif(map[childIndex] === lastStepIndex) {\n\t\t\t\tchild = children[childIndex as any];\n\t\t\t\tlen = (child.textContent ?? \"\").length;\n\t\t\t\tif(offset > len) {\n\t\t\t\t\toffset = offset - len;\n\t\t\t\t} else {\n\t\t\t\t\tif (child.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\tcontainer = child.childNodes[0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontainer = child;\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\n\t\treturn {\n\t\t\tcontainer: container!,\n\t\t\toffset: offset\n\t\t};\n\n\t}\n\n\t/**\n\t * Creates a DOM range representing a CFI\n\t * @param {document} _doc document referenced in the base\n\t * @param {string} [ignoreClass]\n\t * @return {Range}\n\t */\n\ttoRange(_doc?: Document, ignoreClass?: string): Range | null {\n\t\tconst doc = _doc || document;\n\t\tlet range;\n\t\tlet start, end, startContainer, endContainer;\n\t\tconst cfi = this;\n\t\tlet startSteps, endSteps;\n\t\tconst needsIgnoring = ignoreClass ? (doc.querySelector(\".\" + ignoreClass) != null) : false;\n\t\tlet missed;\n\n\t\tif (typeof(doc.createRange) !== \"undefined\") {\n\t\t\trange = doc.createRange();\n\t\t} else {\n\t\t\trange = new RangeObject();\n\t\t}\n\n\t\tif (cfi.range) {\n\t\t\tstart = cfi.start!;\n\t\t\tstartSteps = cfi.path.steps.concat(start.steps);\n\t\t\tstartContainer = this.findNode(startSteps, doc, needsIgnoring ? ignoreClass : undefined);\n\t\t\tend = cfi.end!;\n\t\t\tendSteps = cfi.path.steps.concat(end.steps);\n\t\t\tendContainer = this.findNode(endSteps, doc, needsIgnoring ? ignoreClass : undefined);\n\t\t} else {\n\t\t\tstart = cfi.path;\n\t\t\tstartSteps = cfi.path.steps;\n\t\t\tstartContainer = this.findNode(cfi.path.steps, doc, needsIgnoring ? ignoreClass : undefined);\n\t\t}\n\n\t\tif(startContainer) {\n\t\t\ttry {\n\n\t\t\t\tif(start.terminal.offset != null) {\n\t\t\t\t\trange.setStart(startContainer, start.terminal.offset);\n\t\t\t\t} else {\n\t\t\t\t\trange.setStart(startContainer, 0);\n\t\t\t\t}\n\n\t\t\t} catch (_e) {\n\t\t\t\tmissed = this.fixMiss(startSteps, start.terminal.offset!, doc, needsIgnoring ? ignoreClass : undefined);\n\t\t\t\trange.setStart(missed.container, missed.offset);\n\t\t\t}\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(\"No startContainer found for\", this.toString());\n\t\t\t// No start found\n\t\t\treturn null;\n\t\t}\n\n\t\tif (endContainer) {\n\t\t\ttry {\n\n\t\t\t\tif(end!.terminal.offset != null) {\n\t\t\t\t\trange.setEnd(endContainer, end!.terminal.offset);\n\t\t\t\t} else {\n\t\t\t\t\trange.setEnd(endContainer, 0);\n\t\t\t\t}\n\n\t\t\t} catch (_e) {\n\t\t\t\tmissed = this.fixMiss(endSteps!, cfi.end!.terminal.offset!, doc, needsIgnoring ? ignoreClass : undefined);\n\t\t\t\trange.setEnd(missed.container, missed.offset);\n\t\t\t}\n\t\t}\n\n\n\t\t// doc.defaultView.getSelection().addRange(range);\n\t\treturn range as Range;\n\t}\n\n\t/**\n\t * Check if a string is wrapped with \"epubcfi()\"\n\t * @param {string} str\n\t * @returns {boolean}\n\t */\n\tisCfiString(str: unknown): boolean {\n\t\tif(typeof str === \"string\" &&\n\t\t\tstr.indexOf(\"epubcfi(\") === 0 &&\n\t\t\tstr[str.length-1] === \")\") {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgenerateChapterComponent(_spineNodeIndex: number, _pos: number | string, id?: string): string {\n\t\tconst pos = parseInt(_pos as string),\n\t\t\t\tspineNodeIndex = (_spineNodeIndex + 1) * 2;\n\t\tlet cfi = \"/\"+spineNodeIndex+\"/\";\n\n\t\tcfi += (pos + 1) * 2;\n\n\t\tif(id) {\n\t\t\tcfi += \"[\" + id + \"]\";\n\t\t}\n\n\t\treturn cfi;\n\t}\n\n\t/**\n\t * Collapse a CFI Range to a single CFI Position\n\t * @param {boolean} [toStart=false]\n\t */\n\tcollapse(toStart?: boolean): void {\n\t\tif (!this.range) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.range = false;\n\n\t\tif (toStart) {\n\t\t\tthis.path.steps = this.path.steps.concat(this.start!.steps);\n\t\t\tthis.path.terminal = this.start!.terminal;\n\t\t} else {\n\t\t\tthis.path.steps = this.path.steps.concat(this.end!.steps);\n\t\t\tthis.path.terminal = this.end!.terminal;\n\t\t}\n\n\t}\n}\n\nexport default EpubCFI;\n","/**\n * Hooks allow for injecting functions that must all complete in order before finishing\n * They will execute in parallel but all must finish before continuing\n * Functions may return a promise if they are async.\n * @param {any} context scope of this\n * @example this.content = new EPUBJS.Hook(this);\n */\nclass Hook {\n\tcontext: any;\n\thooks: Function[];\n\n\tconstructor(context?: any){\n\t\tthis.context = context || this;\n\t\tthis.hooks = [];\n\t}\n\n\t/**\n\t * Adds a function to be run before a hook completes\n\t * @example this.content.register(function(){...});\n\t */\n\tregister(..._args: any[]): void {\n\t\tfor(let i = 0; i < arguments.length; ++i) {\n\t\t\tif (typeof arguments[i] === \"function\") {\n\t\t\t\tthis.hooks.push(arguments[i]);\n\t\t\t} else {\n\t\t\t\t// unpack array\n\t\t\t\tfor(let j = 0; j < arguments[i].length; ++j) {\n\t\t\t\t\tthis.hooks.push(arguments[i][j]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes a function\n\t * @example this.content.deregister(function(){...});\n\t */\n\tderegister(func: Function): void {\n\t\tlet hook;\n\t\tfor (let i = 0; i < this.hooks.length; i++) {\n\t\t\thook = this.hooks[i];\n\t\t\tif (hook === func) {\n\t\t\t\tthis.hooks.splice(i, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Triggers a hook to run all functions\n\t * @example this.content.trigger(args).then(function(){...});\n\t */\n\ttrigger(..._args: any[]): Promise<any[]> {\n\t\tconst args = arguments;\n\t\tconst context = this.context;\n\t\tconst promises: any[] = [];\n\n\t\tthis.hooks.forEach(function(task) {\n\t\t\tlet executing;\n\t\t\ttry {\n\t\t\t\texecuting = task.apply(context, args);\n\t\t\t} catch (_err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(_err);\n\t\t\t}\n\n\t\t\tif(executing && typeof executing[\"then\"] === \"function\") {\n\t\t\t\t// Task is a function that returns a promise\n\t\t\t\tpromises.push(executing);\n\t\t\t}\n\t\t\t// Otherwise Task resolves immediately, continue\n\t\t});\n\n\n\t\treturn Promise.all(promises);\n\t}\n\n\t// Adds a function to be run before a hook completes\n\tlist(): Function[] {\n\t\treturn this.hooks;\n\t}\n\n\tclear(): Function[] {\n\t\treturn this.hooks = [];\n\t}\n}\nexport default Hook;\n","import { qs } from \"./core\";\nimport Url from \"./url\";\n\nexport function replaceBase(doc: Document, section: { url: string }): void {\n\tlet base;\n\tlet url = section.url;\n\tconst absolute = (url.indexOf(\"://\") > -1);\n\n\tif(!doc){\n\t\treturn;\n\t}\n\n\tconst head = qs(doc, \"head\");\n\tbase = qs(head!, \"base\");\n\n\tif(!base) {\n\t\tbase = doc.createElement(\"base\");\n\t\thead!.insertBefore(base, head!.firstChild);\n\t}\n\n\t// Fix for Safari crashing if the url doesn't have an origin\n\tif (!absolute && window && window.location) {\n\t\turl = window.location.origin + url;\n\t}\n\n\tbase.setAttribute(\"href\", url);\n}\n\nexport function replaceCanonical(doc: Document, section: { canonical: string }): void {\n\tlet link;\n\tconst url = section.canonical;\n\n\tif(!doc){\n\t\treturn;\n\t}\n\n\tconst head = qs(doc, \"head\");\n\tlink = qs(head!, \"link[rel='canonical']\");\n\n\tif (link) {\n\t\tlink.setAttribute(\"href\", url);\n\t} else {\n\t\tlink = doc.createElement(\"link\");\n\t\tlink.setAttribute(\"rel\", \"canonical\");\n\t\tlink.setAttribute(\"href\", url);\n\t\thead!.appendChild(link);\n\t}\n}\n\nexport function replaceMeta(doc: Document, section: { idref: string }): void {\n\tlet meta;\n\tconst id = section.idref;\n\tif(!doc){\n\t\treturn;\n\t}\n\n\tconst head = qs(doc, \"head\");\n\tmeta = qs(head!, \"link[property='dc.identifier']\");\n\n\tif (meta) {\n\t\tmeta.setAttribute(\"content\", id);\n\t} else {\n\t\tmeta = doc.createElement(\"meta\");\n\t\tmeta.setAttribute(\"name\", \"dc.identifier\");\n\t\tmeta.setAttribute(\"content\", id);\n\t\thead!.appendChild(meta);\n\t}\n}\n\n// TODO: move me to Contents\nexport function replaceLinks(contents: Element, fn: (path: string) => void): void {\n\n\tconst links = contents.querySelectorAll(\"a[href]\");\n\n\tif (!links.length) {\n\t\treturn;\n\t}\n\n\tconst base = qs(contents.ownerDocument, \"base\");\n\tconst location = base ? base.getAttribute(\"href\") ?? undefined : undefined;\n\tconst replaceLink = function(link: Element){\n\t\tconst href = link.getAttribute(\"href\") ?? \"\";\n\n\t\tif(href.indexOf(\"mailto:\") === 0){\n\t\t\treturn;\n\t\t}\n\n\t\tconst absolute = (href.indexOf(\"://\") > -1);\n\n\t\tif(absolute){\n\n\t\t\tlink.setAttribute(\"target\", \"_blank\");\n\n\t\t}else{\n\t\t\tlet linkUrl: Url | undefined;\n\t\t\ttry {\n\t\t\t\tlinkUrl = new Url(href, location);\n\t\t\t} catch(_error) {\n\t\t\t\t// NOOP\n\t\t\t}\n\n\t\t\t(link as HTMLElement).onclick = function(){\n\n\t\t\t\tif(linkUrl && linkUrl.hash) {\n\t\t\t\t\tfn(linkUrl.Path.path + linkUrl.hash);\n\t\t\t\t} else if(linkUrl){\n\t\t\t\t\tfn(linkUrl.Path.path);\n\t\t\t\t} else {\n\t\t\t\t\tfn(href);\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}\n\t}.bind(this);\n\n\tfor (let i = 0; i < links.length; i++) {\n\t\treplaceLink(links[i]);\n\t}\n\n\n}\n\nexport function substitute(content: string, urls: string[], replacements: string[]): string {\n\turls.forEach(function(url, i){\n\t\tif (url && replacements[i]) {\n\t\t\t// Account for special characters in the file name.\n\t\t\t// See https://stackoverflow.com/a/6318729.\n\t\t\turl = url.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n\t\t\tcontent = content.replace(new RegExp(url, \"g\"), replacements[i]);\n\t\t}\n\t});\n\treturn content;\n}\n","import {defer, isXml, parse} from \"./core\";\nimport Path from \"./path\";\n\nfunction request(url: string, type?: string, withCredentials?: boolean, headers?: Record<string, string>): Promise<any> {\n\tconst supportsURL = (typeof window != \"undefined\") ? window.URL : false; // TODO: fallback for url if window isn't defined\n\tconst BLOB_RESPONSE: XMLHttpRequestResponseType = supportsURL ? \"blob\" : \"arraybuffer\";\n\n\tconst deferred = new defer();\n\n\tconst xhr = new XMLHttpRequest();\n\n\t//-- Check from PDF.js:\n\t// https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js\n\tconst xhrPrototype = XMLHttpRequest.prototype;\n\n\tlet header;\n\n\tif (!(\"overrideMimeType\" in xhrPrototype)) {\n\t\t// IE10 might have response, but not overrideMimeType\n\t\tObject.defineProperty(xhrPrototype, \"overrideMimeType\", {\n\t\t\tvalue: function xmlHttpRequestOverrideMimeType() {}\n\t\t});\n\t}\n\n\tif(withCredentials) {\n\t\txhr.withCredentials = true;\n\t}\n\n\txhr.onreadystatechange = handler;\n\txhr.onerror = err;\n\n\txhr.open(\"GET\", url, true);\n\n\tfor(header in headers) {\n\t\txhr.setRequestHeader(header, headers![header]);\n\t}\n\n\tif(type == \"json\") {\n\t\txhr.setRequestHeader(\"Accept\", \"application/json\");\n\t}\n\n\t// If type isn\"t set, determine it from the file extension\n\tif(!type) {\n\t\ttype = new Path(url).extension;\n\t}\n\n\tif(type == \"blob\"){\n\t\txhr.responseType = BLOB_RESPONSE;\n\t}\n\n\n\tif(isXml(type)) {\n\t\t// xhr.responseType = \"document\";\n\t\txhr.overrideMimeType(\"text/xml\"); // for OPF parsing\n\t}\n\n\tif(type == \"xhtml\") {\n\t\t// xhr.responseType = \"document\";\n\t}\n\n\tif(type == \"html\" || type == \"htm\") {\n\t\t// xhr.responseType = \"document\";\n\t}\n\n\tif(type == \"binary\") {\n\t\txhr.responseType = \"arraybuffer\";\n\t}\n\n\txhr.send();\n\n\tfunction err(e: ProgressEvent) {\n\t\tdeferred.reject(e);\n\t}\n\n\tfunction handler() {\n\t\tif (this.readyState === XMLHttpRequest.DONE) {\n\t\t\tlet responseXML = false;\n\n\t\t\tif(this.responseType === \"\" || this.responseType === \"document\") {\n\t\t\t\tresponseXML = this.responseXML;\n\t\t\t}\n\n\t\t\tif (this.status === 200 || this.status === 0 || responseXML) { //-- Firefox is reporting 0 for blob urls\n\t\t\t\tlet r;\n\n\t\t\t\tif (!this.response && !responseXML) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: this.status,\n\t\t\t\t\t\tmessage : \"Empty Response\",\n\t\t\t\t\t\tstack : new Error().stack\n\t\t\t\t\t});\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\tif (this.status === 403) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: this.status,\n\t\t\t\t\t\tresponse: this.response,\n\t\t\t\t\t\tmessage : \"Forbidden\",\n\t\t\t\t\t\tstack : new Error().stack\n\t\t\t\t\t});\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\t\t\t\tif(responseXML){\n\t\t\t\t\tr = this.responseXML;\n\t\t\t\t} else\n\t\t\t\tif(isXml(type!)){\n\t\t\t\t\t// xhr.overrideMimeType(\"text/xml\"); // for OPF parsing\n\t\t\t\t\t// If this.responseXML wasn't set, try to parse using a DOMParser from text\n\t\t\t\t\tr = parse(this.response, \"text/xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == \"xhtml\"){\n\t\t\t\t\tr = parse(this.response, \"application/xhtml+xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == \"html\" || type == \"htm\"){\n\t\t\t\t\tr = parse(this.response, \"text/html\");\n\t\t\t\t}else\n\t\t\t\tif(type == \"json\"){\n\t\t\t\t\tr = JSON.parse(this.response);\n\t\t\t\t}else\n\t\t\t\tif(type == \"blob\"){\n\n\t\t\t\t\tif(supportsURL) {\n\t\t\t\t\t\tr = this.response;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//-- Safari doesn't support responseType blob, so create a blob from arraybuffer\n\t\t\t\t\t\tr = new Blob([this.response]);\n\t\t\t\t\t}\n\n\t\t\t\t}else{\n\t\t\t\t\tr = this.response;\n\t\t\t\t}\n\n\t\t\t\tdeferred.resolve(r);\n\t\t\t} else {\n\n\t\t\t\tdeferred.reject({\n\t\t\t\t\tstatus: this.status,\n\t\t\t\t\tmessage : this.response,\n\t\t\t\t\tstack : new Error().stack\n\t\t\t\t});\n\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deferred.promise;\n}\n\nexport default request;\n","import { defer } from \"./utils/core\";\nimport EpubCFI from \"./epubcfi\";\nimport Hook from \"./utils/hook\";\nimport { sprint } from \"./utils/core\";\nimport { replaceBase } from \"./utils/replacements\";\nimport Request from \"./utils/request\";\nimport { DOMParser as XMLDOMSerializer } from \"@xmldom/xmldom\";\nimport type { SpineItem, GlobalLayout, SearchResult, RequestFunction } from \"./types\";\n\n/**\n * Represents a Section of the Book\n *\n * In most books this is equivalent to a Chapter\n * @param {object} item The spine item representing the section\n * @param {object} hooks hooks for serialize and content\n */\nclass Section {\n\tidref: string;\n\tlinear: boolean;\n\tproperties: string[];\n\tindex: number;\n\thref: string;\n\turl: string;\n\tcanonical: string;\n\tnext: () => SpineItem | undefined;\n\tprev: () => SpineItem | undefined;\n\tcfiBase: string;\n\thooks: { serialize: Hook; content: Hook };\n\tdocument: Document | undefined;\n\tcontents: Element | undefined;\n\toutput: string | undefined;\n\trequest: RequestFunction;\n\n\tconstructor(item: SpineItem, hooks?: { serialize: Hook; content: Hook }){\n\t\tthis.idref = item.idref;\n\t\tthis.linear = item.linear === \"yes\";\n\t\tthis.properties = item.properties;\n\t\tthis.index = item.index;\n\t\tthis.href = item.href;\n\t\tthis.url = item.url;\n\t\tthis.canonical = item.canonical;\n\t\tthis.next = item.next;\n\t\tthis.prev = item.prev;\n\n\t\tthis.cfiBase = item.cfiBase;\n\n\t\tif (hooks) {\n\t\t\tthis.hooks = hooks;\n\t\t} else {\n\t\t\tthis.hooks = {} as any;\n\t\t\tthis.hooks.serialize = new Hook(this);\n\t\t\tthis.hooks.content = new Hook(this);\n\t\t}\n\n\t\tthis.document = undefined;\n\t\tthis.contents = undefined;\n\t\tthis.output = undefined;\n\t}\n\n\t/**\n\t * Load the section from its url\n\t * @param {method} [_request] a request method to use for loading\n\t * @return {document} a promise with the xml document\n\t */\n\tload(_request?: RequestFunction): Promise<Element> {\n\t\tconst request = _request || this.request || Request;\n\t\tconst loading = new defer();\n\t\tconst loaded = loading.promise;\n\n\t\tif(this.contents) {\n\t\t\tloading.resolve(this.contents);\n\t\t} else {\n\t\t\trequest(this.url)\n\t\t\t\t.then(function(xml: Document){\n\t\t\t\t\t// var directory = new Url(this.url).directory;\n\n\t\t\t\t\tthis.document = xml;\n\t\t\t\t\tthis.contents = xml.documentElement;\n\n\t\t\t\t\treturn this.hooks.content.trigger(this.document, this);\n\t\t\t\t}.bind(this))\n\t\t\t\t.then(function(){\n\t\t\t\t\tloading.resolve(this.contents);\n\t\t\t\t}.bind(this))\n\t\t\t\t.catch(function(error: Error){\n\t\t\t\t\tloading.reject(error);\n\t\t\t\t});\n\t\t}\n\n\t\treturn loaded;\n\t}\n\n\t/**\n\t * Adds a base tag for resolving urls in the section\n\t * @private\n\t */\n\tbase(): void {\n\t\treturn replaceBase(this.document!, this);\n\t}\n\n\t/**\n\t * Render the contents of a section\n\t * @param {method} [_request] a request method to use for loading\n\t * @return {string} output a serialized XML Document\n\t */\n\trender(_request?: RequestFunction): Promise<string> {\n\t\tconst rendering = new defer();\n\t\tconst rendered = rendering.promise;\n\t\tthis.output; // TODO: better way to return this from hooks?\n\n\t\tthis.load(_request).\n\t\t\tthen(function(contents: Element){\n\t\t\t\tconst userAgent = (typeof navigator !== \"undefined\" && navigator.userAgent) || \"\";\n\t\t\t\tconst isIE = userAgent.indexOf(\"Trident\") >= 0;\n\t\t\t\tlet Serializer;\n\t\t\t\tif (typeof XMLSerializer === \"undefined\" || isIE) {\n\t\t\t\t\tSerializer = XMLDOMSerializer;\n\t\t\t\t} else {\n\t\t\t\t\tSerializer = XMLSerializer;\n\t\t\t\t}\n\t\t\t\tconst serializer = new Serializer() as unknown as XMLSerializer;\n\t\t\t\tthis.output = serializer.serializeToString(contents);\n\t\t\t\treturn this.output;\n\t\t\t}.bind(this)).\n\t\t\tthen(function(){\n\t\t\t\treturn this.hooks.serialize.trigger(this.output, this);\n\t\t\t}.bind(this)).\n\t\t\tthen(function(){\n\t\t\t\trendering.resolve(this.output);\n\t\t\t}.bind(this))\n\t\t\t.catch(function(error: Error){\n\t\t\t\trendering.reject(error);\n\t\t\t});\n\n\t\treturn rendered;\n\t}\n\n\t/**\n\t * Find a string in a section\n\t * @param {string} _query The query string to find\n\t * @return {object[]} A list of matches, with form {cfi, excerpt}\n\t */\n\tfind(_query: string): SearchResult[] {\n\t\tconst section = this;\n\t\tconst matches: SearchResult[] = [];\n\t\tconst query = _query.toLowerCase();\n\t\tconst find = function(node: Node){\n\t\t\tconst text = node.textContent!.toLowerCase();\n\t\t\tlet range: Range;\n\t\t\tlet cfi;\n\t\t\tlet pos;\n\t\t\tlet last = -1;\n\t\t\tlet excerpt;\n\t\t\tconst limit = 150;\n\n\t\t\twhile (pos != -1) {\n\t\t\t\t// Search for the query\n\t\t\t\tpos = text.indexOf(query, last + 1);\n\n\t\t\t\tif (pos != -1) {\n\t\t\t\t\t// We found it! Generate a CFI\n\t\t\t\t\trange = section.document!.createRange();\n\t\t\t\t\trange.setStart(node, pos);\n\t\t\t\t\trange.setEnd(node, pos + query.length);\n\n\t\t\t\t\tcfi = section.cfiFromRange(range);\n\n\t\t\t\t\t// Generate the excerpt\n\t\t\t\t\tif (node.textContent!.length < limit) {\n\t\t\t\t\t\texcerpt = node.textContent!;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\texcerpt = node.textContent!.substring(pos - limit/2, pos + limit/2);\n\t\t\t\t\t\texcerpt = \"...\" + excerpt + \"...\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add the CFI to the matches list\n\t\t\t\t\tmatches.push({\n\t\t\t\t\t\tcfi: cfi,\n\t\t\t\t\t\texcerpt: excerpt\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tlast = pos;\n\t\t\t}\n\t\t};\n\n\t\tsprint(section.document!, function(node) {\n\t\t\tfind(node);\n\t\t});\n\n\t\treturn matches;\n\t};\n\n\n\t/**\n\t * Search a string in multiple sequential Element of the section. If the document.createTreeWalker api is missed(eg: IE8), use `find` as a fallback.\n\t * @param {string} _query The query string to search\n\t * @param {int} maxSeqEle The maximum number of Element that are combined for search, default value is 5.\n\t * @return {object[]} A list of matches, with form {cfi, excerpt}\n\t */\n\tsearch(_query: string, maxSeqEle: number = 5): SearchResult[] {\n\t\tif (typeof(document.createTreeWalker) == \"undefined\") {\n\t\t\treturn this.find(_query);\n\t\t}\n\t\tconst matches: SearchResult[] = [];\n\t\tconst excerptLimit = 150;\n\t\tconst section = this;\n\t\tconst query = _query.toLowerCase();\n\t\tconst search = function(nodeList: Node[]){\n\t\t\tconst textWithCase = nodeList.reduce((acc: string ,current: Node)=>{\n\t\t\t\treturn acc + (current.textContent ?? \"\");\n\t\t\t},\"\");\n\t\t\tconst text = textWithCase.toLowerCase();\n\t\t\tconst pos = text.indexOf(query);\n\t\t\tif (pos != -1){\n\t\t\t\tconst startNodeIndex = 0 , endPos = pos + query.length;\n\t\t\t\tlet endNodeIndex = 0 , l = 0;\n\t\t\t\tif (pos < (nodeList[startNodeIndex] as Text).length){\n\t\t\t\t\twhile( endNodeIndex < nodeList.length - 1 ){\n\t\t\t\t\t\tl += (nodeList[endNodeIndex] as Text).length;\n\t\t\t\t\t\tif ( endPos <= l){\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tendNodeIndex += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst startNode = nodeList[startNodeIndex] , endNode = nodeList[endNodeIndex];\n\t\t\t\t\tconst range = section.document!.createRange();\n\t\t\t\t\trange.setStart(startNode,pos);\n\t\t\t\t\tconst beforeEndLengthCount = nodeList.slice(0, endNodeIndex).reduce((acc: number,current: Node)=>{return acc+(current.textContent ?? \"\").length;},0) ;\n\t\t\t\t\trange.setEnd(endNode, beforeEndLengthCount > endPos ? endPos : endPos - beforeEndLengthCount );\n\t\t\t\t\tconst cfi = section.cfiFromRange(range);\n\n\t\t\t\t\tlet excerpt = nodeList.slice(0, endNodeIndex+1).reduce((acc: string,current: Node)=>{return acc+(current.textContent ?? \"\") ;},\"\");\n\t\t\t\t\tif (excerpt.length > excerptLimit){\n\t\t\t\t\t\texcerpt = excerpt.substring(pos - excerptLimit/2, pos + excerptLimit/2);\n\t\t\t\t\t\texcerpt = \"...\" + excerpt + \"...\";\n\t\t\t\t\t}\n\t\t\t\t\tmatches.push({\n\t\t\t\t\t\tcfi: cfi,\n\t\t\t\t\t\texcerpt: excerpt\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst treeWalker = document.createTreeWalker(section.document!, NodeFilter.SHOW_TEXT, null);\n\t\tlet node: Node | null , nodeList: Node[] = [];\n\t\twhile ((node = treeWalker.nextNode())) {\n\t\t\tnodeList.push(node);\n\t\t\tif (nodeList.length == maxSeqEle){\n\t\t\t\tsearch(nodeList.slice(0 , maxSeqEle));\n\t\t\t\tnodeList = nodeList.slice(1, maxSeqEle);\n\t\t\t}\n\t\t}\n\t\tif (nodeList.length > 0){\n\t\t\tsearch(nodeList);\n\t\t}\n\t\treturn matches;\n\t}\n\n\t/**\n\t* Reconciles the current chapters layout properties with\n\t* the global layout properties.\n\t* @param {object} globalLayout The global layout settings object, chapter properties string\n\t* @return {object} layoutProperties Object with layout properties\n\t*/\n\treconcileLayoutSettings(globalLayout: GlobalLayout): Record<string, string> {\n\t\t//-- Get the global defaults\n\t\tconst settings: Record<string, string> = {\n\t\t\tlayout : globalLayout.layout,\n\t\t\tspread : globalLayout.spread,\n\t\t\torientation : globalLayout.orientation\n\t\t};\n\n\t\t//-- Get the chapter's display type\n\t\tthis.properties.forEach(function(prop){\n\t\t\tconst rendition = prop.replace(\"rendition:\", \"\");\n\t\t\tconst split = rendition.indexOf(\"-\");\n\t\t\tlet property, value;\n\n\t\t\tif(split != -1){\n\t\t\t\tproperty = rendition.slice(0, split);\n\t\t\t\tvalue = rendition.slice(split+1);\n\n\t\t\t\tsettings[property] = value;\n\t\t\t}\n\t\t});\n\t\treturn settings;\n\t}\n\n\t/**\n\t * Get a CFI from a Range in the Section\n\t * @param {range} _range\n\t * @return {string} cfi an EpubCFI string\n\t */\n\tcfiFromRange(_range: Range): string {\n\t\treturn new EpubCFI(_range, this.cfiBase).toString();\n\t}\n\n\t/**\n\t * Get a CFI from an Element in the Section\n\t * @param {element} el\n\t * @return {string} cfi an EpubCFI string\n\t */\n\tcfiFromElement(el: Element): string {\n\t\treturn new EpubCFI(el, this.cfiBase).toString();\n\t}\n\n\t/**\n\t * Unload the section document\n\t */\n\tunload(): void {\n\t\tthis.document = undefined;\n\t\tthis.contents = undefined;\n\t\tthis.output = undefined;\n\t}\n\n\tdestroy(): void {\n\t\tthis.unload();\n\t\tthis.hooks.serialize.clear();\n\t\tthis.hooks.content.clear();\n\n\t\t(this as any).hooks = undefined;\n\t\t(this as any).idref = undefined;\n\t\t(this as any).linear = undefined;\n\t\t(this as any).properties = undefined;\n\t\t(this as any).index = undefined;\n\t\t(this as any).href = undefined;\n\t\t(this as any).url = undefined;\n\t\t(this as any).next = undefined;\n\t\t(this as any).prev = undefined;\n\n\t\t(this as any).cfiBase = undefined;\n\t}\n}\n\nexport default Section;\n","import EpubCFI from \"./epubcfi\";\nimport Hook from \"./utils/hook\";\nimport Section from \"./section\";\nimport {replaceBase, replaceCanonical, replaceMeta} from \"./utils/replacements\";\nimport type { PackagingManifestObject, PackagingObject, SpineItem } from \"./types\";\n\n/**\n * A collection of Spine Items\n */\nclass Spine {\n\tspineItems: Section[];\n\tspineByHref: Record<string, number>;\n\tspineById: Record<string, number>;\n\thooks: { serialize: Hook; content: Hook };\n\tepubcfi: EpubCFI;\n\tloaded: boolean;\n\titems: SpineItem[];\n\tmanifest: PackagingManifestObject;\n\tspineNodeIndex: number;\n\tbaseUrl: string;\n\tlength: number;\n\n\tconstructor() {\n\t\tthis.spineItems = [];\n\t\tthis.spineByHref = {};\n\t\tthis.spineById = {};\n\n\t\tthis.hooks = {} as any;\n\t\tthis.hooks.serialize = new Hook();\n\t\tthis.hooks.content = new Hook();\n\n\t\t// Register replacements\n\t\tthis.hooks.content.register(replaceBase);\n\t\tthis.hooks.content.register(replaceCanonical);\n\t\tthis.hooks.content.register(replaceMeta);\n\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.loaded = false;\n\n\t\tthis.items = [];\n\t\tthis.manifest = {};\n\t\tthis.spineNodeIndex = 0;\n\t\tthis.baseUrl = \"\";\n\t\tthis.length = 0;\n\t}\n\n\t/**\n\t * Unpack items from a opf into spine items\n\t * @param {Packaging} _package\n\t * @param {method} resolver URL resolver\n\t * @param {method} canonical Resolve canonical url\n\t */\n\tunpack(_package: PackagingObject & { baseUrl?: string; basePath?: string }, resolver: (href: string, absolute?: boolean) => string, canonical: (href: string) => string): void {\n\n\t\tthis.items = _package.spine as unknown as SpineItem[];\n\t\tthis.manifest = _package.manifest;\n\t\tthis.spineNodeIndex = _package.spineNodeIndex;\n\t\tthis.baseUrl = _package.baseUrl || _package.basePath || \"\";\n\t\tthis.length = this.items.length;\n\n\t\tthis.items.forEach( (item, index) => {\n\t\t\tconst manifestItem = this.manifest[item.idref!];\n\n\t\t\titem.index = index;\n\t\t\titem.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.id);\n\n\t\t\tif (item.href) {\n\t\t\t\titem.url = resolver(item.href, true);\n\t\t\t\titem.canonical = canonical(item.href);\n\t\t\t}\n\n\t\t\tif(manifestItem) {\n\t\t\t\titem.href = manifestItem.href;\n\t\t\t\titem.url = resolver(item.href, true);\n\t\t\t\titem.canonical = canonical(item.href);\n\n\t\t\t\tif(manifestItem.properties.length){\n\t\t\t\t\titem.properties.push.apply(item.properties, manifestItem.properties);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (item.linear === \"yes\") {\n\t\t\t\titem.prev = function() {\n\t\t\t\t\tlet prevIndex = item.index;\n\t\t\t\t\twhile (prevIndex > 0) {\n\t\t\t\t\t\tconst prev = this.get(prevIndex-1);\n\t\t\t\t\t\tif (prev && prev.linear) {\n\t\t\t\t\t\t\treturn prev;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprevIndex -= 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}.bind(this);\n\t\t\t\titem.next = function() {\n\t\t\t\t\tlet nextIndex = item.index;\n\t\t\t\t\twhile (nextIndex < this.spineItems.length-1) {\n\t\t\t\t\t\tconst next = this.get(nextIndex+1);\n\t\t\t\t\t\tif (next && next.linear) {\n\t\t\t\t\t\t\treturn next;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextIndex += 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}.bind(this);\n\t\t\t} else {\n\t\t\t\titem.prev = function(): SpineItem | undefined {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\titem.next = function(): SpineItem | undefined {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tconst spineItem = new Section(item, this.hooks);\n\n\t\t\tthis.append(spineItem);\n\n\n\t\t});\n\n\t\tthis.loaded = true;\n\t}\n\n\t/**\n\t * Get an item from the spine\n\t * @param {string|number} [target]\n\t * @return {Section} section\n\t * @example spine.get();\n\t * @example spine.get(1);\n\t * @example spine.get(\"chap1.html\");\n\t * @example spine.get(\"#id1234\");\n\t */\n\tget(target?: string | number): Section | null {\n\t\tlet index = 0;\n\n\t\tif (typeof target === \"undefined\") {\n\t\t\twhile (index < this.spineItems.length) {\n\t\t\t\tconst next = this.spineItems[index];\n\t\t\t\tif (next && next.linear) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tindex += 1;\n\t\t\t}\n\t\t} else if(this.epubcfi.isCfiString(target)) {\n\t\t\tconst cfi = new EpubCFI(target as string);\n\t\t\tindex = cfi.spinePos;\n\t\t} else if(typeof target === \"number\" || isNaN(Number(target)) === false){\n\t\t\tindex = Number(target);\n\t\t} else if(typeof target === \"string\" && target.indexOf(\"#\") === 0) {\n\t\t\tindex = this.spineById[target.substring(1)];\n\t\t} else if(typeof target === \"string\") {\n\t\t\t// Remove fragments\n\t\t\ttarget = target.split(\"#\")[0];\n\t\t\tindex = this.spineByHref[target] || this.spineByHref[encodeURI(target)];\n\t\t}\n\n\t\treturn this.spineItems[index] || null;\n\t}\n\n\t/**\n\t * Append a Section to the Spine\n\t * @private\n\t * @param {Section} section\n\t */\n\tappend(section: Section): number {\n\t\tconst index = this.spineItems.length;\n\t\tsection.index = index;\n\n\t\tthis.spineItems.push(section);\n\n\t\t// Encode and Decode href lookups\n\t\t// see pr for details: https://github.com/futurepress/epub.js/pull/358\n\t\tthis.spineByHref[decodeURI(section.href)] = index;\n\t\tthis.spineByHref[encodeURI(section.href)] = index;\n\t\tthis.spineByHref[section.href] = index;\n\n\t\tthis.spineById[section.idref] = index;\n\n\t\treturn index;\n\t}\n\n\t/**\n\t * Prepend a Section to the Spine\n\t * @private\n\t * @param {Section} section\n\t */\n\tprepend(section: Section): number {\n\t\t// var index = this.spineItems.unshift(section);\n\t\tthis.spineByHref[section.href] = 0;\n\t\tthis.spineById[section.idref] = 0;\n\n\t\t// Re-index\n\t\tthis.spineItems.forEach(function(item, index){\n\t\t\titem.index = index;\n\t\t});\n\n\t\treturn 0;\n\t}\n\n\t// insert(section, index) {\n\t//\n\t// };\n\n\t/**\n\t * Remove a Section from the Spine\n\t * @private\n\t * @param {Section} section\n\t */\n\tremove(section: Section): Section[] | undefined {\n\t\tconst index = this.spineItems.indexOf(section);\n\n\t\tif(index > -1) {\n\t\t\tdelete this.spineByHref[section.href];\n\t\t\tdelete this.spineById[section.idref];\n\n\t\t\treturn this.spineItems.splice(index, 1);\n\t\t}\n\t}\n\n\t/**\n\t * Loop over the Sections in the Spine\n\t * @return {method} forEach\n\t */\n\teach(...args: any[]): void {\n\t\treturn this.spineItems.forEach.apply(this.spineItems, args);\n\t}\n\n\t/**\n\t * Find the first Section in the Spine\n\t * @return {Section} first section\n\t */\n\tfirst(): Section | undefined {\n\t\tlet index = 0;\n\n\t\tdo {\n\t\t\tconst next = this.get(index);\n\n\t\t\tif (next && next.linear) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t\tindex += 1;\n\t\t} while (index < this.spineItems.length) ;\n\t}\n\n\t/**\n\t * Find the last Section in the Spine\n\t * @return {Section} last section\n\t */\n\tlast(): Section | undefined {\n\t\tlet index = this.spineItems.length-1;\n\n\t\tdo {\n\t\t\tconst prev = this.get(index);\n\t\t\tif (prev && prev.linear) {\n\t\t\t\treturn prev;\n\t\t\t}\n\t\t\tindex -= 1;\n\t\t} while (index >= 0);\n\t}\n\n\tdestroy(): void {\n\t\tthis.each((section: Section) => section.destroy());\n\n\t\t(this as any).spineItems = undefined;\n\t\t(this as any).spineByHref = undefined;\n\t\t(this as any).spineById = undefined;\n\n\t\tthis.hooks.serialize.clear();\n\t\tthis.hooks.content.clear();\n\t\t(this as any).hooks = undefined;\n\n\t\t(this as any).epubcfi = undefined;\n\n\t\tthis.loaded = false;\n\n\t\t(this as any).items = undefined;\n\t\t(this as any).manifest = undefined;\n\t\t(this as any).spineNodeIndex = undefined;\n\t\t(this as any).baseUrl = undefined;\n\t\t(this as any).length = undefined;\n\t}\n}\n\nexport default Spine;\n","import {defer, requestAnimationFrame} from \"./core\";\n\n\n/**\n * Queue for handling tasks one at a time\n * @class\n * @param {scope} context what this will resolve to in the tasks\n */\nclass Queue {\n\t_q: any[];\n\tcontext: any;\n\ttick: any;\n\trunning: any;\n\tpaused: boolean;\n\tdefered: any;\n\n\tconstructor(context: any){\n\t\tthis._q = [];\n\t\tthis.context = context;\n\t\tthis.tick = requestAnimationFrame;\n\t\tthis.running = false;\n\t\tthis.paused = false;\n\t}\n\n\t/**\n\t * Add an item to the queue\n\t * @return {Promise}\n\t */\n\tenqueue(..._args: any[]): Promise<any> {\n\t\tlet deferred, promise;\n\t\tlet queued;\n\t\tconst task = [].shift.call(arguments);\n\t\tconst args = arguments;\n\n\t\t// Handle single args without context\n\t\t// if(args && !Array.isArray(args)) {\n\t\t// args = [args];\n\t\t// }\n\t\tif(!task) {\n\t\t\tthrow new Error(\"No Task Provided\");\n\t\t}\n\n\t\tif(typeof task === \"function\"){\n\n\t\t\tdeferred = new defer();\n\t\t\tpromise = deferred.promise;\n\n\t\t\tqueued = {\n\t\t\t\t\"task\" : task,\n\t\t\t\t\"args\" : args,\n\t\t\t\t//\"context\" : context,\n\t\t\t\t\"deferred\" : deferred,\n\t\t\t\t\"promise\" : promise\n\t\t\t};\n\n\t\t} else {\n\t\t\t// Task is a promise\n\t\t\tqueued = {\n\t\t\t\t\"promise\" : task\n\t\t\t};\n\n\t\t}\n\n\t\tthis._q.push(queued);\n\n\t\t// Wait to start queue flush\n\t\tif (this.paused == false && !this.running) {\n\t\t\t// setTimeout(this.flush.bind(this), 0);\n\t\t\t// this.tick.call(window, this.run.bind(this));\n\t\t\tthis.run();\n\t\t}\n\n\t\treturn queued.promise;\n\t}\n\n\t/**\n\t * Run one item\n\t * @return {Promise}\n\t */\n\tdequeue(): any {\n\t\tlet inwait: any, task, result;\n\n\t\tif(this._q.length && !this.paused) {\n\t\t\tinwait = this._q.shift();\n\t\t\ttask = inwait.task;\n\t\t\tif(task){\n\t\t\t\t// console.log(task)\n\n\t\t\t\tresult = task.apply(this.context, inwait.args);\n\n\t\t\t\tif(result && typeof result[\"then\"] === \"function\") {\n\t\t\t\t\t// Task is a function that returns a promise\n\t\t\t\t\treturn result.then(function(){\n\t\t\t\t\t\tinwait.deferred.resolve.apply(this.context, arguments);\n\t\t\t\t\t}.bind(this), function() {\n\t\t\t\t\t\tinwait.deferred.reject.apply(this.context, arguments);\n\t\t\t\t\t}.bind(this));\n\t\t\t\t} else {\n\t\t\t\t\t// Task resolves immediately\n\t\t\t\t\tinwait.deferred.resolve.apply(this.context, result);\n\t\t\t\t\treturn inwait.promise;\n\t\t\t\t}\n\n\n\n\t\t\t} else if(inwait.promise) {\n\t\t\t\t// Task is a promise\n\t\t\t\treturn inwait.promise;\n\t\t\t}\n\n\t\t} else {\n\t\t\tinwait = new defer();\n\t\t\tinwait.resolve();\n\t\t\treturn inwait.promise;\n\t\t}\n\n\t}\n\n\t// Run All Immediately\n\tdump(): void {\n\t\twhile(this._q.length) {\n\t\t\tthis.dequeue();\n\t\t}\n\t}\n\n\t/**\n\t * Run all tasks sequentially, at convince\n\t * @return {Promise}\n\t */\n\trun(): Promise<any> {\n\n\t\tif(!this.running){\n\t\t\tthis.running = true;\n\t\t\tthis.defered = new defer();\n\t\t}\n\n\t\tthis.tick.call(window, () => {\n\n\t\t\tif(this._q.length) {\n\n\t\t\t\tthis.dequeue()\n\t\t\t\t\t.then(function(){\n\t\t\t\t\t\tthis.run();\n\t\t\t\t\t}.bind(this));\n\n\t\t\t} else {\n\t\t\t\tthis.defered.resolve();\n\t\t\t\tthis.running = undefined;\n\t\t\t}\n\n\t\t});\n\n\t\t// Unpause\n\t\tif(this.paused == true) {\n\t\t\tthis.paused = false;\n\t\t}\n\n\t\treturn this.defered.promise;\n\t}\n\n\t/**\n\t * Flush all, as quickly as possible\n\t * @return {Promise}\n\t */\n\tflush(): any {\n\n\t\tif(this.running){\n\t\t\treturn this.running;\n\t\t}\n\n\t\tif(this._q.length) {\n\t\t\tthis.running = this.dequeue()\n\t\t\t\t.then(function(){\n\t\t\t\t\tthis.running = undefined;\n\t\t\t\t\treturn this.flush();\n\t\t\t\t}.bind(this));\n\n\t\t\treturn this.running;\n\t\t}\n\n\t}\n\n\t/**\n\t * Clear all items in wait\n\t */\n\tclear(): void {\n\t\tthis._q = [];\n\t}\n\n\t/**\n\t * Get the number of tasks in the queue\n\t * @return {number} tasks\n\t */\n\tlength(): number {\n\t\treturn this._q.length;\n\t}\n\n\t/**\n\t * Pause a running queue\n\t */\n\tpause(): void {\n\t\tthis.paused = true;\n\t}\n\n\t/**\n\t * End the queue\n\t */\n\tstop(): void {\n\t\tthis._q = [];\n\t\tthis.running = false;\n\t\tthis.paused = true;\n\t}\n}\n\n\n/**\n * Create a new task from a callback\n * @class\n * @private\n * @param {function} task\n * @param {array} args\n * @param {scope} context\n * @return {function} task\n */\nclass Task {\n\tconstructor(task: Function, args: any[], context: any){\n\n\t\treturn function(){\n\t\t\tconst toApply = (arguments as any) || [];\n\n\t\t\treturn new Promise( (resolve, reject) => {\n\t\t\t\tconst callback = function(value: any, err: any){\n\t\t\t\t\tif (!value && err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(value);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Add the callback to the arguments list\n\t\t\t\ttoApply.push(callback);\n\n\t\t\t\t// Apply all arguments to the functions\n\t\t\t\ttask.apply(context || this, toApply);\n\n\t\t\t});\n\n\t\t};\n\n\t}\n}\n\n\nexport default Queue;\nexport { Task };\n","export const EPUBJS_VERSION = \"0.3\";\n\n// Dom events to listen for\nexport const DOM_EVENTS = [\"keydown\", \"keyup\", \"keypressed\", \"mouseup\", \"mousedown\", \"mousemove\", \"click\", \"touchend\", \"touchstart\", \"touchmove\"] as const;\n\nexport const EVENTS = {\n BOOK : {\n OPEN_FAILED : \"openFailed\"\n },\n CONTENTS : {\n EXPAND : \"expand\",\n RESIZE : \"resize\",\n SELECTED : \"selected\",\n SELECTED_RANGE : \"selectedRange\",\n LINK_CLICKED : \"linkClicked\"\n },\n LOCATIONS : {\n CHANGED : \"changed\"\n },\n MANAGERS : {\n RESIZE : \"resize\",\n RESIZED : \"resized\",\n ORIENTATION_CHANGE : \"orientationchange\",\n ADDED : \"added\",\n SCROLL : \"scroll\",\n SCROLLED : \"scrolled\",\n REMOVED : \"removed\",\n },\n VIEWS : {\n AXIS: \"axis\",\n WRITING_MODE: \"writingMode\",\n LOAD_ERROR : \"loaderror\",\n RENDERED : \"rendered\",\n RESIZED : \"resized\",\n DISPLAYED : \"displayed\",\n SHOWN : \"shown\",\n HIDDEN : \"hidden\",\n MARK_CLICKED : \"markClicked\"\n },\n RENDITION : {\n STARTED : \"started\",\n ATTACHED : \"attached\",\n DISPLAYED : \"displayed\",\n DISPLAY_ERROR : \"displayerror\",\n RENDERED : \"rendered\",\n REMOVED : \"removed\",\n RESIZED : \"resized\",\n ORIENTATION_CHANGE : \"orientationchange\",\n LOCATION_CHANGED : \"locationChanged\",\n RELOCATED : \"relocated\",\n MARK_CLICKED : \"markClicked\",\n SELECTED : \"selected\",\n LAYOUT: \"layout\"\n },\n LAYOUT : {\n UPDATED : \"updated\"\n },\n ANNOTATION : {\n ATTACH : \"attach\",\n DETACH : \"detach\"\n }\n} as const\n","import {qs, sprint, locationOf, defer} from \"./utils/core\";\nimport Queue from \"./utils/queue\";\nimport EpubCFI from \"./epubcfi\";\nimport { EVENTS } from \"./utils/constants\";\nimport EventEmitter from \"./utils/event-emitter\";\nimport type { IEventEmitter, RequestFunction } from \"./types\";\nimport type Spine from \"./spine\";\nimport type Section from \"./section\";\n\n/**\n * Find Locations for a Book\n * @param {Spine} spine\n * @param {request} request\n * @param {number} [pause=100]\n */\nclass Locations implements IEventEmitter {\n\tdeclare on: (type: string, fn: (...args: any[]) => void) => this;\n\tdeclare off: (type: string, fn?: (...args: any[]) => void) => this;\n\tdeclare emit: (type: string, ...args: any[]) => void;\n\n\tspine: Spine;\n\trequest: RequestFunction;\n\tpause: number;\n\tq: Queue;\n\tepubcfi: EpubCFI;\n\t_locations: string[];\n\t_locationsWords: { cfi: string; wordCount: number }[];\n\ttotal: number;\n\tbreak: number;\n\t_current: number;\n\t_wordCounter: number;\n\t_currentCfi: string;\n\tprocessingTimeout: ReturnType<typeof setTimeout> | undefined;\n\n\tconstructor(spine: Spine, request: RequestFunction, pause?: number) {\n\t\tthis.spine = spine;\n\t\tthis.request = request;\n\t\tthis.pause = pause || 100;\n\n\t\tthis.q = new Queue(this);\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis._locations = [];\n\t\tthis._locationsWords = [];\n\t\tthis.total = 0;\n\n\t\tthis.break = 150;\n\n\t\tthis._current = 0;\n\n\t\tthis._wordCounter = 0;\n\n\t\tthis._currentCfi =\"\";\n\t\tthis.processingTimeout = undefined;\n\t}\n\n\t/**\n\t * Load all of sections in the book to generate locations\n\t * @param {int} chars how many chars to split on\n\t * @return {Promise<Array<string>>} locations\n\t */\n\tgenerate(chars?: number): Promise<string[]> {\n\n\t\tif (chars) {\n\t\t\tthis.break = chars;\n\t\t}\n\n\t\tthis.q.pause();\n\n\t\tthis.spine.each(function(section: Section) {\n\t\t\tif (section.linear) {\n\t\t\t\tthis.q.enqueue(this.process.bind(this), section);\n\t\t\t}\n\t\t}.bind(this));\n\n\t\treturn this.q.run().then(function() {\n\t\t\tthis.total = this._locations.length - 1;\n\n\t\t\tif (this._currentCfi) {\n\t\t\t\tthis.currentLocation = this._currentCfi;\n\t\t\t}\n\n\t\t\treturn this._locations;\n\t\t\t// console.log(this.percentage(this.book.rendition.location.start), this.percentage(this.book.rendition.location.end));\n\t\t}.bind(this));\n\n\t}\n\n\tcreateRange (): { startContainer: Node | undefined; startOffset: number | undefined; endContainer: Node | undefined; endOffset: number | undefined } {\n\t\treturn {\n\t\t\tstartContainer: undefined,\n\t\t\tstartOffset: undefined,\n\t\t\tendContainer: undefined,\n\t\t\tendOffset: undefined\n\t\t};\n\t}\n\n\tprocess(section: Section): Promise<string[]> {\n\n\t\treturn section.load(this.request)\n\t\t\t.then(function(contents: Element) {\n\t\t\t\tconst completed = new defer();\n\t\t\t\tconst locations = this.parse(contents, section.cfiBase);\n\t\t\t\tthis._locations = this._locations.concat(locations);\n\n\t\t\t\tsection.unload();\n\n\t\t\t\tthis.processingTimeout = setTimeout(() => completed.resolve(locations), this.pause);\n\t\t\t\treturn completed.promise;\n\t\t\t}.bind(this));\n\n\t}\n\n\tparse(contents: Element, cfiBase: string, chars?: number): string[] {\n\t\tconst locations: string[] = [];\n\t\tlet range: any;\n\t\tconst doc = contents.ownerDocument;\n\t\tconst body = qs(doc, \"body\");\n\t\tlet counter = 0;\n\t\tlet prev: any;\n\t\tconst _break = chars || this.break;\n\t\tconst parser = function(node: Node) {\n\t\t\tconst len = (node as Text).length;\n\t\t\tlet dist;\n\t\t\tlet pos = 0;\n\n\t\t\tif ((node.textContent ?? \"\").trim().length === 0) {\n\t\t\t\treturn false; // continue\n\t\t\t}\n\n\t\t\t// Start range\n\t\t\tif (counter == 0) {\n\t\t\t\trange = this.createRange();\n\t\t\t\trange.startContainer = node;\n\t\t\t\trange.startOffset = 0;\n\t\t\t}\n\n\t\t\tdist = _break - counter;\n\n\t\t\t// Node is smaller than a break,\n\t\t\t// skip over it\n\t\t\tif(dist > len){\n\t\t\t\tcounter += len;\n\t\t\t\tpos = len;\n\t\t\t}\n\n\n\t\t\twhile (pos < len) {\n\t\t\t\tdist = _break - counter;\n\n\t\t\t\tif (counter === 0) {\n\t\t\t\t\t// Start new range\n\t\t\t\t\tpos += 1;\n\t\t\t\t\trange = this.createRange();\n\t\t\t\t\trange.startContainer = node;\n\t\t\t\t\trange.startOffset = pos;\n\t\t\t\t}\n\n\t\t\t\t// pos += dist;\n\n\t\t\t\t// Gone over\n\t\t\t\tif(pos + dist >= len){\n\t\t\t\t\t// Continue counter for next node\n\t\t\t\t\tcounter += len - pos;\n\t\t\t\t\t// break\n\t\t\t\t\tpos = len;\n\t\t\t\t// At End\n\t\t\t\t} else {\n\t\t\t\t\t// Advance pos\n\t\t\t\t\tpos += dist;\n\n\t\t\t\t\t// End the previous range\n\t\t\t\t\trange.endContainer = node;\n\t\t\t\t\trange.endOffset = pos;\n\t\t\t\t\t// cfi = section.cfiFromRange(range);\n\t\t\t\t\tconst cfi = new EpubCFI(range, cfiBase).toString();\n\t\t\t\t\tlocations.push(cfi);\n\t\t\t\t\tcounter = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprev = node;\n\t\t};\n\n\t\tsprint(body!, parser.bind(this));\n\n\t\t// Close remaining\n\t\tif (range && range.startContainer && prev) {\n\t\t\trange.endContainer = prev;\n\t\t\trange.endOffset = prev.length;\n\t\t\tconst cfi = new EpubCFI(range, cfiBase).toString();\n\t\t\tlocations.push(cfi);\n\t\t\tcounter = 0;\n\t\t}\n\n\t\treturn locations;\n\t}\n\n\n\t/**\n\t * Load all of sections in the book to generate locations\n\t * @param {string} startCfi start position\n\t * @param {int} wordCount how many words to split on\n\t * @param {int} count result count\n\t * @return {object} locations\n\t */\n\tgenerateFromWords(startCfi?: string, wordCount?: number, count?: number): Promise<any[]> {\n\t\tconst start = startCfi ? new EpubCFI(startCfi) : undefined;\n\t\tthis.q.pause();\n\t\tthis._locationsWords = [];\n\t\tthis._wordCounter = 0;\n\n\t\tthis.spine.each(function(section: Section) {\n\t\t\tif (section.linear) {\n\t\t\t\tif (start) {\n\t\t\t\t\tif (section.index >= start.spinePos) {\n\t\t\t\t\t\tthis.q.enqueue(this.processWords.bind(this), section, wordCount, start, count);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.q.enqueue(this.processWords.bind(this), section, wordCount, start, count);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this));\n\n\t\treturn this.q.run().then(function() {\n\t\t\tif (this._currentCfi) {\n\t\t\t\tthis.currentLocation = this._currentCfi;\n\t\t\t}\n\n\t\t\treturn this._locationsWords;\n\t\t}.bind(this));\n\n\t}\n\n\tprocessWords(section: Section, wordCount: number, startCfi?: EpubCFI, count?: number): Promise<any> {\n\t\tif (count && this._locationsWords.length >= count) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\treturn section.load(this.request)\n\t\t\t.then(function(contents: Element) {\n\t\t\t\tconst completed = new defer();\n\t\t\t\tconst locations = this.parseWords(contents, section, wordCount, startCfi);\n\t\t\t\tconst remainingCount = count! - this._locationsWords.length;\n\t\t\t\tthis._locationsWords = this._locationsWords.concat(locations.length >= count! ? locations.slice(0, remainingCount) : locations);\n\n\t\t\t\tsection.unload();\n\n\t\t\t\tthis.processingTimeout = setTimeout(() => completed.resolve(locations), this.pause);\n\t\t\t\treturn completed.promise;\n\t\t\t}.bind(this));\n\t}\n\n\t//http://stackoverflow.com/questions/18679576/counting-words-in-string\n\tcountWords(s: string): number {\n\t\ts = s.replace(/(^\\s*)|(\\s*$)/gi, \"\");//exclude start and end white-space\n\t\ts = s.replace(/[ ]{2,}/gi, \" \");//2 or more space to 1\n\t\ts = s.replace(/\\n /, \"\\n\"); // exclude newline with a start spacing\n\t\treturn s.split(\" \").length;\n\t}\n\n\tparseWords(contents: Element, section: Section, wordCount: number, startCfi?: EpubCFI): { cfi: string; wordCount: number }[] {\n\t\tconst cfiBase = section.cfiBase;\n\t\tconst locations: { cfi: string; wordCount: number }[] = [];\n\t\tconst doc = contents.ownerDocument;\n\t\tconst body = qs(doc, \"body\");\n\t\tlet _prev;\n\t\tconst _break = wordCount;\n\t\tlet foundStartNode = startCfi ? startCfi.spinePos !== section.index : true;\n\t\tlet startNode: Node | undefined;\n\t\tif (startCfi && section.index === startCfi.spinePos) {\n\t\t\tstartNode = startCfi.findNode(startCfi.range ? startCfi.path.steps.concat(startCfi.start!.steps) : startCfi.path.steps, contents.ownerDocument!);\n\t\t}\n\t\tconst parser = function(node: Node) {\n\t\t\tif (!foundStartNode) {\n\t\t\t\tif (node === startNode) {\n\t\t\t\t\tfoundStartNode = true;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((node.textContent ?? \"\").length < 10) {\n\t\t\t\tif ((node.textContent ?? \"\").trim().length === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst len = this.countWords(node.textContent ?? \"\");\n\t\t\tlet dist;\n\t\t\tlet pos = 0;\n\n\t\t\tif (len === 0) {\n\t\t\t\treturn false; // continue\n\t\t\t}\n\n\t\t\tdist = _break - this._wordCounter;\n\n\t\t\t// Node is smaller than a break,\n\t\t\t// skip over it\n\t\t\tif (dist > len) {\n\t\t\t\tthis._wordCounter += len;\n\t\t\t\tpos = len;\n\t\t\t}\n\n\n\t\t\twhile (pos < len) {\n\t\t\t\tdist = _break - this._wordCounter;\n\n\t\t\t\t// Gone over\n\t\t\t\tif (pos + dist >= len) {\n\t\t\t\t\t// Continue counter for next node\n\t\t\t\t\tthis._wordCounter += len - pos;\n\t\t\t\t\t// break\n\t\t\t\t\tpos = len;\n\t\t\t\t\t// At End\n\t\t\t\t} else {\n\t\t\t\t\t// Advance pos\n\t\t\t\t\tpos += dist;\n\n\t\t\t\t\tconst cfi = new EpubCFI(node, cfiBase);\n\t\t\t\t\tlocations.push({ cfi: cfi.toString(), wordCount: this._wordCounter });\n\t\t\t\t\tthis._wordCounter = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t_prev = node;\n\t\t};\n\n\t\tsprint(body!, parser.bind(this));\n\n\t\treturn locations;\n\t}\n\n\t/**\n\t * Get a location from an EpubCFI\n\t * @param {EpubCFI} cfi\n\t * @return {number}\n\t */\n\tlocationFromCfi(cfi: string | EpubCFI): number {\n\t\tif (EpubCFI.prototype.isCfiString(cfi)) {\n\t\t\tcfi = new EpubCFI(cfi);\n\t\t}\n\t\t// Check if the location has not been set yet\n\t\tif(this._locations.length === 0) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst loc = locationOf(cfi, this._locations, this.epubcfi.compare);\n\n\t\tif (loc > this.total) {\n\t\t\treturn this.total;\n\t\t}\n\n\t\treturn loc;\n\t}\n\n\t/**\n\t * Get a percentage position in locations from an EpubCFI\n\t * @param {EpubCFI} cfi\n\t * @return {number}\n\t */\n\tpercentageFromCfi(cfi: string | EpubCFI): number | null {\n\t\tif(this._locations.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\t// Find closest cfi\n\t\tconst loc = this.locationFromCfi(cfi);\n\t\t// Get percentage in total\n\t\treturn this.percentageFromLocation(loc);\n\t}\n\n\t/**\n\t * Get a percentage position from a location index\n\t * @param {number} location\n\t * @return {number}\n\t */\n\tpercentageFromLocation(loc: number): number {\n\t\tif (!loc || !this.total) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn (loc / this.total);\n\t}\n\n\t/**\n\t * Get an EpubCFI from location index\n\t * @param {number} loc\n\t * @return {EpubCFI} cfi\n\t */\n\tcfiFromLocation(loc: string | number): string | number {\n\t\tlet cfi: string | number = -1;\n\t\t// check that pg is an int\n\t\tif(typeof loc != \"number\"){\n\t\t\tloc = parseInt(loc);\n\t\t}\n\n\t\tif(loc >= 0 && loc < this._locations.length) {\n\t\t\tcfi = this._locations[loc];\n\t\t}\n\n\t\treturn cfi;\n\t}\n\n\t/**\n\t * Get an EpubCFI from location percentage\n\t * @param {number} percentage\n\t * @return {EpubCFI} cfi\n\t */\n\tcfiFromPercentage(percentage: number): string | number {\n\t\tif (percentage > 1) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(\"Normalize cfiFromPercentage value to between 0 - 1\");\n\t\t}\n\n\t\t// Make sure 1 goes to very end\n\t\tif (percentage >= 1) {\n\t\t\tconst cfi = new EpubCFI(this._locations[this.total]);\n\t\t\tcfi.collapse();\n\t\t\treturn cfi.toString();\n\t\t}\n\n\t\tconst loc = Math.ceil(this.total * percentage);\n\t\treturn this.cfiFromLocation(loc);\n\t}\n\n\t/**\n\t * Load locations from JSON\n\t * @param {json} locations\n\t */\n\tload(locations: string | string[]): string[] {\n\t\tif (typeof locations === \"string\") {\n\t\t\tthis._locations = JSON.parse(locations);\n\t\t} else {\n\t\t\tthis._locations = locations;\n\t\t}\n\t\tthis.total = this._locations.length - 1;\n\t\treturn this._locations;\n\t}\n\n\t/**\n\t * Save locations to JSON\n\t * @return {json}\n\t */\n\tsave(): string {\n\t\treturn JSON.stringify(this._locations);\n\t}\n\n\tgetCurrent(): number {\n\t\treturn this._current;\n\t}\n\n\tsetCurrent(curr: string | number): void {\n\t\tlet loc;\n\n\t\tif(typeof curr == \"string\"){\n\t\t\tthis._currentCfi = curr;\n\t\t} else if (typeof curr == \"number\") {\n\t\t\tthis._current = curr;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tif(this._locations.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(typeof curr == \"string\"){\n\t\t\tloc = this.locationFromCfi(curr);\n\t\t\tthis._current = loc;\n\t\t} else {\n\t\t\tloc = curr;\n\t\t}\n\n\t\tthis.emit(EVENTS.LOCATIONS.CHANGED, {\n\t\t\tpercentage: this.percentageFromLocation(loc)\n\t\t});\n\t}\n\n\t/**\n\t * Get the current location\n\t */\n\tget currentLocation(): number {\n\t\treturn this._current;\n\t}\n\n\t/**\n\t * Set the current location\n\t */\n\tset currentLocation(curr: string | number) {\n\t\tthis.setCurrent(curr);\n\t}\n\n\t/**\n\t * Locations length\n\t */\n\tlength (): number {\n\t\treturn this._locations.length;\n\t}\n\n\tdestroy (): void {\n\t\t(this as any).spine = undefined;\n\t\t(this as any).request = undefined;\n\t\t(this as any).pause = undefined;\n\n\t\tthis.q.stop();\n\t\t(this as any).q = undefined;\n\t\t(this as any).epubcfi = undefined;\n\n\t\t(this as any)._locations = undefined;\n\t\t(this as any).total = undefined;\n\n\t\t(this as any).break = undefined;\n\t\t(this as any)._current = undefined;\n\n\t\t(this as any).currentLocation = undefined;\n\t\t(this as any)._currentCfi = undefined;\n\t\tclearTimeout(this.processingTimeout);\n\t}\n}\n\nEventEmitter(Locations.prototype);\n\nexport default Locations;\n","import path from \"./utils/path-utils\";\nimport {qs} from \"./utils/core\";\n\n/**\n * Handles Parsing and Accessing an Epub Container\n * @class\n * @param {document} [containerDocument] xml document\n */\nclass Container {\n\tpackagePath: string;\n\tdirectory: string;\n\tencoding: string;\n\n\tconstructor(containerDocument?: Document) {\n\t\tthis.packagePath = \"\";\n\t\tthis.directory = \"\";\n\t\tthis.encoding = \"\";\n\n\t\tif (containerDocument) {\n\t\t\tthis.parse(containerDocument);\n\t\t}\n\t}\n\n\t/**\n\t * Parse the Container XML\n\t * @param {document} containerDocument\n\t */\n\tparse(containerDocument: Document): void {\n\t\t//-- <rootfile full-path=\"OPS/package.opf\" media-type=\"application/oebps-package+xml\"/>\n\t\tif(!containerDocument) {\n\t\t\tthrow new Error(\"Container File Not Found\");\n\t\t}\n\n\t\tconst rootfile = qs(containerDocument, \"rootfile\");\n\n\t\tif(!rootfile) {\n\t\t\tthrow new Error(\"No RootFile Found\");\n\t\t}\n\n\t\tthis.packagePath = rootfile.getAttribute(\"full-path\") ?? \"\";\n\t\tthis.directory = path.dirname(this.packagePath);\n\t\tthis.encoding = (containerDocument as any).xmlEncoding;\n\t}\n\n\tdestroy(): void {\n\t\t(this as any).packagePath = undefined;\n\t\t(this as any).directory = undefined;\n\t\t(this as any).encoding = undefined;\n\t}\n}\n\nexport default Container;\n","import {qs, qsa, qsp, indexOfElementNode} from \"./utils/core\";\nimport type { PackagingMetadataObject, PackagingSpineItem, PackagingManifestItem, PackagingManifestObject, PackagingObject, NavItem } from \"./types\";\n\n/**\n * Open Packaging Format Parser\n * @class\n * @param {document} packageDocument OPF XML\n */\nclass Packaging {\n\tmanifest: PackagingManifestObject;\n\tnavPath: string;\n\tncxPath: string;\n\tcoverPath: string;\n\tspineNodeIndex: number;\n\tspine: PackagingSpineItem[];\n\tmetadata: PackagingMetadataObject;\n\tuniqueIdentifier: string;\n\ttoc: NavItem[];\n\n\tconstructor(packageDocument?: Document) {\n\t\tthis.manifest = {};\n\t\tthis.navPath = \"\";\n\t\tthis.ncxPath = \"\";\n\t\tthis.coverPath = \"\";\n\t\tthis.spineNodeIndex = 0;\n\t\tthis.spine = [];\n\t\tthis.metadata = {} as PackagingMetadataObject;\n\n\t\tif (packageDocument) {\n\t\t\tthis.parse(packageDocument);\n\t\t}\n\t}\n\n\t/**\n\t * Parse OPF XML\n\t * @param {document} packageDocument OPF XML\n\t * @return {object} parsed package parts\n\t */\n\tparse(packageDocument: Document): PackagingObject {\n\t\tif(!packageDocument) {\n\t\t\tthrow new Error(\"Package File Not Found\");\n\t\t}\n\n\t\tconst metadataNode = qs(packageDocument, \"metadata\");\n\t\tif(!metadataNode) {\n\t\t\tthrow new Error(\"No Metadata Found\");\n\t\t}\n\n\t\tconst manifestNode = qs(packageDocument, \"manifest\");\n\t\tif(!manifestNode) {\n\t\t\tthrow new Error(\"No Manifest Found\");\n\t\t}\n\n\t\tconst spineNode = qs(packageDocument, \"spine\");\n\t\tif(!spineNode) {\n\t\t\tthrow new Error(\"No Spine Found\");\n\t\t}\n\n\t\tthis.manifest = this.parseManifest(manifestNode);\n\t\tthis.navPath = this.findNavPath(manifestNode);\n\t\tthis.ncxPath = this.findNcxPath(manifestNode, spineNode);\n\t\tthis.coverPath = this.findCoverPath(packageDocument);\n\n\t\tthis.spineNodeIndex = indexOfElementNode(spineNode);\n\n\t\tthis.spine = this.parseSpine(spineNode, this.manifest);\n\n\t\tthis.uniqueIdentifier = this.findUniqueIdentifier(packageDocument);\n\t\tthis.metadata = this.parseMetadata(metadataNode);\n\n\t\tthis.metadata.direction = spineNode.getAttribute(\"page-progression-direction\") ?? \"\";\n\n\t\treturn {\n\t\t\t\"metadata\" : this.metadata,\n\t\t\t\"spine\" : this.spine,\n\t\t\t\"manifest\" : this.manifest,\n\t\t\t\"navPath\" : this.navPath,\n\t\t\t\"ncxPath\" : this.ncxPath,\n\t\t\t\"coverPath\": this.coverPath,\n\t\t\t\"spineNodeIndex\" : this.spineNodeIndex\n\t\t};\n\t}\n\n\t/**\n\t * Parse Metadata\n\t * @private\n\t * @param {node} xml\n\t * @return {object} metadata\n\t */\n\tparseMetadata(xml: Element): PackagingMetadataObject {\n\t\tconst metadata = {} as PackagingMetadataObject;\n\n\t\tmetadata.title = this.getElementText(xml, \"title\");\n\t\tmetadata.creator = this.getElementText(xml, \"creator\");\n\t\tmetadata.description = this.getElementText(xml, \"description\");\n\n\t\tmetadata.pubdate = this.getElementText(xml, \"date\");\n\n\t\tmetadata.publisher = this.getElementText(xml, \"publisher\");\n\n\t\tmetadata.identifier = this.getElementText(xml, \"identifier\");\n\t\tmetadata.language = this.getElementText(xml, \"language\");\n\t\tmetadata.rights = this.getElementText(xml, \"rights\");\n\n\t\tmetadata.modified_date = this.getPropertyText(xml, \"dcterms:modified\");\n\n\t\tmetadata.layout = this.getPropertyText(xml, \"rendition:layout\");\n\t\tmetadata.orientation = this.getPropertyText(xml, \"rendition:orientation\");\n\t\tmetadata.flow = this.getPropertyText(xml, \"rendition:flow\");\n\t\tmetadata.viewport = this.getPropertyText(xml, \"rendition:viewport\");\n\t\tmetadata.media_active_class = this.getPropertyText(xml, \"media:active-class\");\n\t\tmetadata.spread = this.getPropertyText(xml, \"rendition:spread\");\n\t\t// metadata.page_prog_dir = packageXml.querySelector(\"spine\").getAttribute(\"page-progression-direction\");\n\n\t\treturn metadata;\n\t}\n\n\t/**\n\t * Parse Manifest\n\t * @private\n\t * @param {node} manifestXml\n\t * @return {object} manifest\n\t */\n\tparseManifest(manifestXml: Element): PackagingManifestObject {\n\t\tconst manifest: PackagingManifestObject = {};\n\n\t\t//-- Turn items into an array\n\t\t// var selected = manifestXml.querySelectorAll(\"item\");\n\t\tconst selected = qsa(manifestXml, \"item\");\n\t\tconst items = Array.prototype.slice.call(selected);\n\n\t\t//-- Create an object with the id as key\n\t\titems.forEach(function(item: Element){\n\t\t\tconst id = item.getAttribute(\"id\") ?? \"\",\n\t\t\t\t\thref = item.getAttribute(\"href\") || \"\",\n\t\t\t\t\ttype = item.getAttribute(\"media-type\") || \"\",\n\t\t\t\t\toverlay = item.getAttribute(\"media-overlay\") || \"\",\n\t\t\t\t\tproperties = item.getAttribute(\"properties\") || \"\";\n\n\t\t\tmanifest[id] = {\n\t\t\t\t\"href\" : href,\n\t\t\t\t// \"url\" : href,\n\t\t\t\t\"type\" : type,\n\t\t\t\t\"overlay\" : overlay,\n\t\t\t\t\"properties\" : properties.length ? properties.split(\" \") : []\n\t\t\t};\n\n\t\t});\n\n\t\treturn manifest;\n\n\t}\n\n\t/**\n\t * Parse Spine\n\t * @private\n\t * @param {node} spineXml\n\t * @param {Packaging.manifest} manifest\n\t * @return {object} spine\n\t */\n\tparseSpine(spineXml: Element, _manifest: PackagingManifestObject): PackagingSpineItem[] {\n\t\tconst spine: PackagingSpineItem[] = [];\n\n\t\tconst selected = qsa(spineXml, \"itemref\");\n\t\tconst items = Array.prototype.slice.call(selected);\n\n\t\t// var epubcfi = new EpubCFI();\n\n\t\t//-- Add to array to maintain ordering and cross reference with manifest\n\t\titems.forEach(function(item: Element, index: number){\n\t\t\tconst idref = item.getAttribute(\"idref\");\n\t\t\t// var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id);\n\t\t\tconst props = item.getAttribute(\"properties\") || \"\";\n\t\t\tconst propArray = props.length ? props.split(\" \") : [];\n\t\t\t// var manifestProps = manifest[Id].properties;\n\t\t\t// var manifestPropArray = manifestProps.length ? manifestProps.split(\" \") : [];\n\n\t\t\tconst itemref = {\n\t\t\t\t\"id\" : item.getAttribute(\"id\") ?? undefined,\n\t\t\t\t\"idref\" : idref!,\n\t\t\t\t\"linear\" : item.getAttribute(\"linear\") || \"yes\",\n\t\t\t\t\"properties\" : propArray,\n\t\t\t\t// \"href\" : manifest[Id].href,\n\t\t\t\t// \"url\" : manifest[Id].url,\n\t\t\t\t\"index\" : index\n\t\t\t\t// \"cfiBase\" : cfiBase\n\t\t\t};\n\t\t\tspine.push(itemref);\n\t\t});\n\n\t\treturn spine;\n\t}\n\n\t/**\n\t * Find Unique Identifier\n\t * @private\n\t * @param {node} packageXml\n\t * @return {string} Unique Identifier text\n\t */\n\tfindUniqueIdentifier(packageXml: Document): string {\n\t\tconst uniqueIdentifierId = packageXml.documentElement.getAttribute(\"unique-identifier\");\n\t\tif (! uniqueIdentifierId) {\n\t\t\treturn \"\";\n\t\t}\n\t\tconst identifier = packageXml.getElementById(uniqueIdentifierId);\n\t\tif (! identifier) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (identifier.localName === \"identifier\" && identifier.namespaceURI === \"http://purl.org/dc/elements/1.1/\") {\n\t\t\treturn identifier.childNodes.length > 0 ? (identifier.childNodes[0].nodeValue ?? \"\").trim() : \"\";\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Find TOC NAV\n\t * @private\n\t * @param {element} manifestNode\n\t * @return {string}\n\t */\n\tfindNavPath(manifestNode: Element): string {\n\t\t// Find item with property \"nav\"\n\t\t// Should catch nav regardless of order\n\t\t// var node = manifestNode.querySelector(\"item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']\");\n\t\tconst node = qsp(manifestNode, \"item\", {\"properties\":\"nav\"});\n\t\treturn node ? node.getAttribute(\"href\") || \"\" : \"\";\n\t}\n\n\t/**\n\t * Find TOC NCX\n\t * media-type=\"application/x-dtbncx+xml\" href=\"toc.ncx\"\n\t * @private\n\t * @param {element} manifestNode\n\t * @param {element} spineNode\n\t * @return {string}\n\t */\n\tfindNcxPath(manifestNode: Element, spineNode: Element): string {\n\t\t// var node = manifestNode.querySelector(\"item[media-type='application/x-dtbncx+xml']\");\n\t\tlet node = qsp(manifestNode, \"item\", {\"media-type\":\"application/x-dtbncx+xml\"});\n\t\tlet tocId;\n\n\t\t// If we can't find the toc by media-type then try to look for id of the item in the spine attributes as\n\t\t// according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2,\n\t\t// \"The item that describes the NCX must be referenced by the spine toc attribute.\"\n\t\tif (!node) {\n\t\t\ttocId = spineNode.getAttribute(\"toc\");\n\t\t\tif(tocId) {\n\t\t\t\t// node = manifestNode.querySelector(\"item[id='\" + tocId + \"']\");\n\t\t\t\tnode = manifestNode.querySelector(`#${tocId}`) ?? undefined;\n\t\t\t}\n\t\t}\n\n\t\treturn node ? node.getAttribute(\"href\") || \"\" : \"\";\n\t}\n\n\t/**\n\t * Find the Cover Path\n\t * <item properties=\"cover-image\" id=\"ci\" href=\"cover.svg\" media-type=\"image/svg+xml\" />\n\t * Fallback for Epub 2.0\n\t * @private\n\t * @param {node} packageXml\n\t * @return {string} href\n\t */\n\tfindCoverPath(packageXml: Document): string {\n\t\tconst pkg = qs(packageXml, \"package\");\n\t\tconst _epubVersion = pkg?.getAttribute(\"version\");\n\n\t\t// Try parsing cover with epub 3.\n\t\t// var node = packageXml.querySelector(\"item[properties='cover-image']\");\n\t\tconst node = qsp(packageXml, \"item\", {\"properties\":\"cover-image\"});\n\t\tif (node) return node.getAttribute(\"href\") ?? \"\";\n\n\t\t// Fallback to epub 2.\n\t\tconst metaCover = qsp(packageXml, \"meta\", {\"name\":\"cover\"});\n\n\t\tif (metaCover) {\n\t\t\tconst coverId = metaCover.getAttribute(\"content\");\n\t\t\t// var cover = packageXml.querySelector(\"item[id='\" + coverId + \"']\");\n\t\t\tconst cover = packageXml.getElementById(coverId!);\n\t\t\treturn cover ? cover.getAttribute(\"href\") ?? \"\" : \"\";\n\t\t}\n\t\telse {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\t/**\n\t * Get text of a namespaced element\n\t * @private\n\t * @param {node} xml\n\t * @param {string} tag\n\t * @return {string} text\n\t */\n\tgetElementText(xml: Element, tag: string): string {\n\t\tconst found = xml.getElementsByTagNameNS(\"http://purl.org/dc/elements/1.1/\", tag);\n\n\t\tif(!found || found.length === 0) return \"\";\n\n\t\tconst el = found[0];\n\n\t\tif(el.childNodes.length){\n\t\t\treturn el.childNodes[0].nodeValue ?? \"\";\n\t\t}\n\n\t\treturn \"\";\n\n\t}\n\n\t/**\n\t * Get text by property\n\t * @private\n\t * @param {node} xml\n\t * @param {string} property\n\t * @return {string} text\n\t */\n\tgetPropertyText(xml: Element, property: string): string {\n\t\tconst el = qsp(xml, \"meta\", {\"property\":property});\n\n\t\tif(el && el.childNodes.length){\n\t\t\treturn el.childNodes[0].nodeValue ?? \"\";\n\t\t}\n\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Load JSON Manifest\n\t * @param {document} packageDocument OPF XML\n\t * @return {object} parsed package parts\n\t */\n\tload(json: Record<string, any>): PackagingObject & { toc: NavItem[] } {\n\t\tthis.metadata = json.metadata;\n\n\t\tconst spine = json.readingOrder || json.spine;\n\t\tthis.spine = spine.map((item: PackagingSpineItem, index: number) =>{\n\t\t\titem.index = index;\n\t\t\titem.linear = item.linear || \"yes\";\n\t\t\treturn item;\n\t\t});\n\n\t\tjson.resources.forEach((item: PackagingManifestItem, index: number) => {\n\t\t\tthis.manifest[index] = item;\n\n\t\t\tif ((item as any).rel && (item as any).rel[0] === \"cover\") {\n\t\t\t\tthis.coverPath = item.href;\n\t\t\t}\n\t\t});\n\n\t\tthis.spineNodeIndex = 0;\n\n\t\tthis.toc = json.toc.map((item: NavItem & { title?: string }) =>{\n\t\t\titem.label = item.title || item.label;\n\t\t\treturn item;\n\t\t});\n\n\t\treturn {\n\t\t\t\"metadata\" : this.metadata,\n\t\t\t\"spine\" : this.spine,\n\t\t\t\"manifest\" : this.manifest,\n\t\t\t\"navPath\" : this.navPath,\n\t\t\t\"ncxPath\" : this.ncxPath,\n\t\t\t\"coverPath\": this.coverPath,\n\t\t\t\"spineNodeIndex\" : this.spineNodeIndex,\n\t\t\t\"toc\" : this.toc\n\t\t};\n\t}\n\n\tdestroy(): void {\n\t\t(this as any).manifest = undefined;\n\t\t(this as any).navPath = undefined;\n\t\t(this as any).ncxPath = undefined;\n\t\t(this as any).coverPath = undefined;\n\t\t(this as any).spineNodeIndex = undefined;\n\t\t(this as any).spine = undefined;\n\t\t(this as any).metadata = undefined;\n\t}\n}\n\nexport default Packaging;\n","import {qs, qsa, querySelectorByType, filterChildren} from \"./utils/core\";\nimport type { NavItem, LandmarkItem } from \"./types\";\n\n/**\n * Navigation Parser\n * @param {document} xml navigation html / xhtml / ncx\n */\nclass Navigation {\n\ttoc: NavItem[];\n\ttocByHref: Record<string, number>;\n\ttocById: Record<string, number>;\n\tlandmarks: LandmarkItem[];\n\tlandmarksByType: Record<string, number>;\n\tlength: number;\n\n\tconstructor(xml?: Document | NavItem[]) {\n\t\tthis.toc = [];\n\t\tthis.tocByHref = {};\n\t\tthis.tocById = {};\n\n\t\tthis.landmarks = [];\n\t\tthis.landmarksByType = {};\n\n\t\tthis.length = 0;\n\t\tif (xml) {\n\t\t\tthis.parse(xml);\n\t\t}\n\t}\n\n\t/**\n\t * Parse out the navigation items\n\t * @param {document} xml navigation html / xhtml / ncx\n\t */\n\tparse(xml: Document | NavItem[]): void {\n\t\tconst isXml = (xml as Document).nodeType;\n\t\tlet html;\n\t\tlet ncx;\n\n\t\tif (isXml) {\n\t\t\thtml = qs(xml as Document, \"html\");\n\t\t\tncx = qs(xml as Document, \"ncx\");\n\t\t}\n\n\t\tif (!isXml) {\n\t\t\tthis.toc = this.load(xml as NavItem[]);\n\t\t} else if(html) {\n\t\t\tthis.toc = this.parseNav(xml as Document);\n\t\t\tthis.landmarks = this.parseLandmarks(xml as Document);\n\t\t} else if(ncx){\n\t\t\tthis.toc = this.parseNcx(xml as Document);\n\t\t}\n\n\t\tthis.length = 0;\n\n\t\tthis.unpack(this.toc);\n\t}\n\n\t/**\n\t * Unpack navigation items\n\t * @private\n\t * @param {array} toc\n\t */\n\tunpack(toc: NavItem[]): void {\n\t\tlet item;\n\n\t\tfor (let i = 0; i < toc.length; i++) {\n\t\t\titem = toc[i];\n\n\t\t\tif (item.href) {\n\t\t\t\tthis.tocByHref[item.href] = i;\n\t\t\t}\n\n\t\t\tif (item.id) {\n\t\t\t\tthis.tocById[item.id] = i;\n\t\t\t}\n\n\t\t\tthis.length++;\n\n\t\t\tif (item.subitems && item.subitems.length) {\n\t\t\t\tthis.unpack(item.subitems);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Get an item from the navigation\n\t * @param {string} target\n\t * @return {object} navItem\n\t */\n\tget(target?: string): NavItem | NavItem[] | undefined {\n\t\tlet index;\n\n\t\tif(!target) {\n\t\t\treturn this.toc;\n\t\t}\n\n\t\tif(target.indexOf(\"#\") === 0) {\n\t\t\tindex = this.tocById[target.substring(1)];\n\t\t} else if(target in this.tocByHref){\n\t\t\tindex = this.tocByHref[target];\n\t\t}\n\n\t\treturn this.getByIndex(target, index, this.toc);\n\t}\n\n\t/**\n\t * Get an item from navigation subitems recursively by index\n\t * @param {string} target\n\t * @param {number} index\n\t * @param {array} navItems\n\t * @return {object} navItem\n\t */\n\tgetByIndex(target: string, index: number | undefined, navItems: NavItem[]): NavItem | undefined {\n\t\tif (navItems.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst item = index !== undefined ? navItems[index] : undefined;\n\t\tif (item && (target === item.id || target === item.href)) {\n\t\t\treturn item;\n\t\t} else {\n\t\t\tlet result;\n\t\t\tfor (let i = 0; i < navItems.length; ++i) {\n\t\t\t\tresult = this.getByIndex(target, index, navItems[i].subitems ?? []);\n\t\t\t\tif (result) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t/**\n\t * Get a landmark by type\n\t * List of types: https://idpf.github.io/epub-vocabs/structure/\n\t * @param {string} type\n\t * @return {object} landmarkItem\n\t */\n\tlandmark(type?: string): LandmarkItem | LandmarkItem[] | undefined {\n\t\tif(!type) {\n\t\t\treturn this.landmarks;\n\t\t}\n\n\t\tconst index = this.landmarksByType[type];\n\n\t\treturn this.landmarks[index];\n\t}\n\n\t/**\n\t * Parse toc from a Epub > 3.0 Nav\n\t * @private\n\t * @param {document} navHtml\n\t * @return {array} navigation list\n\t */\n\tparseNav(navHtml: Document): NavItem[] {\n\t\tconst navElement = querySelectorByType(navHtml, \"nav\", \"toc\");\n\t\tlet list: NavItem[] = [];\n\n\t\tif (!navElement) return list;\n\n\t\tconst navList = filterChildren(navElement, \"ol\", true) as Element;\n\t\tif (!navList) return list;\n\n\t\tlist = this.parseNavList(navList);\n\t\treturn list;\n\t}\n\n\t/**\n\t * Parses lists in the toc\n\t * @param {document} navListHtml\n\t * @param {string} parent id\n\t * @return {array} navigation list\n\t */\n\tparseNavList(navListHtml: Element, parent?: string): NavItem[] {\n\t\tconst result: NavItem[] = [];\n\n\t\tif (!navListHtml) return result;\n\t\tif (!navListHtml.children) return result;\n\t\t\n\t\tfor (let i = 0; i < navListHtml.children.length; i++) {\n\t\t\tconst item = this.navItem(navListHtml.children[i], parent);\n\n\t\t\tif (item) {\n\t\t\t\tresult.push(item);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Create a navItem\n\t * @private\n\t * @param {element} item\n\t * @return {object} navItem\n\t */\n\tnavItem(item: Element, parent?: string): NavItem | undefined {\n\t\tlet id = item.getAttribute(\"id\") || undefined;\n\t\tconst content = (filterChildren(item, \"a\", true)\n\t\t\t|| filterChildren(item, \"span\", true)) as Element;\n\n\t\tif (!content) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst src = content.getAttribute(\"href\") || \"\";\n\t\t\n\t\tif (!id) {\n\t\t\tid = src;\n\t\t}\n\t\tconst text = content.textContent || \"\";\n\n\t\tlet subitems: NavItem[] = [];\n\t\tconst nested = filterChildren(item, \"ol\", true) as Element;\n\t\tif (nested) {\n\t\t\tsubitems = \tthis.parseNavList(nested, id);\n\t\t}\n\n\t\treturn {\n\t\t\t\"id\": id,\n\t\t\t\"href\": src,\n\t\t\t\"label\": text,\n\t\t\t\"subitems\" : subitems,\n\t\t\t\"parent\" : parent\n\t\t};\n\t}\n\n\t/**\n\t * Parse landmarks from a Epub > 3.0 Nav\n\t * @private\n\t * @param {document} navHtml\n\t * @return {array} landmarks list\n\t */\n\tparseLandmarks(navHtml: Document): LandmarkItem[] {\n\t\tconst navElement = querySelectorByType(navHtml, \"nav\", \"landmarks\");\n\t\tconst navItems = navElement ? Array.from(qsa(navElement, \"li\")) : [];\n\t\tconst length = navItems.length;\n\t\tlet i;\n\t\tconst list: LandmarkItem[] = [];\n\t\tlet item;\n\n\t\tif(!navItems || length === 0) return list;\n\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\titem = this.landmarkItem(navItems[i]);\n\t\t\tif (item) {\n\t\t\t\tlist.push(item);\n\t\t\t\tthis.landmarksByType[item.type!] = i;\n\t\t\t}\n\t\t}\n\n\t\treturn list;\n\t}\n\n\t/**\n\t * Create a landmarkItem\n\t * @private\n\t * @param {element} item\n\t * @return {object} landmarkItem\n\t */\n\tlandmarkItem(item: Element): LandmarkItem | undefined {\n\t\tconst content = filterChildren(item, \"a\", true) as Element;\n\n\t\tif (!content) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst type = content.getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") || undefined;\n\t\tconst href = content.getAttribute(\"href\") || \"\";\n\t\tconst text = content.textContent || \"\";\n\n\t\treturn {\n\t\t\t\"href\": href,\n\t\t\t\"label\": text,\n\t\t\t\"type\" : type\n\t\t};\n\t}\n\n\t/**\n\t * Parse from a Epub > 3.0 NC\n\t * @private\n\t * @param {document} navHtml\n\t * @return {array} navigation list\n\t */\n\tparseNcx(tocXml: Document): NavItem[] {\n\t\tconst navPoints = qsa(tocXml, \"navPoint\");\n\t\tconst length = navPoints.length;\n\t\tlet i;\n\t\tconst toc: Record<string, NavItem> = {};\n\t\tconst list: NavItem[] = [];\n\t\tlet item, parent;\n\n\t\tif(!navPoints || length === 0) return list;\n\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\titem = this.ncxItem(navPoints[i]);\n\t\t\ttoc[item.id] = item;\n\t\t\tif(!item.parent) {\n\t\t\t\tlist.push(item);\n\t\t\t} else {\n\t\t\t\tparent = toc[item.parent];\n\t\t\t\tparent.subitems!.push(item);\n\t\t\t}\n\t\t}\n\n\t\treturn list;\n\t}\n\n\t/**\n\t * Create a ncxItem\n\t * @private\n\t * @param {element} item\n\t * @return {object} ncxItem\n\t */\n\tncxItem(item: Element): NavItem {\n\t\tconst id = item.getAttribute(\"id\") || \"\",\n\t\t\t\tcontent = qs(item, \"content\"),\n\t\t\t\tsrc = content ? content.getAttribute(\"src\") ?? \"\" : \"\",\n\t\t\t\tnavLabel = qs(item, \"navLabel\"),\n\t\t\t\ttext = navLabel?.textContent ? navLabel.textContent : \"\",\n\t\t\t\tsubitems: NavItem[] = [],\n\t\t\t\tparentNode = item.parentNode;\n\t\tlet parent;\n\n\t\tif(parentNode && (parentNode.nodeName === \"navPoint\" || parentNode.nodeName.split(\":\").slice(-1)[0] === \"navPoint\")) {\n\t\t\tparent = (parentNode as Element).getAttribute(\"id\") ?? undefined;\n\t\t}\n\n\n\t\treturn {\n\t\t\t\"id\": id,\n\t\t\t\"href\": src,\n\t\t\t\"label\": text,\n\t\t\t\"subitems\" : subitems,\n\t\t\t\"parent\" : parent\n\t\t};\n\t}\n\n\t/**\n\t * Load Spine Items\n\t * @param {object} json the items to be loaded\n\t * @return {Array} navItems\n\t */\n\tload(json: any[]): NavItem[] {\n\t\treturn json.map(item => {\n\t\t\titem.label = item.title;\n\t\t\titem.subitems = item.children ? this.load(item.children) : [];\n\t\t\treturn item;\n\t\t});\n\t}\n\n\t/**\n\t * forEach pass through\n\t * @param {Function} fn function to run on each item\n\t * @return {method} forEach loop\n\t */\n\tforEach(fn: (item: NavItem, index: number, array: NavItem[]) => void): void {\n\t\treturn this.toc.forEach(fn);\n\t}\n}\n\nexport default Navigation;\n","/*\n From Zip.js, by Gildas Lormeau\nedited down\n */\n\nconst table = {\n\t\"application\" : {\n\t\t\"ecmascript\" : [ \"es\", \"ecma\" ],\n\t\t\"javascript\" : \"js\",\n\t\t\"ogg\" : \"ogx\",\n\t\t\"pdf\" : \"pdf\",\n\t\t\"postscript\" : [ \"ps\", \"ai\", \"eps\", \"epsi\", \"epsf\", \"eps2\", \"eps3\" ],\n\t\t\"rdf+xml\" : \"rdf\",\n\t\t\"smil\" : [ \"smi\", \"smil\" ],\n\t\t\"xhtml+xml\" : [ \"xhtml\", \"xht\" ],\n\t\t\"xml\" : [ \"xml\", \"xsl\", \"xsd\", \"opf\", \"ncx\" ],\n\t\t\"zip\" : \"zip\",\n\t\t\"x-httpd-eruby\" : \"rhtml\",\n\t\t\"x-latex\" : \"latex\",\n\t\t\"x-maker\" : [ \"frm\", \"maker\", \"frame\", \"fm\", \"fb\", \"book\", \"fbdoc\" ],\n\t\t\"x-object\" : \"o\",\n\t\t\"x-shockwave-flash\" : [ \"swf\", \"swfl\" ],\n\t\t\"x-silverlight\" : \"scr\",\n\t\t\"epub+zip\" : \"epub\",\n\t\t\"font-tdpfr\" : \"pfr\",\n\t\t\"inkml+xml\" : [ \"ink\", \"inkml\" ],\n\t\t\"json\" : \"json\",\n\t\t\"jsonml+json\" : \"jsonml\",\n\t\t\"mathml+xml\" : \"mathml\",\n\t\t\"metalink+xml\" : \"metalink\",\n\t\t\"mp4\" : \"mp4s\",\n\t\t// \"oebps-package+xml\" : \"opf\",\n\t\t\"omdoc+xml\" : \"omdoc\",\n\t\t\"oxps\" : \"oxps\",\n\t\t\"vnd.amazon.ebook\" : \"azw\",\n\t\t\"widget\" : \"wgt\",\n\t\t// \"x-dtbncx+xml\" : \"ncx\",\n\t\t\"x-dtbook+xml\" : \"dtb\",\n\t\t\"x-dtbresource+xml\" : \"res\",\n\t\t\"x-font-bdf\" : \"bdf\",\n\t\t\"x-font-ghostscript\" : \"gsf\",\n\t\t\"x-font-linux-psf\" : \"psf\",\n\t\t\"x-font-otf\" : \"otf\",\n\t\t\"x-font-pcf\" : \"pcf\",\n\t\t\"x-font-snf\" : \"snf\",\n\t\t\"x-font-ttf\" : [ \"ttf\", \"ttc\" ],\n\t\t\"x-font-type1\" : [ \"pfa\", \"pfb\", \"pfm\", \"afm\" ],\n\t\t\"x-font-woff\" : \"woff\",\n\t\t\"x-mobipocket-ebook\" : [ \"prc\", \"mobi\" ],\n\t\t\"x-mspublisher\" : \"pub\",\n\t\t\"x-nzb\" : \"nzb\",\n\t\t\"x-tgif\" : \"obj\",\n\t\t\"xaml+xml\" : \"xaml\",\n\t\t\"xml-dtd\" : \"dtd\",\n\t\t\"xproc+xml\" : \"xpl\",\n\t\t\"xslt+xml\" : \"xslt\",\n\t\t\"internet-property-stream\" : \"acx\",\n\t\t\"x-compress\" : \"z\",\n\t\t\"x-compressed\" : \"tgz\",\n\t\t\"x-gzip\" : \"gz\",\n\t},\n\t\"audio\" : {\n\t\t\"flac\" : \"flac\",\n\t\t\"midi\" : [ \"mid\", \"midi\", \"kar\", \"rmi\" ],\n\t\t\"mpeg\" : [ \"mpga\", \"mpega\", \"mp2\", \"mp3\", \"m4a\", \"mp2a\", \"m2a\", \"m3a\" ],\n\t\t\"mpegurl\" : \"m3u\",\n\t\t\"ogg\" : [ \"oga\", \"ogg\", \"spx\" ],\n\t\t\"x-aiff\" : [ \"aif\", \"aiff\", \"aifc\" ],\n\t\t\"x-ms-wma\" : \"wma\",\n\t\t\"x-wav\" : \"wav\",\n\t\t\"adpcm\" : \"adp\",\n\t\t\"mp4\" : \"mp4a\",\n\t\t\"webm\" : \"weba\",\n\t\t\"x-aac\" : \"aac\",\n\t\t\"x-caf\" : \"caf\",\n\t\t\"x-matroska\" : \"mka\",\n\t\t\"x-pn-realaudio-plugin\" : \"rmp\",\n\t\t\"xm\" : \"xm\",\n\t\t\"mid\" : [ \"mid\", \"rmi\" ]\n\t},\n\t\"image\" : {\n\t\t\"gif\" : \"gif\",\n\t\t\"ief\" : \"ief\",\n\t\t\"jpeg\" : [ \"jpeg\", \"jpg\", \"jpe\" ],\n\t\t\"pcx\" : \"pcx\",\n\t\t\"png\" : \"png\",\n\t\t\"svg+xml\" : [ \"svg\", \"svgz\" ],\n\t\t\"tiff\" : [ \"tiff\", \"tif\" ],\n\t\t\"x-icon\" : \"ico\",\n\t\t\"bmp\" : \"bmp\",\n\t\t\"webp\" : \"webp\",\n\t\t\"x-pict\" : [ \"pic\", \"pct\" ],\n\t\t\"x-tga\" : \"tga\",\n\t\t\"cis-cod\" : \"cod\"\n\t},\n\t\"text\" : {\n\t\t\"cache-manifest\" : [ \"manifest\", \"appcache\" ],\n\t\t\"css\" : \"css\",\n\t\t\"csv\" : \"csv\",\n\t\t\"html\" : [ \"html\", \"htm\", \"shtml\", \"stm\" ],\n\t\t\"mathml\" : \"mml\",\n\t\t\"plain\" : [ \"txt\", \"text\", \"brf\", \"conf\", \"def\", \"list\", \"log\", \"in\", \"bas\" ],\n\t\t\"richtext\" : \"rtx\",\n\t\t\"tab-separated-values\" : \"tsv\",\n\t\t\"x-bibtex\" : \"bib\"\n\t},\n\t\"video\" : {\n\t\t\"mpeg\" : [ \"mpeg\", \"mpg\", \"mpe\", \"m1v\", \"m2v\", \"mp2\", \"mpa\", \"mpv2\" ],\n\t\t\"mp4\" : [ \"mp4\", \"mp4v\", \"mpg4\" ],\n\t\t\"quicktime\" : [ \"qt\", \"mov\" ],\n\t\t\"ogg\" : \"ogv\",\n\t\t\"vnd.mpegurl\" : [ \"mxu\", \"m4u\" ],\n\t\t\"x-flv\" : \"flv\",\n\t\t\"x-la-asf\" : [ \"lsf\", \"lsx\" ],\n\t\t\"x-mng\" : \"mng\",\n\t\t\"x-ms-asf\" : [ \"asf\", \"asx\", \"asr\" ],\n\t\t\"x-ms-wm\" : \"wm\",\n\t\t\"x-ms-wmv\" : \"wmv\",\n\t\t\"x-ms-wmx\" : \"wmx\",\n\t\t\"x-ms-wvx\" : \"wvx\",\n\t\t\"x-msvideo\" : \"avi\",\n\t\t\"x-sgi-movie\" : \"movie\",\n\t\t\"x-matroska\" : [ \"mpv\", \"mkv\", \"mk3d\", \"mks\" ],\n\t\t\"3gpp2\" : \"3g2\",\n\t\t\"h261\" : \"h261\",\n\t\t\"h263\" : \"h263\",\n\t\t\"h264\" : \"h264\",\n\t\t\"jpeg\" : \"jpgv\",\n\t\t\"jpm\" : [ \"jpm\", \"jpgm\" ],\n\t\t\"mj2\" : [ \"mj2\", \"mjp2\" ],\n\t\t\"vnd.ms-playready.media.pyv\" : \"pyv\",\n\t\t\"vnd.uvvu.mp4\" : [ \"uvu\", \"uvvu\" ],\n\t\t\"vnd.vivo\" : \"viv\",\n\t\t\"webm\" : \"webm\",\n\t\t\"x-f4v\" : \"f4v\",\n\t\t\"x-m4v\" : \"m4v\",\n\t\t\"x-ms-vob\" : \"vob\",\n\t\t\"x-smv\" : \"smv\"\n\t}\n};\n\nconst mimeTypes = (function() {\n\tlet type, subtype, val, index; const mimeTypes: Record<string, string> = {};\n\tfor (type in table) {\n\t\tif (table.hasOwnProperty(type)) {\n\t\t\tfor (subtype in (table as Record<string, any>)[type]) {\n\t\t\t\tif ((table as Record<string, any>)[type].hasOwnProperty(subtype)) {\n\t\t\t\t\tval = (table as Record<string, any>)[type][subtype];\n\t\t\t\t\tif (typeof val == \"string\") {\n\t\t\t\t\t\tmimeTypes[val] = type + \"/\" + subtype;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (index = 0; index < val.length; index++) {\n\t\t\t\t\t\t\tmimeTypes[val[index]] = type + \"/\" + subtype;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn mimeTypes;\n})();\n\nconst defaultValue = \"text/plain\";//\"application/octet-stream\";\n\nfunction lookup(filename: string): string {\n\treturn filename && (mimeTypes as Record<string, string>)[filename.split(\".\").pop()!.toLowerCase()] || defaultValue;\n};\n\nexport default { lookup };\n","import {substitute} from \"./utils/replacements\";\nimport {createBase64Url, createBlobUrl, blob2base64} from \"./utils/core\";\nimport Url from \"./utils/url\";\nimport mime from \"./utils/mime\";\nimport Path from \"./utils/path\";\nimport path from \"./utils/path-utils\";\nimport type { PackagingManifestObject, PackagingManifestItem, RequestFunction } from \"./types\";\nimport type Archive from \"./archive\";\n\n/**\n * Handle Package Resources\n * @class\n * @param {Manifest} manifest\n * @param {object} [options]\n * @param {string} [options.replacements=\"base64\"]\n * @param {Archive} [options.archive]\n * @param {method} [options.resolver]\n */\nclass Resources {\n\tsettings: {\n\t\treplacements: string;\n\t\tarchive: Archive;\n\t\tresolver: (href: string, absolute?: boolean) => string;\n\t\trequest: RequestFunction;\n\t};\n\tmanifest: PackagingManifestObject;\n\tresources: PackagingManifestItem[];\n\treplacementUrls: string[];\n\thtml: PackagingManifestItem[];\n\tassets: PackagingManifestItem[];\n\tcss: PackagingManifestItem[];\n\turls: string[];\n\tcssUrls: string[];\n\n\tconstructor(manifest: PackagingManifestObject, options?: { replacements?: string; archive?: Archive; resolver?: (href: string, absolute?: boolean) => string; request?: RequestFunction }) {\n\t\tthis.settings = {\n\t\t\treplacements: (options && options.replacements) || \"base64\",\n\t\t\tarchive: (options && options.archive)!,\n\t\t\tresolver: (options && options.resolver)!,\n\t\t\trequest: (options && options.request)!\n\t\t};\n\n\t\tthis.process(manifest);\n\t}\n\n\t/**\n\t * Process resources\n\t * @param {Manifest} manifest\n\t */\n\tprocess(manifest: PackagingManifestObject): void {\n\t\tthis.manifest = manifest;\n\t\tthis.resources = Object.keys(manifest).\n\t\t\tmap(function (key){\n\t\t\t\treturn manifest[key];\n\t\t\t});\n\n\t\tthis.replacementUrls = [];\n\n\t\tthis.html = [];\n\t\tthis.assets = [];\n\t\tthis.css = [];\n\n\t\tthis.urls = [];\n\t\tthis.cssUrls = [];\n\n\t\tthis.split();\n\t\tthis.splitUrls();\n\t}\n\n\t/**\n\t * Split resources by type\n\t * @private\n\t */\n\tsplit(): void {\n\n\t\t// HTML\n\t\tthis.html = this.resources.\n\t\t\tfilter(function (item){\n\t\t\t\tif (item.type === \"application/xhtml+xml\" ||\n\t\t\t\t\t\titem.type === \"text/html\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Exclude HTML\n\t\tthis.assets = this.resources.\n\t\t\tfilter(function (item){\n\t\t\t\tif (item.type !== \"application/xhtml+xml\" &&\n\t\t\t\t\t\titem.type !== \"text/html\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Only CSS\n\t\tthis.css = this.resources.\n\t\t\tfilter(function (item){\n\t\t\t\tif (item.type === \"text/css\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/**\n\t * Convert split resources into Urls\n\t * @private\n\t */\n\tsplitUrls(): void {\n\n\t\t// All Assets Urls\n\t\tthis.urls = this.assets.\n\t\t\tmap(function(item: PackagingManifestItem) {\n\t\t\t\treturn item.href;\n\t\t\t}.bind(this));\n\n\t\t// Css Urls\n\t\tthis.cssUrls = this.css.map(function(item) {\n\t\t\treturn item.href;\n\t\t});\n\n\t}\n\n\t/**\n\t * Create a url to a resource\n\t * @param {string} url\n\t * @return {Promise<string>} Promise resolves with url string\n\t */\n\tcreateUrl (url: string): Promise<string> {\n\t\tconst parsedUrl = new Url(url);\n\t\tconst mimeType = mime.lookup(parsedUrl.filename);\n\n\t\tif (this.settings.archive) {\n\t\t\treturn this.settings.archive.createUrl(url, {\"base64\": (this.settings.replacements === \"base64\")});\n\t\t} else {\n\t\t\tif (this.settings.replacements === \"base64\") {\n\t\t\t\treturn this.settings.request(url, \"blob\")\n\t\t\t\t\t.then((blob: Blob) => {\n\t\t\t\t\t\treturn blob2base64(blob);\n\t\t\t\t\t})\n\t\t\t\t\t.then((base64: string) => {\n\t\t\t\t\t\treturn createBase64Url(base64, mimeType)!;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.settings.request(url, \"blob\").then((blob: Blob) => {\n\t\t\t\t\treturn createBlobUrl(blob, mimeType);\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Create blob urls for all the assets\n\t * @return {Promise} returns replacement urls\n\t */\n\treplacements(): Promise<string[]> {\n\t\tif (this.settings.replacements === \"none\") {\n\t\t\treturn new Promise(function(resolve: (value: string[]) => void) {\n\t\t\t\tresolve(this.urls);\n\t\t\t}.bind(this));\n\t\t}\n\n\t\tconst replacements = this.urls.map( (url) => {\n\t\t\t\tconst absolute = this.settings.resolver(url);\n\n\t\t\t\treturn this.createUrl(absolute).\n\t\t\t\t\tcatch((_err: Error): string | null => {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error(_err);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t});\n\t\t\t});\n\n\t\treturn Promise.all(replacements)\n\t\t\t.then( (replacementUrls) => {\n\t\t\t\tthis.replacementUrls = replacementUrls.filter((url): url is string => {\n\t\t\t\t\treturn (typeof(url) === \"string\");\n\t\t\t\t});\n\t\t\t\treturn replacementUrls as string[];\n\t\t\t});\n\t}\n\n\t/**\n\t * Replace URLs in CSS resources\n\t * @private\n\t * @param {Archive} [archive]\n\t * @param {method} [resolver]\n\t * @return {Promise}\n\t */\n\treplaceCss(archive?: Archive, resolver?: (href: string, absolute?: boolean) => string): Promise<(string | void)[]> {\n\t\tconst replaced: Promise<string | void>[] = [];\n\t\tarchive = archive || this.settings.archive;\n\t\tresolver = resolver || this.settings.resolver;\n\t\tthis.cssUrls.forEach(function(href: string) {\n\t\t\tconst replacement = this.createCssFile(href, archive, resolver)\n\t\t\t\t.then(function (replacementUrl: string) {\n\t\t\t\t\t// switch the url in the replacementUrls\n\t\t\t\t\tconst indexInUrls = this.urls.indexOf(href);\n\t\t\t\t\tif (indexInUrls > -1) {\n\t\t\t\t\t\tthis.replacementUrls[indexInUrls] = replacementUrl;\n\t\t\t\t\t}\n\t\t\t\t}.bind(this))\n\n\n\t\t\treplaced.push(replacement);\n\t\t}.bind(this));\n\t\treturn Promise.all(replaced);\n\t}\n\n\t/**\n\t * Create a new CSS file with the replaced URLs\n\t * @private\n\t * @param {string} href the original css file\n\t * @return {Promise} returns a BlobUrl to the new CSS file or a data url\n\t */\n\tcreateCssFile(href: string): Promise<string | void> {\n\t\tlet newUrl;\n\n\t\tif (path.isAbsolute(href)) {\n\t\t\treturn new Promise<void>(function(resolve){\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\n\t\tconst absolute = this.settings.resolver(href);\n\n\t\t// Get the text of the css file from the archive\n\t\tlet textResponse;\n\n\t\tif (this.settings.archive) {\n\t\t\ttextResponse = this.settings.archive.getText(absolute);\n\t\t} else {\n\t\t\ttextResponse = this.settings.request(absolute, \"text\");\n\t\t}\n\n\t\t// Get asset links relative to css file\n\t\tconst relUrls = this.urls.map( (assetHref) => {\n\t\t\tconst resolved = this.settings.resolver(assetHref);\n\t\t\tconst relative = new Path(absolute).relative(resolved);\n\n\t\t\treturn relative;\n\t\t});\n\n\t\tif (!textResponse) {\n\t\t\t// file not found, don't replace\n\t\t\treturn new Promise<void>(function(resolve){\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\n\t\treturn textResponse.then( (text: string) => {\n\t\t\t// Replacements in the css text\n\t\t\ttext = substitute(text, relUrls, this.replacementUrls);\n\n\t\t\t// Get the new url\n\t\t\tif (this.settings.replacements === \"base64\") {\n\t\t\t\tnewUrl = createBase64Url(text, \"text/css\");\n\t\t\t} else {\n\t\t\t\tnewUrl = createBlobUrl(text, \"text/css\");\n\t\t\t}\n\n\t\t\treturn newUrl;\n\t\t}, (_err: Error) => {\n\t\t\t// handle response errors\n\t\t\treturn new Promise<void>(function(resolve){\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t}\n\n\t/**\n\t * Resolve all resources URLs relative to an absolute URL\n\t * @param {string} absolute to be resolved to\n\t * @param {resolver} [resolver]\n\t * @return {string[]} array with relative Urls\n\t */\n\trelativeTo(absolute: string, resolver?: (href: string, absolute?: boolean) => string): string[] {\n\t\tresolver = resolver || this.settings.resolver;\n\n\t\t// Get Urls relative to current sections\n\t\treturn this.urls.\n\t\t\tmap(function(href: string) {\n\t\t\t\tconst resolved = resolver(href);\n\t\t\t\tconst relative = new Path(absolute).relative(resolved);\n\t\t\t\treturn relative;\n\t\t\t}.bind(this));\n\t}\n\n\t/**\n\t * Get a URL for a resource\n\t * @param {string} path\n\t * @return {string} url\n\t */\n\tget(path: string): Promise<string> | undefined {\n\t\tconst indexInUrls = this.urls.indexOf(path);\n\t\tif (indexInUrls === -1) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.replacementUrls.length) {\n\t\t\treturn new Promise(function(resolve: (value: string) => void, _reject: (reason?: any) => void) {\n\t\t\t\tresolve(this.replacementUrls[indexInUrls]);\n\t\t\t}.bind(this));\n\t\t} else {\n\t\t\treturn this.createUrl(path);\n\t\t}\n\t}\n\n\t/**\n\t * Substitute urls in content, with replacements,\n\t * relative to a url if provided\n\t * @param {string} content\n\t * @param {string} [url] url to resolve to\n\t * @return {string} content with urls substituted\n\t */\n\tsubstitute(content: string, url?: string): string {\n\t\tlet relUrls;\n\t\tif (url) {\n\t\t\trelUrls = this.relativeTo(url);\n\t\t} else {\n\t\t\trelUrls = this.urls;\n\t\t}\n\t\treturn substitute(content, relUrls, this.replacementUrls);\n\t}\n\n\tdestroy(): void {\n\t\t(this as any).settings = undefined;\n\t\t(this as any).manifest = undefined;\n\t\t(this as any).resources = undefined;\n\t\t(this as any).replacementUrls = undefined;\n\t\t(this as any).html = undefined;\n\t\t(this as any).assets = undefined;\n\t\t(this as any).css = undefined;\n\n\t\t(this as any).urls = undefined;\n\t\t(this as any).cssUrls = undefined;\n\t}\n}\n\nexport default Resources;\n","import EpubCFI from \"./epubcfi\";\nimport {\n\tqs,\n\tqsa,\n\tquerySelectorByType,\n\tindexOfSorted,\n\tlocationOf\n} from \"./utils/core\";\nimport type { PageListItem } from \"./types\";\n\n/**\n * Page List Parser\n * @param {document} [xml]\n */\nclass PageList {\n\tpages: number[];\n\tlocations: string[];\n\tepubcfi: EpubCFI;\n\tfirstPage: number;\n\tlastPage: number;\n\ttotalPages: number;\n\ttoc: Document | undefined;\n\tncx: Document | undefined;\n\tpageList: PageListItem[];\n\n\tconstructor(xml?: Document) {\n\t\tthis.pages = [];\n\t\tthis.locations = [];\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.firstPage = 0;\n\t\tthis.lastPage = 0;\n\t\tthis.totalPages = 0;\n\n\t\tthis.toc = undefined;\n\t\tthis.ncx = undefined;\n\n\t\tif (xml) {\n\t\t\tthis.pageList = this.parse(xml);\n\t\t}\n\n\t\tif(this.pageList && this.pageList.length) {\n\t\t\tthis.process(this.pageList);\n\t\t}\n\t}\n\n\t/**\n\t * Parse PageList Xml\n\t * @param {document} xml\n\t */\n\tparse(xml: Document): PageListItem[] {\n\t\tconst html = qs(xml, \"html\");\n\t\tconst ncx = qs(xml, \"ncx\");\n\n\t\tif(html) {\n\t\t\treturn this.parseNav(xml);\n\t\t} else if(ncx){\n\t\t\treturn this.parseNcx(xml);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Parse a Nav PageList\n\t * @private\n\t * @param {node} navHtml\n\t * @return {PageList.item[]} list\n\t */\n\tparseNav(navHtml: Document): PageListItem[] {\n\t\tconst navElement = querySelectorByType(navHtml, \"nav\", \"page-list\");\n\t\tconst navItems = navElement ? Array.from(qsa(navElement, \"li\")) : [];\n\t\tconst length = navItems.length;\n\t\tlet i;\n\t\tconst list: PageListItem[] = [];\n\t\tlet item;\n\n\t\tif(!navItems || length === 0) return list;\n\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\titem = this.item(navItems[i]);\n\t\t\tlist.push(item);\n\t\t}\n\n\t\treturn list;\n\t}\n\n\tparseNcx(navXml: Document): PageListItem[] {\n\t\tconst list: PageListItem[] = [];\n\t\tlet i = 0;\n\t\tlet item;\n\t\tlet length = 0;\n\n\t\tconst pageList = qs(navXml, \"pageList\");\n\t\tif (!pageList) return list;\n\n\t\tconst pageTargets = qsa(pageList, \"pageTarget\");\n\t\tlength = pageTargets.length;\n\n\t\tif (!pageTargets || pageTargets.length === 0) {\n\t\t\treturn list;\n\t\t}\n\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\titem = this.ncxItem(pageTargets[i]);\n\t\t\tlist.push(item);\n\t\t}\n\n\t\treturn list;\n\t}\n\n\tncxItem(item: Element): PageListItem {\n\t\tconst navLabel = qs(item, \"navLabel\");\n\t\tconst navLabelText = qs(navLabel!, \"text\");\n\t\tconst pageText = navLabelText!.textContent ?? \"\";\n\t\tconst content = qs(item, \"content\");\n\n\t\tconst href = content!.getAttribute(\"src\") ?? \"\";\n\t\tconst page = parseInt(pageText, 10);\n\n\t\treturn {\n\t\t\t\"href\": href,\n\t\t\t\"page\": page,\n\t\t};\n\t}\n\n\t/**\n\t * Page List Item\n\t * @private\n\t * @param {node} item\n\t * @return {object} pageListItem\n\t */\n\titem(item: Element): PageListItem {\n\t\tconst content = qs(item, \"a\")!,\n\t\t\t\thref = content.getAttribute(\"href\") || \"\",\n\t\t\t\ttext = content.textContent || \"\",\n\t\t\t\tpage = parseInt(text),\n\t\t\t\tisCfi = href.indexOf(\"epubcfi\");\n\t\tlet split,\n\t\t\t\tpackageUrl,\n\t\t\t\tcfi;\n\n\t\tif(isCfi != -1) {\n\t\t\tsplit = href.split(\"#\");\n\t\t\tpackageUrl = split[0];\n\t\t\tcfi = split.length > 1 ? split[1] : undefined;\n\t\t\treturn {\n\t\t\t\t\"cfi\" : cfi,\n\t\t\t\t\"href\" : href,\n\t\t\t\t\"packageUrl\" : packageUrl,\n\t\t\t\t\"page\" : page\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t\"href\" : href,\n\t\t\t\t\"page\" : page\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Process pageList items\n\t * @private\n\t * @param {array} pageList\n\t */\n\tprocess(pageList: PageListItem[]): void {\n\t\tpageList.forEach(function(item){\n\t\t\tthis.pages.push(item.page);\n\t\t\tif (item.cfi) {\n\t\t\t\tthis.locations.push(item.cfi);\n\t\t\t}\n\t\t}, this);\n\t\tthis.firstPage = this.pages[0];\n\t\tthis.lastPage = this.pages[this.pages.length-1];\n\t\tthis.totalPages = this.lastPage - this.firstPage;\n\t}\n\n\t/**\n\t * Get a PageList result from a EpubCFI\n\t * @param {string} cfi EpubCFI String\n\t * @return {number} page\n\t */\n\tpageFromCfi(cfi: string): number {\n\t\tlet pg = -1;\n\n\t\t// Check if the pageList has not been set yet\n\t\tif(this.locations.length === 0) {\n\t\t\treturn -1;\n\t\t}\n\n\t\t// TODO: check if CFI is valid?\n\n\t\t// check if the cfi is in the location list\n\t\t// var index = this.locations.indexOf(cfi);\n\t\tlet index = indexOfSorted(cfi, this.locations, this.epubcfi.compare);\n\t\tif(index != -1) {\n\t\t\tpg = this.pages[index];\n\t\t} else {\n\t\t\t// Otherwise add it to the list of locations\n\t\t\t// Insert it in the correct position in the locations page\n\t\t\t//index = EPUBJS.core.insert(cfi, this.locations, this.epubcfi.compare);\n\t\t\tindex = locationOf(cfi, this.locations, this.epubcfi.compare);\n\t\t\t// Get the page at the location just before the new one, or return the first\n\t\t\tpg = index-1 >= 0 ? this.pages[index-1] : this.pages[0];\n\t\t\tif(pg !== undefined) {\n\t\t\t\t// Add the new page in so that the locations and page array match up\n\t\t\t\t//this.pages.splice(index, 0, pg);\n\t\t\t} else {\n\t\t\t\tpg = -1;\n\t\t\t}\n\n\t\t}\n\t\treturn pg;\n\t}\n\n\t/**\n\t * Get an EpubCFI from a Page List Item\n\t * @param {string | number} pg\n\t * @return {string} cfi\n\t */\n\tcfiFromPage(pg: string | number): string | number {\n\t\tlet cfi: string | number = -1;\n\t\t// check that pg is an int\n\t\tif(typeof pg != \"number\"){\n\t\t\tpg = parseInt(pg);\n\t\t}\n\n\t\t// check if the cfi is in the page list\n\t\t// Pages could be unsorted.\n\t\tconst index = this.pages.indexOf(pg);\n\t\tif(index != -1) {\n\t\t\tcfi = this.locations[index];\n\t\t}\n\t\t// TODO: handle pages not in the list\n\t\treturn cfi;\n\t}\n\n\t/**\n\t * Get a Page from Book percentage\n\t * @param {number} percent\n\t * @return {number} page\n\t */\n\tpageFromPercentage(percent: number): number {\n\t\tconst pg = Math.round(this.totalPages * percent);\n\t\treturn pg;\n\t}\n\n\t/**\n\t * Returns a value between 0 - 1 corresponding to the location of a page\n\t * @param {number} pg the page\n\t * @return {number} percentage\n\t */\n\tpercentageFromPage(pg: number): number {\n\t\tconst percentage = (pg - this.firstPage) / this.totalPages;\n\t\treturn Math.round(percentage * 1000) / 1000;\n\t}\n\n\t/**\n\t * Returns a value between 0 - 1 corresponding to the location of a cfi\n\t * @param {string} cfi EpubCFI String\n\t * @return {number} percentage\n\t */\n\tpercentageFromCfi(cfi: string): number {\n\t\tconst pg = this.pageFromCfi(cfi);\n\t\tconst percentage = this.percentageFromPage(pg);\n\t\treturn percentage;\n\t}\n\n\t/**\n\t * Destroy\n\t */\n\tdestroy(): void {\n\t\t(this as any).pages = undefined;\n\t\t(this as any).locations = undefined;\n\t\t(this as any).epubcfi = undefined;\n\n\t\t(this as any).pageList = undefined;\n\n\t\tthis.toc = undefined;\n\t\tthis.ncx = undefined;\n\t}\n}\n\nexport default PageList;\n","import { extend } from \"./utils/core\";\nimport { EVENTS } from \"./utils/constants\";\nimport EventEmitter from \"./utils/event-emitter\";\nimport type { LayoutSettings, LayoutProps, IEventEmitter } from \"./types\";\nimport type Contents from \"./contents\";\nimport type Section from \"./section\";\n\n/**\n * Figures out the CSS values to apply for a layout\n * @class\n * @param {object} settings\n * @param {string} [settings.layout='reflowable']\n * @param {string} [settings.spread]\n * @param {number} [settings.minSpreadWidth=800]\n * @param {boolean} [settings.evenSpreads=false]\n */\nclass Layout implements IEventEmitter {\n\tdeclare on: (type: string, fn: (...args: any[]) => void) => this;\n\tdeclare off: (type: string, fn?: (...args: any[]) => void) => this;\n\tdeclare emit: (type: string, ...args: any[]) => void;\n\n\tsettings: LayoutSettings;\n\tname: string;\n\t_spread: boolean;\n\t_minSpreadWidth: number;\n\t_evenSpreads: boolean;\n\t_flow: string;\n\twidth: number;\n\theight: number;\n\tspreadWidth: number;\n\tdelta: number;\n\tcolumnWidth: number;\n\tgap: number;\n\tdivisor: number;\n\tpageWidth: number;\n\tprops: LayoutProps;\n\n\tconstructor(settings: LayoutSettings) {\n\t\tthis.settings = settings;\n\t\tthis.name = settings.layout || \"reflowable\";\n\t\tthis._spread = (settings.spread === \"none\") ? false : true;\n\t\tthis._minSpreadWidth = settings.minSpreadWidth || 800;\n\t\tthis._evenSpreads = settings.evenSpreads || false;\n\n\t\tif (settings.flow === \"scrolled\" ||\n\t\t\t\tsettings.flow === \"scrolled-continuous\" ||\n\t\t\t\tsettings.flow === \"scrolled-doc\") {\n\t\t\tthis._flow = \"scrolled\";\n\t\t} else {\n\t\t\tthis._flow = \"paginated\";\n\t\t}\n\n\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\t\tthis.spreadWidth = 0;\n\t\tthis.delta = 0;\n\n\t\tthis.columnWidth = 0;\n\t\tthis.gap = 0;\n\t\tthis.divisor = 1;\n\n\t\tthis.props = {\n\t\t\tname: this.name,\n\t\t\tspread: this._spread,\n\t\t\tflow: this._flow,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tspreadWidth: 0,\n\t\t\tdelta: 0,\n\t\t\tcolumnWidth: 0,\n\t\t\tgap: 0,\n\t\t\tdivisor: 1\n\t\t};\n\n\t}\n\n\t/**\n\t * Switch the flow between paginated and scrolled\n\t * @param {string} flow paginated | scrolled\n\t * @return {string} simplified flow\n\t */\n\tflow(flow?: string): string {\n\t\tif (typeof(flow) != \"undefined\") {\n\t\t\tif (flow === \"scrolled\" ||\n\t\t\t\t\tflow === \"scrolled-continuous\" ||\n\t\t\t\t\tflow === \"scrolled-doc\") {\n\t\t\t\tthis._flow = \"scrolled\";\n\t\t\t} else {\n\t\t\t\tthis._flow = \"paginated\";\n\t\t\t}\n\t\t\t// this.props.flow = this._flow;\n\t\t\tthis.update({flow: this._flow});\n\t\t}\n\t\treturn this._flow;\n\t}\n\n\t/**\n\t * Switch between using spreads or not, and set the\n\t * width at which they switch to single.\n\t * @param {string} spread \"none\" | \"always\" | \"auto\"\n\t * @param {number} min integer in pixels\n\t * @return {boolean} spread true | false\n\t */\n\tspread(spread?: string, min?: number): boolean {\n\n\t\tif (spread) {\n\t\t\tthis._spread = (spread === \"none\") ? false : true;\n\t\t\t// this.props.spread = this._spread;\n\t\t\tthis.update({spread: this._spread});\n\t\t}\n\n\t\tif (min !== undefined && min >= 0) {\n\t\t\tthis._minSpreadWidth = min;\n\t\t}\n\n\t\treturn this._spread;\n\t}\n\n\t/**\n\t * Calculate the dimensions of the pagination\n\t * @param {number} _width width of the rendering\n\t * @param {number} _height height of the rendering\n\t * @param {number} _gap width of the gap between columns\n\t */\n\tcalculate(_width: number, _height: number, _gap?: number): void {\n\n\t\tlet divisor = 1;\n\t\tlet gap = _gap || 0;\n\n\t\t//-- Check the width and create even width columns\n\t\t// var fullWidth = Math.floor(_width);\n\t\tlet width = _width;\n\t\tconst height = _height;\n\n\t\tconst section = Math.floor(width / 12);\n\n\t\tlet columnWidth;\n\t\tlet pageWidth;\n\n\t\tif (this._spread && width >= this._minSpreadWidth) {\n\t\t\tdivisor = 2;\n\t\t} else {\n\t\t\tdivisor = 1;\n\t\t}\n\n\t\tif (this.name === \"reflowable\" && this._flow === \"paginated\" && !(_gap !== undefined && _gap >= 0)) {\n\t\t\tgap = ((section % 2 === 0) ? section : section - 1);\n\t\t}\n\n\t\tif (this.name === \"pre-paginated\" ) {\n\t\t\tgap = 0;\n\t\t}\n\n\t\t//-- Double Page\n\t\tif(divisor > 1) {\n\t\t\t// width = width - gap;\n\t\t\t// columnWidth = (width - gap) / divisor;\n\t\t\t// gap = gap / divisor;\n\t\t\tcolumnWidth = (width / divisor) - gap;\n\t\t\tpageWidth = columnWidth + gap;\n\t\t} else {\n\t\t\tcolumnWidth = width;\n\t\t\tpageWidth = width;\n\t\t}\n\n\t\tif (this.name === \"pre-paginated\" && divisor > 1) {\n\t\t\twidth = columnWidth;\n\t\t}\n\n\t\tconst spreadWidth = (columnWidth * divisor) + gap;\n\n\t\tconst delta = width;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.spreadWidth = spreadWidth;\n\t\tthis.pageWidth = pageWidth;\n\t\tthis.delta = delta;\n\n\t\tthis.columnWidth = columnWidth;\n\t\tthis.gap = gap;\n\t\tthis.divisor = divisor;\n\n\t\t// this.props.width = width;\n\t\t// this.props.height = _height;\n\t\t// this.props.spreadWidth = spreadWidth;\n\t\t// this.props.pageWidth = pageWidth;\n\t\t// this.props.delta = delta;\n\t\t//\n\t\t// this.props.columnWidth = colWidth;\n\t\t// this.props.gap = gap;\n\t\t// this.props.divisor = divisor;\n\n\t\tthis.update({\n\t\t\twidth,\n\t\t\theight,\n\t\t\tspreadWidth,\n\t\t\tpageWidth,\n\t\t\tdelta,\n\t\t\tcolumnWidth,\n\t\t\tgap,\n\t\t\tdivisor\n\t\t});\n\n\t}\n\n\t/**\n\t * Apply Css to a Document\n\t * @param {Contents} contents\n\t * @return {Promise}\n\t */\n\tformat(contents: Contents, section?: Section, axis?: string): void {\n\t\tlet formating;\n\n\t\tif (this.name === \"pre-paginated\") {\n\t\t\tformating = contents.fit(this.columnWidth, this.height, section);\n\t\t} else if (this._flow === \"paginated\") {\n\t\t\tformating = contents.columns(this.width, this.height, this.columnWidth, this.gap, this.settings.direction);\n\t\t} else if (axis && axis === \"horizontal\") {\n\t\t\tformating = contents.size(undefined, this.height);\n\t\t} else {\n\t\t\tformating = contents.size(this.width, undefined);\n\t\t}\n\n\t\treturn formating; // might be a promise in some View Managers\n\t}\n\n\t/**\n\t * Count number of pages\n\t * @param {number} totalLength\n\t * @param {number} pageLength\n\t * @return {{spreads: Number, pages: Number}}\n\t */\n\tcount(totalLength: number, pageLength?: number): { spreads: number; pages: number } {\n\n\t\tlet spreads, pages;\n\n\t\tif (this.name === \"pre-paginated\") {\n\t\t\tspreads = 1;\n\t\t\tpages = 1;\n\t\t} else if (this._flow === \"paginated\") {\n\t\t\tpageLength = pageLength || this.delta;\n\t\t\tspreads = Math.ceil( totalLength / pageLength);\n\t\t\tpages = spreads * this.divisor;\n\t\t} else { // scrolled\n\t\t\tpageLength = pageLength || this.height;\n\t\t\tspreads = Math.ceil( totalLength / pageLength);\n\t\t\tpages = spreads;\n\t\t}\n\n\t\treturn {\n\t\t\tspreads,\n\t\t\tpages\n\t\t};\n\n\t}\n\n\t/**\n\t * Update props that have changed\n\t * @private\n\t * @param {object} props\n\t */\n\tupdate(props: Partial<LayoutProps>): void {\n\t\t// Remove props that haven't changed\n\t\tconst propsRecord = props as unknown as Record<string, unknown>;\n\t\tconst thisRecord = this.props as unknown as Record<string, unknown>;\n\t\tObject.keys(propsRecord).forEach((propName) => {\n\t\t\tif (thisRecord[propName] === propsRecord[propName]) {\n\t\t\t\tdelete propsRecord[propName];\n\t\t\t}\n\t\t});\n\n\t\tif(Object.keys(propsRecord).length > 0) {\n\t\t\tconst newProps = extend(this.props, props);\n\t\t\tthis.emit(EVENTS.LAYOUT.UPDATED, newProps, props);\n\t\t}\n\t}\n}\n\nEventEmitter(Layout.prototype);\n\nexport default Layout;\n","import Url from \"./utils/url\";\nimport type Rendition from \"./rendition\";\nimport type Contents from \"./contents\";\nimport type { ThemeEntry } from \"./types\";\n\n/**\n * Themes to apply to displayed content\n * @class\n * @param {Rendition} rendition\n */\nclass Themes {\n\trendition: Rendition;\n\t_themes: Record<string, ThemeEntry>;\n\t_overrides: Record<string, { value: string; priority: boolean }>;\n\t_current: string;\n\t_injected: string[];\n\n\tconstructor(rendition: Rendition) {\n\t\tthis.rendition = rendition;\n\t\tthis._themes = {\n\t\t\t\"default\" : {\n\t\t\t\t\"rules\" : {},\n\t\t\t\t\"url\" : \"\",\n\t\t\t\t\"serialized\" : \"\"\n\t\t\t}\n\t\t};\n\t\tthis._overrides = {};\n\t\tthis._current = \"default\";\n\t\tthis._injected = [];\n\t\tthis.rendition.hooks.content.register(this.inject.bind(this));\n\t\tthis.rendition.hooks.content.register(this.overrides.bind(this));\n\n\t}\n\n\t/**\n\t * Add themes to be used by a rendition\n\t * @param {object | Array<object> | string}\n\t * @example themes.register(\"light\", \"http://example.com/light.css\")\n\t * @example themes.register(\"light\", { \"body\": { \"color\": \"purple\"}})\n\t * @example themes.register({ \"light\" : {...}, \"dark\" : {...}})\n\t */\n\tregister (..._args: any[]): void {\n\t\tif (arguments.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (arguments.length === 1 && typeof(arguments[0]) === \"object\") {\n\t\t\treturn this.registerThemes(arguments[0]);\n\t\t}\n\t\tif (arguments.length === 1 && typeof(arguments[0]) === \"string\") {\n\t\t\treturn this.default(arguments[0]);\n\t\t}\n\t\tif (arguments.length === 2 && typeof(arguments[1]) === \"string\") {\n\t\t\treturn this.registerUrl(arguments[0], arguments[1]);\n\t\t}\n\t\tif (arguments.length === 2 && typeof(arguments[1]) === \"object\") {\n\t\t\treturn this.registerRules(arguments[0], arguments[1]);\n\t\t}\n\t}\n\n\t/**\n\t * Add a default theme to be used by a rendition\n\t * @param {object | string} theme\n\t * @example themes.register(\"http://example.com/default.css\")\n\t * @example themes.register({ \"body\": { \"color\": \"purple\"}})\n\t */\n\tdefault (theme: string | Record<string, Record<string, string>>): void {\n\t\tif (!theme) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof(theme) === \"string\") {\n\t\t\treturn this.registerUrl(\"default\", theme);\n\t\t}\n\t\tif (typeof(theme) === \"object\") {\n\t\t\treturn this.registerRules(\"default\", theme);\n\t\t}\n\t}\n\n\t/**\n\t * Register themes object\n\t * @param {object} themes\n\t */\n\tregisterThemes (themes: Record<string, string | Record<string, Record<string, string>>>): void {\n\t\tfor (const theme in themes) {\n\t\t\tif (themes.hasOwnProperty(theme)) {\n\t\t\t\tconst value = themes[theme];\n\t\t\t\tif (typeof(value) === \"string\") {\n\t\t\t\t\tthis.registerUrl(theme, value);\n\t\t\t\t} else {\n\t\t\t\t\tthis.registerRules(theme, value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Register a theme by passing its css as string\n\t * @param {string} name \n\t * @param {string} css \n\t */\n\tregisterCss (name: string, css: string): void {\n\t\tthis._themes[name] = { \"serialized\" : css };\n\t\tif ((this._injected as unknown as Record<string, boolean>)[name] || name == \"default\") {\n\t\t\tthis.update(name);\n\t\t}\n\t}\n\n\t/**\n\t * Register a url\n\t * @param {string} name\n\t * @param {string} input\n\t */\n\tregisterUrl (name: string, input: string): void {\n\t\tconst url = new Url(input);\n\t\tthis._themes[name] = { \"url\": url.toString() };\n\t\tif ((this._injected as unknown as Record<string, boolean>)[name] || name == \"default\") {\n\t\t\tthis.update(name);\n\t\t}\n\t}\n\n\t/**\n\t * Register rule\n\t * @param {string} name\n\t * @param {object} rules\n\t */\n\tregisterRules (name: string, rules: Record<string, Record<string, string>>): void {\n\t\tthis._themes[name] = { \"rules\": rules };\n\t\t// TODO: serialize css rules\n\t\tif ((this._injected as unknown as Record<string, boolean>)[name] || name == \"default\") {\n\t\t\tthis.update(name);\n\t\t}\n\t}\n\n\t/**\n\t * Select a theme\n\t * @param {string} name\n\t */\n\tselect (name: string): void {\n\t\tconst prev = this._current;\n\n\t\tthis._current = name;\n\t\tthis.update(name);\n\n\t\tconst contents = this.rendition.getContents();\n\t\tcontents.forEach( (content: Contents) => {\n\t\t\tcontent.removeClass(prev);\n\t\t\tcontent.addClass(name);\n\t\t});\n\t}\n\n\t/**\n\t * Update a theme\n\t * @param {string} name\n\t */\n\tupdate (name: string): void {\n\t\tconst contents = this.rendition.getContents();\n\t\tcontents.forEach( (content: Contents) => {\n\t\t\tthis.add(name, content);\n\t\t});\n\t}\n\n\t/**\n\t * Inject all themes into contents\n\t * @param {Contents} contents\n\t */\n\tinject (contents: Contents): void {\n\t\tconst links: string[] = [];\n\t\tconst themes = this._themes;\n\t\tlet theme;\n\n\t\tfor (const name in themes) {\n\t\t\tif (themes.hasOwnProperty(name) && (name === this._current || name === \"default\")) {\n\t\t\t\ttheme = themes[name];\n\t\t\t\tif((theme.rules && Object.keys(theme.rules).length > 0) || (theme.url && links.indexOf(theme.url) === -1)) {\n\t\t\t\t\tthis.add(name, contents);\n\t\t\t\t}\n\t\t\t\tthis._injected.push(name);\n\t\t\t}\n\t\t}\n\n\t\tif(this._current != \"default\") {\n\t\t\tcontents.addClass(this._current);\n\t\t}\n\t}\n\n\t/**\n\t * Add Theme to contents\n\t * @param {string} name\n\t * @param {Contents} contents\n\t */\n\tadd (name: string, contents: Contents): void {\n\t\tconst theme = this._themes[name];\n\n\t\tif (!theme || !contents) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (theme.url) {\n\t\t\tcontents.addStylesheet(theme.url);\n\t\t} else if (theme.serialized) {\n\t\t\tcontents.addStylesheetCss(theme.serialized, name);\n\t\t\ttheme.injected = true;\n\t\t} else if (theme.rules) {\n\t\t\tcontents.addStylesheetRules(theme.rules, name);\n\t\t\ttheme.injected = true;\n\t\t}\n\t}\n\n\t/**\n\t * Add override\n\t * @param {string} name\n\t * @param {string} value\n\t * @param {boolean} priority\n\t */\n\toverride (name: string, value: string, priority?: boolean): void {\n\t\tconst contents = this.rendition.getContents();\n\n\t\tthis._overrides[name] = {\n\t\t\tvalue: value,\n\t\t\tpriority: priority === true\n\t\t};\n\n\t\tcontents.forEach( (content: Contents) => {\n\t\t\tcontent.css(name, this._overrides[name].value, this._overrides[name].priority);\n\t\t});\n\t}\n\n\tremoveOverride (name: string): void {\n\t\tconst contents = this.rendition.getContents();\n\n\t\tdelete this._overrides[name];\n\n\t\tcontents.forEach( (content: Contents) => {\n\t\t\tcontent.css(name);\n\t\t});\n\t}\n\n\t/**\n\t * Add all overrides\n\t * @param {Content} content\n\t */\n\toverrides (contents: Contents): void {\n\t\tconst overrides = this._overrides;\n\n\t\tfor (const rule in overrides) {\n\t\t\tif (overrides.hasOwnProperty(rule)) {\n\t\t\t\tcontents.css(rule, overrides[rule].value, overrides[rule].priority);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Adjust the font size of a rendition\n\t * @param {number} size\n\t */\n\tfontSize (size: string): void {\n\t\tthis.override(\"font-size\", size);\n\t}\n\n\t/**\n\t * Adjust the font-family of a rendition\n\t * @param {string} f\n\t */\n\tfont (f: string): void {\n\t\tthis.override(\"font-family\", f, true);\n\t}\n\n\tdestroy(): void {\n\t\t(this as any).rendition = undefined;\n\t\t(this as any)._themes = undefined;\n\t\t(this as any)._overrides = undefined;\n\t\t(this as any)._current = undefined;\n\t\t(this as any)._injected = undefined;\n\t}\n\n}\n\nexport default Themes;\n","import EventEmitter from \"./utils/event-emitter\";\nimport EpubCFI from \"./epubcfi\";\nimport { EVENTS } from \"./utils/constants\";\nimport type { IEventEmitter } from \"./types\";\nimport type Rendition from \"./rendition\";\n\ninterface AnnotationView {\n\tindex: number;\n\thighlight: Function;\n\tunderline: Function;\n\tmark: Function;\n\tunhighlight: Function;\n\tununderline: Function;\n\tunmark: Function;\n}\n\n/**\n\t* Handles managing adding & removing Annotations\n\t* @param {Rendition} rendition\n\t* @class\n\t*/\nclass Annotations {\n\trendition: Rendition;\n\thighlights: Annotation[];\n\tunderlines: Annotation[];\n\tmarks: Annotation[];\n\t_annotations: Record<string, Annotation>;\n\t_annotationsBySectionIndex: Record<number, string[]>;\n\n\tconstructor (rendition: Rendition) {\n\t\tthis.rendition = rendition;\n\t\tthis.highlights = [];\n\t\tthis.underlines = [];\n\t\tthis.marks = [];\n\t\tthis._annotations = {};\n\t\tthis._annotationsBySectionIndex = {};\n\n\t\tthis.rendition.hooks.render.register(this.inject.bind(this));\n\t\tthis.rendition.hooks.unloaded.register(this.clear.bind(this));\n\t}\n\n\t/**\n\t * Add an annotation to store\n\t * @param {string} type Type of annotation to add: \"highlight\", \"underline\", \"mark\"\n\t * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to\n\t * @param {object} data Data to assign to annotation\n\t * @param {function} [cb] Callback after annotation is added\n\t * @param {string} className CSS class to assign to annotation\n\t * @param {object} styles CSS styles to assign to annotation\n\t * @returns {Annotation} annotation\n\t */\n\tadd (type: string, cfiRange: string, data?: Record<string, any>, cb?: Function, className?: string, styles?: Record<string, string>): Annotation {\n\t\tconst hash = encodeURI(cfiRange + type);\n\t\tconst cfi = new EpubCFI(cfiRange);\n\t\tconst sectionIndex = cfi.spinePos;\n\t\tconst annotation = new Annotation({\n\t\t\ttype,\n\t\t\tcfiRange,\n\t\t\tdata,\n\t\t\tsectionIndex,\n\t\t\tcb,\n\t\t\tclassName,\n\t\t\tstyles\n\t\t});\n\n\t\tthis._annotations[hash] = annotation;\n\n\t\tif (sectionIndex in this._annotationsBySectionIndex) {\n\t\t\tthis._annotationsBySectionIndex[sectionIndex].push(hash);\n\t\t} else {\n\t\t\tthis._annotationsBySectionIndex[sectionIndex] = [hash];\n\t\t}\n\n\t\tconst views = this.rendition.views();\n\n\t\tviews.forEach( (view: AnnotationView) => {\n\t\t\tif (annotation.sectionIndex === view.index) {\n\t\t\t\tannotation.attach(view);\n\t\t\t}\n\t\t});\n\n\t\treturn annotation;\n\t}\n\n\t/**\n\t * Remove an annotation from store\n\t * @param {EpubCFI} cfiRange EpubCFI range the annotation is attached to\n\t * @param {string} type Type of annotation to add: \"highlight\", \"underline\", \"mark\"\n\t */\n\tremove (cfiRange: string, type?: string): void {\n\t\tconst hash = encodeURI(cfiRange + type);\n\n\t\tif (hash in this._annotations) {\n\t\t\tconst annotation = this._annotations[hash];\n\n\t\t\tif (type && annotation.type !== type) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst views = this.rendition.views();\n\t\t\tviews.forEach( (view: AnnotationView) => {\n\t\t\t\tthis._removeFromAnnotationBySectionIndex(annotation.sectionIndex, hash);\n\t\t\t\tif (annotation.sectionIndex === view.index) {\n\t\t\t\t\tannotation.detach(view);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdelete this._annotations[hash];\n\t\t}\n\t}\n\n\t/**\n\t * Remove an annotations by Section Index\n\t * @private\n\t */\n\t_removeFromAnnotationBySectionIndex (sectionIndex: number, hash: string): void {\n\t\tthis._annotationsBySectionIndex[sectionIndex] = this._annotationsAt(sectionIndex).filter(h => h !== hash);\n\t}\n\n\t/**\n\t * Get annotations by Section Index\n\t * @private\n\t */\n\t_annotationsAt (index: number): string[] {\n\t\treturn this._annotationsBySectionIndex[index];\n\t}\n\n\n\t/**\n\t * Add a highlight to the store\n\t * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to\n\t * @param {object} data Data to assign to annotation\n\t * @param {function} cb Callback after annotation is clicked\n\t * @param {string} className CSS class to assign to annotation\n\t * @param {object} styles CSS styles to assign to annotation\n\t */\n\thighlight (cfiRange: string, data?: Record<string, any>, cb?: Function, className?: string, styles?: Record<string, string>): Annotation {\n\t\treturn this.add(\"highlight\", cfiRange, data, cb, className, styles);\n\t}\n\n\t/**\n\t * Add a underline to the store\n\t * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to\n\t * @param {object} data Data to assign to annotation\n\t * @param {function} cb Callback after annotation is clicked\n\t * @param {string} className CSS class to assign to annotation\n\t * @param {object} styles CSS styles to assign to annotation\n\t */\n\tunderline (cfiRange: string, data?: Record<string, any>, cb?: Function, className?: string, styles?: Record<string, string>): Annotation {\n\t\treturn this.add(\"underline\", cfiRange, data, cb, className, styles);\n\t}\n\n\t/**\n\t * Add a mark to the store\n\t * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to\n\t * @param {object} data Data to assign to annotation\n\t * @param {function} cb Callback after annotation is clicked\n\t */\n\tmark (cfiRange: string, data?: Record<string, any>, cb?: Function): Annotation {\n\t\treturn this.add(\"mark\", cfiRange, data, cb);\n\t}\n\n\t/**\n\t * iterate over annotations in the store\n\t */\n\teach (..._args: any[]): any {\n\t\treturn (this._annotations as any).forEach.apply(this._annotations, arguments);\n\t}\n\n\t/**\n\t * Hook for injecting annotation into a view\n\t * @param {View} view\n\t * @private\n\t */\n\tinject (view: AnnotationView): void {\n\t\tconst sectionIndex = view.index;\n\t\tif (sectionIndex in this._annotationsBySectionIndex) {\n\t\t\tconst annotations = this._annotationsBySectionIndex[sectionIndex];\n\t\t\tannotations.forEach((hash) => {\n\t\t\t\tconst annotation = this._annotations[hash];\n\t\t\t\tannotation.attach(view);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Hook for removing annotation from a view\n\t * @param {View} view\n\t * @private\n\t */\n\tclear (view: AnnotationView): void {\n\t\tconst sectionIndex = view.index;\n\t\tif (sectionIndex in this._annotationsBySectionIndex) {\n\t\t\tconst annotations = this._annotationsBySectionIndex[sectionIndex];\n\t\t\tannotations.forEach((hash) => {\n\t\t\t\tconst annotation = this._annotations[hash];\n\t\t\t\tannotation.detach(view);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * [Not Implemented] Show annotations\n\t * @TODO: needs implementation in View\n\t */\n\tshow (): void {\n\n\t}\n\n\t/**\n\t * [Not Implemented] Hide annotations\n\t * @TODO: needs implementation in View\n\t */\n\thide (): void {\n\n\t}\n\n}\n\n/**\n * Annotation object\n * @class\n * @param {object} options\n * @param {string} options.type Type of annotation to add: \"highlight\", \"underline\", \"mark\"\n * @param {EpubCFI} options.cfiRange EpubCFI range to attach annotation to\n * @param {object} options.data Data to assign to annotation\n * @param {int} options.sectionIndex Index in the Spine of the Section annotation belongs to\n * @param {function} [options.cb] Callback after annotation is clicked\n * @param {string} className CSS class to assign to annotation\n * @param {object} styles CSS styles to assign to annotation\n * @returns {Annotation} annotation\n */\nclass Annotation implements IEventEmitter {\n\ttype: string;\n\tcfiRange: string;\n\tdata: Record<string, any>;\n\tsectionIndex: number;\n\tmark: object | undefined;\n\tcb: Function;\n\tclassName: string;\n\tstyles: Record<string, string>;\n\n\tdeclare on: IEventEmitter[\"on\"];\n\tdeclare off: IEventEmitter[\"off\"];\n\tdeclare emit: IEventEmitter[\"emit\"];\n\n\tconstructor ({\n\t\ttype,\n\t\tcfiRange,\n\t\tdata,\n\t\tsectionIndex,\n\t\tcb,\n\t\tclassName,\n\t\tstyles\n\t}: { type: string; cfiRange: string; data?: Record<string, any>; sectionIndex?: number; cb?: Function; className?: string; styles?: Record<string, string> }) {\n\t\tthis.type = type;\n\t\tthis.cfiRange = cfiRange;\n\t\tthis.data = data ?? {};\n\t\tthis.sectionIndex = sectionIndex ?? 0;\n\t\tthis.mark = undefined;\n\t\tthis.cb = cb!;\n\t\tthis.className = className ?? \"\";\n\t\tthis.styles = styles ?? {};\n\t}\n\n\t/**\n\t * Update stored data\n\t * @param {object} data\n\t */\n\tupdate (data: Record<string, any>): void {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Add to a view\n\t * @param {View} view\n\t */\n\tattach (view: AnnotationView): object | undefined {\n\t\tconst {cfiRange, data, type, mark: _mark, cb, className, styles} = this;\n\t\tlet result;\n\n\t\tif (type === \"highlight\") {\n\t\t\tresult = view.highlight(cfiRange, data, cb, className, styles);\n\t\t} else if (type === \"underline\") {\n\t\t\tresult = view.underline(cfiRange, data, cb, className, styles);\n\t\t} else if (type === \"mark\") {\n\t\t\tresult = view.mark(cfiRange, data, cb);\n\t\t}\n\n\t\tthis.mark = result;\n\t\tthis.emit(EVENTS.ANNOTATION.ATTACH, result);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Remove from a view\n\t * @param {View} view\n\t */\n\tdetach (view: AnnotationView): object | undefined {\n\t\tconst {cfiRange, type} = this;\n\t\tlet result;\n\n\t\tif (view) {\n\t\t\tif (type === \"highlight\") {\n\t\t\t\tresult = view.unhighlight(cfiRange);\n\t\t\t} else if (type === \"underline\") {\n\t\t\t\tresult = view.ununderline(cfiRange);\n\t\t\t} else if (type === \"mark\") {\n\t\t\t\tresult = view.unmark(cfiRange);\n\t\t\t}\n\t\t}\n\n\t\tthis.mark = undefined;\n\t\tthis.emit(EVENTS.ANNOTATION.DETACH, result);\n\t\treturn result;\n\t}\n\n\t/**\n\t * [Not Implemented] Get text of an annotation\n\t * @TODO: needs implementation in contents\n\t */\n\ttext (): void {\n\n\t}\n\n}\n\nEventEmitter(Annotation.prototype);\n\n\nexport default Annotations\n","import EpubCFI from \"./epubcfi\";\nimport { nodeBounds } from \"./utils/core\";\nimport type { EpubCFIPair, RangePair, LayoutProps } from \"./types\";\n\n/**\n * Map text locations to CFI ranges\n * @class\n * @param {Layout} layout Layout to apply\n * @param {string} [direction=\"ltr\"] Text direction\n * @param {string} [axis=\"horizontal\"] vertical or horizontal axis\n * @param {boolean} [dev] toggle developer highlighting\n */\nclass Mapping {\n\tlayout: LayoutProps;\n\thorizontal: boolean;\n\tdirection: string;\n\t_dev: boolean;\n\n\tconstructor(layout: LayoutProps, direction?: string, axis?: string, dev: boolean = false) {\n\t\tthis.layout = layout;\n\t\tthis.horizontal = (axis === \"horizontal\") ? true : false;\n\t\tthis.direction = direction || \"ltr\";\n\t\tthis._dev = dev;\n\t}\n\n\t/**\n\t * Find CFI pairs for entire section at once\n\t */\n\tsection(view: any): EpubCFIPair[] {\n\t\tconst ranges = this.findRanges(view);\n\t\tconst map = this.rangeListToCfiList(view.section.cfiBase, ranges);\n\n\t\treturn map;\n\t}\n\n\t/**\n\t * Find CFI pairs for a page\n\t * @param {Contents} contents Contents from view\n\t * @param {string} cfiBase string of the base for a cfi\n\t * @param {number} start position to start at\n\t * @param {number} end position to end at\n\t */\n\tpage(contents: any, cfiBase: string, start: number, end: number): EpubCFIPair | undefined {\n\t\tconst root = contents && contents.document ? contents.document.body : false;\n\n\t\tif (!root) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = this.rangePairToCfiPair(cfiBase, {\n\t\t\tstart: this.findStart(root, start, end),\n\t\t\tend: this.findEnd(root, start, end)\n\t\t});\n\n\t\tif (this._dev === true) {\n\t\t\tconst doc = contents.document;\n\t\t\tconst startRange = new EpubCFI(result.start).toRange(doc)!;\n\t\t\tconst endRange = new EpubCFI(result.end).toRange(doc)!;\n\n\t\t\tconst selection = doc.defaultView!.getSelection();\n\t\t\tconst r = doc.createRange();\n\t\t\tselection!.removeAllRanges();\n\t\t\tr.setStart(startRange.startContainer, startRange.startOffset);\n\t\t\tr.setEnd(endRange.endContainer, endRange.endOffset);\n\t\t\tselection.addRange(r);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Walk a node, preforming a function on each node it finds\n\t * @private\n\t * @param {Node} root Node to walkToNode\n\t * @param {function} func walk function\n\t * @return {*} returns the result of the walk function\n\t */\n\twalk(root: Node, func: (node: Node) => Node | undefined): Node | undefined {\n\t\t// IE11 has strange issue, if root is text node IE throws exception on\n\t\t// calling treeWalker.nextNode(), saying\n\t\t// Unexpected call to method or property access instead of returning null value\n\t\tif(root && root.nodeType === Node.TEXT_NODE) {\n\t\t\treturn;\n\t\t}\n\t\t// safeFilter is required so that it can work in IE as filter is a function for IE\n\t\t// and for other browser filter is an object.\n\t\tconst filter = {\n\t\t\tacceptNode: function(node: Node) {\n\t\t\t\tif ((node as Text).data.trim().length > 0) {\n\t\t\t\t\treturn NodeFilter.FILTER_ACCEPT;\n\t\t\t\t} else {\n\t\t\t\t\treturn NodeFilter.FILTER_REJECT;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst safeFilter = filter.acceptNode;\n\t\t(safeFilter as any).acceptNode = filter.acceptNode;\n\n\t\tconst treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, safeFilter);\n\t\tlet node;\n\t\tlet result;\n\t\twhile ((node = treeWalker.nextNode())) {\n\t\t\tresult = func(node);\n\t\t\tif(result) break;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tfindRanges(view: any): any[] {\n\t\tconst columns = [];\n\t\tconst scrollWidth = view.contents.scrollWidth();\n\t\tconst spreads = Math.ceil( scrollWidth / this.layout.spreadWidth);\n\t\tconst count = spreads * this.layout.divisor;\n\t\tconst columnWidth = this.layout.columnWidth;\n\t\tconst gap = this.layout.gap;\n\t\tlet start, end;\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tstart = (columnWidth + gap) * i;\n\t\t\tend = (columnWidth * (i+1)) + (gap * i);\n\t\t\tcolumns.push({\n\t\t\t\tstart: this.findStart(view.document.body, start, end),\n\t\t\t\tend: this.findEnd(view.document.body, start, end)\n\t\t\t});\n\t\t}\n\n\t\treturn columns;\n\t}\n\n\t/**\n\t * Find Start Range\n\t * @private\n\t * @param {Node} root root node\n\t * @param {number} start position to start at\n\t * @param {number} end position to end at\n\t * @return {Range}\n\t */\n\tfindStart(root: Node, start: number, end: number): Range {\n\t\tconst stack = [root];\n\t\tlet $el;\n\t\tlet found;\n\t\tlet $prev = root;\n\n\t\twhile (stack.length) {\n\n\t\t\t$el = stack.shift();\n\n\t\t\tfound = this.walk($el!, (node) => {\n\t\t\t\tlet left, right, top, bottom;\n\n\n\t\t\t\tconst elPos = nodeBounds(node);\n\n\t\t\t\tif (this.horizontal && this.direction === \"ltr\") {\n\n\t\t\t\t\tleft = this.horizontal ? elPos.left : elPos.top;\n\t\t\t\t\tright = this.horizontal ? elPos.right : elPos.bottom;\n\n\t\t\t\t\tif( left >= start && left <= end ) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else if (right > start) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$prev = node;\n\t\t\t\t\t\tstack.push(node);\n\t\t\t\t\t}\n\n\t\t\t\t} else if (this.horizontal && this.direction === \"rtl\") {\n\n\t\t\t\t\tleft = elPos.left;\n\t\t\t\t\tright = elPos.right;\n\n\t\t\t\t\tif( right <= end && right >= start ) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else if (left < end) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$prev = node;\n\t\t\t\t\t\tstack.push(node);\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttop = elPos.top;\n\t\t\t\t\tbottom = elPos.bottom;\n\n\t\t\t\t\tif( top >= start && top <= end ) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else if (bottom > start) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$prev = node;\n\t\t\t\t\t\tstack.push(node);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t});\n\n\t\t\tif(found) {\n\t\t\t\treturn this.findTextStartRange(found, start, end);\n\t\t\t}\n\n\t\t}\n\n\t\t// Return last element\n\t\treturn this.findTextStartRange($prev, start, end);\n\t}\n\n\t/**\n\t * Find End Range\n\t * @private\n\t * @param {Node} root root node\n\t * @param {number} start position to start at\n\t * @param {number} end position to end at\n\t * @return {Range}\n\t */\n\tfindEnd(root: Node, start: number, end: number): Range {\n\t\tconst stack = [root];\n\t\tlet $el;\n\t\tlet $prev = root;\n\t\tlet found;\n\n\t\twhile (stack.length) {\n\n\t\t\t$el = stack.shift();\n\n\t\t\tfound = this.walk($el!, (node) => {\n\n\t\t\t\tlet left, right, top, bottom;\n\n\t\t\t\tconst elPos = nodeBounds(node);\n\n\t\t\t\tif (this.horizontal && this.direction === \"ltr\") {\n\n\t\t\t\t\tleft = Math.round(elPos.left);\n\t\t\t\t\tright = Math.round(elPos.right);\n\n\t\t\t\t\tif(left > end && $prev) {\n\t\t\t\t\t\treturn $prev;\n\t\t\t\t\t} else if(right > end) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$prev = node;\n\t\t\t\t\t\tstack.push(node);\n\t\t\t\t\t}\n\n\t\t\t\t} else if (this.horizontal && this.direction === \"rtl\") {\n\n\t\t\t\t\tleft = Math.round(this.horizontal ? elPos.left : elPos.top);\n\t\t\t\t\tright = Math.round(this.horizontal ? elPos.right : elPos.bottom);\n\n\t\t\t\t\tif(right < start && $prev) {\n\t\t\t\t\t\treturn $prev;\n\t\t\t\t\t} else if(left < start) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$prev = node;\n\t\t\t\t\t\tstack.push(node);\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttop = Math.round(elPos.top);\n\t\t\t\t\tbottom = Math.round(elPos.bottom);\n\n\t\t\t\t\tif(top > end && $prev) {\n\t\t\t\t\t\treturn $prev;\n\t\t\t\t\t} else if(bottom > end) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$prev = node;\n\t\t\t\t\t\tstack.push(node);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t});\n\n\n\t\t\tif(found){\n\t\t\t\treturn this.findTextEndRange(found, start, end);\n\t\t\t}\n\n\t\t}\n\n\t\t// end of chapter\n\t\treturn this.findTextEndRange($prev, start, end);\n\t}\n\n\t/**\n\t * Find Text Start Range\n\t * @private\n\t * @param {Node} root root node\n\t * @param {number} start position to start at\n\t * @param {number} end position to end at\n\t * @return {Range}\n\t */\n\tfindTextStartRange(node: Node, start: number, end: number): Range {\n\t\tconst ranges = this.splitTextNodeIntoRanges(node);\n\t\tlet range;\n\t\tlet pos;\n\t\tlet left, top, right;\n\n\t\tfor (let i = 0; i < ranges.length; i++) {\n\t\t\trange = ranges[i];\n\n\t\t\tpos = range.getBoundingClientRect();\n\n\t\t\tif (this.horizontal && this.direction === \"ltr\") {\n\n\t\t\t\tleft = pos.left;\n\t\t\t\tif( left >= start ) {\n\t\t\t\t\treturn range;\n\t\t\t\t}\n\n\t\t\t} else if (this.horizontal && this.direction === \"rtl\") {\n\n\t\t\t\tright = pos.right;\n\t\t\t\tif( right <= end ) {\n\t\t\t\t\treturn range;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttop = pos.top;\n\t\t\t\tif( top >= start ) {\n\t\t\t\t\treturn range;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// prev = range;\n\n\t\t}\n\n\t\treturn ranges[0];\n\t}\n\n\t/**\n\t * Find Text End Range\n\t * @private\n\t * @param {Node} root root node\n\t * @param {number} start position to start at\n\t * @param {number} end position to end at\n\t * @return {Range}\n\t */\n\tfindTextEndRange(node: Node, start: number, end: number): Range {\n\t\tconst ranges = this.splitTextNodeIntoRanges(node);\n\t\tlet prev;\n\t\tlet range;\n\t\tlet pos;\n\t\tlet left, right, top, bottom;\n\n\t\tfor (let i = 0; i < ranges.length; i++) {\n\t\t\trange = ranges[i];\n\n\t\t\tpos = range.getBoundingClientRect();\n\n\t\t\tif (this.horizontal && this.direction === \"ltr\") {\n\n\t\t\t\tleft = pos.left;\n\t\t\t\tright = pos.right;\n\n\t\t\t\tif(left > end && prev) {\n\t\t\t\t\treturn prev;\n\t\t\t\t} else if(right > end) {\n\t\t\t\t\treturn range;\n\t\t\t\t}\n\n\t\t\t} else if (this.horizontal && this.direction === \"rtl\") {\n\n\t\t\t\tleft = pos.left\n\t\t\t\tright = pos.right;\n\n\t\t\t\tif(right < start && prev) {\n\t\t\t\t\treturn prev;\n\t\t\t\t} else if(left < start) {\n\t\t\t\t\treturn range;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttop = pos.top;\n\t\t\t\tbottom = pos.bottom;\n\n\t\t\t\tif(top > end && prev) {\n\t\t\t\t\treturn prev;\n\t\t\t\t} else if(bottom > end) {\n\t\t\t\t\treturn range;\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tprev = range;\n\n\t\t}\n\n\t\t// Ends before limit\n\t\treturn ranges[ranges.length-1];\n\n\t}\n\n\t/**\n\t * Split up a text node into ranges for each word\n\t * @private\n\t * @param {Node} root root node\n\t * @param {string} [_splitter] what to split on\n\t * @return {Range[]}\n\t */\n\tsplitTextNodeIntoRanges(node: Node, _splitter?: string): Range[] {\n\t\tconst ranges: Range[] = [];\n\t\tconst textContent = node.textContent || \"\";\n\t\tconst text = textContent.trim();\n\t\tlet range: Range | null;\n\t\tconst doc = node.ownerDocument!;\n\t\tconst splitter = _splitter || \" \";\n\n\t\tlet pos = text.indexOf(splitter);\n\n\t\tif(pos === -1 || node.nodeType != Node.TEXT_NODE) {\n\t\t\trange = doc.createRange();\n\t\t\trange.selectNodeContents(node);\n\t\t\treturn [range];\n\t\t}\n\n\t\trange = doc.createRange();\n\t\trange.setStart(node, 0);\n\t\trange.setEnd(node, pos);\n\t\tranges.push(range);\n\t\trange = null;\n\n\t\twhile ( pos != -1 ) {\n\n\t\t\tpos = text.indexOf(splitter, pos + 1);\n\t\t\tif(pos > 0) {\n\n\t\t\t\tif(range) {\n\t\t\t\t\trange.setEnd(node, pos);\n\t\t\t\t\tranges.push(range);\n\t\t\t\t}\n\n\t\t\t\trange = doc.createRange();\n\t\t\t\trange.setStart(node, pos+1);\n\t\t\t}\n\t\t}\n\n\t\tif(range) {\n\t\t\trange.setEnd(node, text.length);\n\t\t\tranges.push(range);\n\t\t}\n\n\t\treturn ranges;\n\t}\n\n\n\t/**\n\t * Turn a pair of ranges into a pair of CFIs\n\t * @private\n\t * @param {string} cfiBase base string for an EpubCFI\n\t * @param {object} rangePair { start: Range, end: Range }\n\t * @return {object} { start: \"epubcfi(...)\", end: \"epubcfi(...)\" }\n\t */\n\trangePairToCfiPair(cfiBase: string, rangePair: RangePair): EpubCFIPair {\n\n\t\tconst startRange = rangePair.start;\n\t\tconst endRange = rangePair.end;\n\n\t\tstartRange.collapse(true);\n\t\tendRange.collapse(false);\n\n\t\tconst startCfi = new EpubCFI(startRange, cfiBase).toString();\n\t\tconst endCfi = new EpubCFI(endRange, cfiBase).toString();\n\n\t\treturn {\n\t\t\tstart: startCfi,\n\t\t\tend: endCfi\n\t\t};\n\n\t}\n\n\trangeListToCfiList(cfiBase: string, columns: RangePair[]): EpubCFIPair[] {\n\t\tconst map = [];\n\t\tlet cifPair;\n\n\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\tcifPair = this.rangePairToCfiPair(cfiBase, columns[i]);\n\n\t\t\tmap.push(cifPair);\n\n\t\t}\n\n\t\treturn map;\n\t}\n\n\t/**\n\t * Set the axis for mapping\n\t * @param {string} axis horizontal | vertical\n\t * @return {boolean} is it horizontal?\n\t */\n\taxis(axis?: string): boolean {\n\t\tif (axis) {\n\t\t\tthis.horizontal = (axis === \"horizontal\") ? true : false;\n\t\t}\n\t\treturn this.horizontal;\n\t}\n}\n\nexport default Mapping;\n","import EventEmitter from \"./utils/event-emitter\";\nimport {isNumber, prefixed, borders, defaults} from \"./utils/core\";\nimport EpubCFI from \"./epubcfi\";\nimport Mapping from \"./mapping\";\nimport {replaceLinks} from \"./utils/replacements\";\nimport { EPUBJS_VERSION, EVENTS, DOM_EVENTS } from \"./utils/constants\";\nimport type { ViewportSettings, LayoutProps, EpubCFIPair, IEventEmitter } from \"./types\";\nimport type Section from \"./section\";\n\nconst hasNavigator = typeof (navigator) !== \"undefined\";\n\nconst isChrome = hasNavigator && /Chrome/.test(navigator.userAgent);\nconst isWebkit = hasNavigator && !isChrome && /AppleWebKit/.test(navigator.userAgent);\n\nconst ELEMENT_NODE = 1;\nconst _TEXT_NODE = 3;\n\n/**\n\t* Handles DOM manipulation, queries and events for View contents\n\t* @class\n\t* @param {document} doc Document\n\t* @param {element} content Parent Element (typically Body)\n\t* @param {string} cfiBase Section component of CFIs\n\t* @param {number} sectionIndex Index in Spine of Conntent's Section\n\t*/\nclass Contents implements IEventEmitter {\n\tdeclare on: (type: string, fn: (...args: any[]) => void) => this;\n\tdeclare off: (type: string, fn?: (...args: any[]) => void) => this;\n\tdeclare emit: (type: string, ...args: any[]) => void;\n\n\tepubcfi: EpubCFI;\n\tdocument: Document;\n\tdocumentElement: HTMLElement;\n\tcontent: HTMLElement;\n\twindow: Window;\n\t_size: { width: number; height: number };\n\tsectionIndex: number;\n\tcfiBase: string;\n\tcalled: number;\n\tactive: boolean;\n\tobserver: ResizeObserver | MutationObserver | undefined;\n\texpanding: ReturnType<typeof setTimeout> | undefined;\n\tonResize: ((size: { width: number; height: number }) => void) | undefined;\n\t_expanding: boolean;\n\t_resizeCheck: (() => void) | undefined;\n\t_triggerEvent: ((e: Event) => void) | undefined;\n\t_onSelectionChange: ((e: Event) => void) | undefined;\n\tselectionEndTimeout: ReturnType<typeof setTimeout> | undefined;\n\t_layoutStyle: string;\n\n\tconstructor(doc: Document, content?: HTMLElement, cfiBase?: string, sectionIndex?: number) {\n\t\t// Blank Cfi for Parsing\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.document = doc;\n\t\tthis.documentElement = this.document.documentElement as HTMLElement;\n\t\tthis.content = content || this.document.body as HTMLElement;\n\t\tthis.window = this.document.defaultView!;\n\n\t\tthis._size = {\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\n\t\tthis.sectionIndex = sectionIndex || 0;\n\t\tthis.cfiBase = cfiBase || \"\";\n\n\t\tthis.epubReadingSystem(\"epub.js\", EPUBJS_VERSION);\n\t\tthis.called = 0;\n\t\tthis.active = true;\n\t\tthis.listeners();\n\t}\n\n\t/**\n\t\t* Get DOM events that are listened for and passed along\n\t\t*/\n\tstatic get listenedEvents() {\n\t\treturn DOM_EVENTS;\n\t}\n\n\t/**\n\t\t* Get or Set width\n\t\t* @param {number} [w]\n\t\t* @returns {number} width\n\t\t*/\n\twidth(w?: number | string): number {\n\t\t// var frame = this.documentElement;\n\t\tconst frame = this.content;\n\n\t\tif (w && isNumber(w)) {\n\t\t\tw = w + \"px\";\n\t\t}\n\n\t\tif (w) {\n\t\t\tframe.style.width = w as string;\n\t\t\t// this.content.style.width = w;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(frame)[\"width\"]);\n\n\n\t}\n\n\t/**\n\t\t* Get or Set height\n\t\t* @param {number} [h]\n\t\t* @returns {number} height\n\t\t*/\n\theight(h?: number | string): number {\n\t\t// var frame = this.documentElement;\n\t\tconst frame = this.content;\n\n\t\tif (h && isNumber(h)) {\n\t\t\th = h + \"px\";\n\t\t}\n\n\t\tif (h) {\n\t\t\tframe.style.height = h as string;\n\t\t\t// this.content.style.height = h;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(frame)[\"height\"]);\n\n\t}\n\n\t/**\n\t\t* Get or Set width of the contents\n\t\t* @param {number} [w]\n\t\t* @returns {number} width\n\t\t*/\n\tcontentWidth(w?: number | string): number {\n\n\t\tconst content = this.content || this.document.body;\n\n\t\tif (w && isNumber(w)) {\n\t\t\tw = w + \"px\";\n\t\t}\n\n\t\tif (w) {\n\t\t\tcontent.style.width = w as string;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(content)[\"width\"]);\n\n\n\t}\n\n\t/**\n\t\t* Get or Set height of the contents\n\t\t* @param {number} [h]\n\t\t* @returns {number} height\n\t\t*/\n\tcontentHeight(h?: number | string): number {\n\n\t\tconst content = this.content || this.document.body;\n\n\t\tif (h && isNumber(h)) {\n\t\t\th = h + \"px\";\n\t\t}\n\n\t\tif (h) {\n\t\t\tcontent.style.height = h as string;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(content)[\"height\"]);\n\n\t}\n\n\t/**\n\t\t* Get the width of the text using Range\n\t\t* @returns {number} width\n\t\t*/\n\ttextWidth(): number {\n\t\tlet width;\n\t\tconst range = this.document.createRange();\n\t\tconst content = this.content || this.document.body;\n\t\tconst border = borders(content);\n\n\t\t// Select the contents of frame\n\t\trange.selectNodeContents(content);\n\n\t\t// get the width of the text content\n\t\tconst rect = range.getBoundingClientRect();\n\t\twidth = rect.width;\n\n\t\tif (border && border.width) {\n\t\t\twidth += border.width;\n\t\t}\n\n\t\treturn Math.round(width);\n\t}\n\n\t/**\n\t\t* Get the height of the text using Range\n\t\t* @returns {number} height\n\t\t*/\n\ttextHeight(): number {\n\t\tconst range = this.document.createRange();\n\t\tconst content = this.content || this.document.body;\n\n\t\trange.selectNodeContents(content);\n\n\t\tconst rect = range.getBoundingClientRect();\n\t\tconst height = rect.bottom;\n\n\t\treturn Math.round(height);\n\t}\n\n\t/**\n\t\t* Get documentElement scrollWidth\n\t\t* @returns {number} width\n\t\t*/\n\tscrollWidth(): number {\n\t\tconst width = this.documentElement.scrollWidth;\n\n\t\treturn width;\n\t}\n\n\t/**\n\t\t* Get documentElement scrollHeight\n\t\t* @returns {number} height\n\t\t*/\n\tscrollHeight(): number {\n\t\tconst height = this.documentElement.scrollHeight;\n\n\t\treturn height;\n\t}\n\n\t/**\n\t\t* Set overflow css style of the contents\n\t\t* @param {string} [overflow]\n\t\t*/\n\toverflow(overflow?: string): string {\n\n\t\tif (overflow) {\n\t\t\tthis.documentElement.style.overflow = overflow;\n\t\t}\n\n\t\treturn this.window.getComputedStyle(this.documentElement)[\"overflow\"];\n\t}\n\n\t/**\n\t\t* Set overflowX css style of the documentElement\n\t\t* @param {string} [overflow]\n\t\t*/\n\toverflowX(overflow?: string): string {\n\n\t\tif (overflow) {\n\t\t\tthis.documentElement.style.overflowX = overflow;\n\t\t}\n\n\t\treturn this.window.getComputedStyle(this.documentElement)[\"overflowX\"];\n\t}\n\n\t/**\n\t\t* Set overflowY css style of the documentElement\n\t\t* @param {string} [overflow]\n\t\t*/\n\toverflowY(overflow?: string): string {\n\n\t\tif (overflow) {\n\t\t\tthis.documentElement.style.overflowY = overflow;\n\t\t}\n\n\t\treturn this.window.getComputedStyle(this.documentElement)[\"overflowY\"];\n\t}\n\n\t/**\n\t\t* Set Css styles on the contents element (typically Body)\n\t\t* @param {string} property\n\t\t* @param {string} value\n\t\t* @param {boolean} [priority] set as \"important\"\n\t\t*/\n\tcss(property: string, value?: string, priority?: boolean): string {\n\t\tconst content = this.content || this.document.body;\n\n\t\tif (value) {\n\t\t\tcontent.style.setProperty(property, value, priority ? \"important\" : \"\");\n\t\t} else {\n\t\t\tcontent.style.removeProperty(property);\n\t\t}\n\n\t\treturn (this.window.getComputedStyle(content) as Record<string, any>)[property];\n\t}\n\n\t/**\n\t\t* Get or Set the viewport element\n\t\t* @param {object} [options]\n\t\t* @param {string} [options.width]\n\t\t* @param {string} [options.height]\n\t\t* @param {string} [options.scale]\n\t\t* @param {string} [options.minimum]\n\t\t* @param {string} [options.maximum]\n\t\t* @param {string} [options.scalable]\n\t\t*/\n\tviewport(options?: Partial<Record<keyof ViewportSettings, string | number>>): ViewportSettings {\n\t\tlet _width, _height, _scale, _minimum, _maximum, _scalable;\n\t\t// var width, height, scale, minimum, maximum, scalable;\n\t\tlet $viewport = this.document.querySelector(\"meta[name='viewport']\");\n\t\tconst parsed: Partial<ViewportSettings> = {\n\t\t\t\"width\": undefined,\n\t\t\t\"height\": undefined,\n\t\t\t\"scale\": undefined,\n\t\t\t\"minimum\": undefined,\n\t\t\t\"maximum\": undefined,\n\t\t\t\"scalable\": undefined\n\t\t};\n\t\tconst newContent: string[] = [];\n\t\tlet settings: Record<string, string | number> = {};\n\n\t\t/*\n\t\t* check for the viewport size\n\t\t* <meta name=\"viewport\" content=\"width=1024,height=697\" />\n\t\t*/\n\t\tif($viewport && $viewport.hasAttribute(\"content\")) {\n\t\t\tconst content = $viewport.getAttribute(\"content\") ?? \"\";\n\t\t\tconst _width = content.match(/width\\s*=\\s*([^,]*)/);\n\t\t\tconst _height = content.match(/height\\s*=\\s*([^,]*)/);\n\t\t\tconst _scale = content.match(/initial-scale\\s*=\\s*([^,]*)/);\n\t\t\tconst _minimum = content.match(/minimum-scale\\s*=\\s*([^,]*)/);\n\t\t\tconst _maximum = content.match(/maximum-scale\\s*=\\s*([^,]*)/);\n\t\t\tconst _scalable = content.match(/user-scalable\\s*=\\s*([^,]*)/);\n\n\t\t\tif(_width && _width.length && typeof _width[1] !== \"undefined\"){\n\t\t\t\tparsed.width = _width[1];\n\t\t\t}\n\t\t\tif(_height && _height.length && typeof _height[1] !== \"undefined\"){\n\t\t\t\tparsed.height = _height[1];\n\t\t\t}\n\t\t\tif(_scale && _scale.length && typeof _scale[1] !== \"undefined\"){\n\t\t\t\tparsed.scale = _scale[1];\n\t\t\t}\n\t\t\tif(_minimum && _minimum.length && typeof _minimum[1] !== \"undefined\"){\n\t\t\t\tparsed.minimum = _minimum[1];\n\t\t\t}\n\t\t\tif(_maximum && _maximum.length && typeof _maximum[1] !== \"undefined\"){\n\t\t\t\tparsed.maximum = _maximum[1];\n\t\t\t}\n\t\t\tif(_scalable && _scalable.length && typeof _scalable[1] !== \"undefined\"){\n\t\t\t\tparsed.scalable = _scalable[1];\n\t\t\t}\n\t\t}\n\n\t\tsettings = defaults(options || {}, parsed);\n\n\t\tif (options) {\n\t\t\tif (settings.width) {\n\t\t\t\tnewContent.push(\"width=\" + settings.width);\n\t\t\t}\n\n\t\t\tif (settings.height) {\n\t\t\t\tnewContent.push(\"height=\" + settings.height);\n\t\t\t}\n\n\t\t\tif (settings.scale) {\n\t\t\t\tnewContent.push(\"initial-scale=\" + settings.scale);\n\t\t\t}\n\n\t\t\tif (settings.scalable === \"no\") {\n\t\t\t\tnewContent.push(\"minimum-scale=\" + settings.scale);\n\t\t\t\tnewContent.push(\"maximum-scale=\" + settings.scale);\n\t\t\t\tnewContent.push(\"user-scalable=\" + settings.scalable);\n\t\t\t} else {\n\n\t\t\t\tif (settings.scalable) {\n\t\t\t\t\tnewContent.push(\"user-scalable=\" + settings.scalable);\n\t\t\t\t}\n\n\t\t\t\tif (settings.minimum) {\n\t\t\t\t\tnewContent.push(\"minimum-scale=\" + settings.minimum);\n\t\t\t\t}\n\n\t\t\t\tif (settings.maximum) {\n\t\t\t\t\tnewContent.push(\"minimum-scale=\" + settings.maximum);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!$viewport) {\n\t\t\t\t$viewport = this.document.createElement(\"meta\");\n\t\t\t\t$viewport.setAttribute(\"name\", \"viewport\");\n\t\t\t\tthis.document.querySelector(\"head\")!.appendChild($viewport);\n\t\t\t}\n\n\t\t\t$viewport.setAttribute(\"content\", newContent.join(\", \"));\n\n\t\t\tthis.window.scrollTo(0, 0);\n\t\t}\n\n\n\t\treturn settings as unknown as ViewportSettings;\n\t}\n\n\t/**\n\t * Event emitter for when the contents has expanded\n\t * @private\n\t */\n\texpand(): void {\n\t\tthis.emit(EVENTS.CONTENTS.EXPAND);\n\t}\n\n\t/**\n\t * Add DOM listeners\n\t * @private\n\t */\n\tlisteners(): void {\n\t\tthis.imageLoadListeners();\n\n\t\tthis.mediaQueryListeners();\n\n\t\t// this.fontLoadListeners();\n\n\t\tthis.addEventListeners();\n\n\t\tthis.addSelectionListeners();\n\n\t\t// this.transitionListeners();\n\n\t\tif (typeof ResizeObserver === \"undefined\") {\n\t\t\tthis.resizeListeners();\n\t\t\tthis.visibilityListeners();\n\t\t} else {\n\t\t\tthis.resizeObservers();\n\t\t}\n\n\t\t// this.mutationObservers();\n\n\t\tthis.linksHandler();\n\t}\n\n\t/**\n\t * Remove DOM listeners\n\t * @private\n\t */\n\tremoveListeners(): void {\n\n\t\tthis.removeEventListeners();\n\n\t\tthis.removeSelectionListeners();\n\n\t\tif (this.observer) {\n\t\t\tthis.observer.disconnect();\n\t\t}\n\n\t\tclearTimeout(this.expanding);\n\t}\n\n\t/**\n\t * Check if size of contents has changed and\n\t * emit 'resize' event if it has.\n\t * @private\n\t */\n\tresizeCheck(): void {\n\t\tconst width = this.textWidth();\n\t\tconst height = this.textHeight();\n\n\t\tif (width != this._size.width || height != this._size.height) {\n\n\t\t\tthis._size = {\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.onResize && this.onResize(this._size);\n\t\t\tthis.emit(EVENTS.CONTENTS.RESIZE, this._size);\n\t\t}\n\t}\n\n\t/**\n\t * Poll for resize detection\n\t * @private\n\t */\n\tresizeListeners(): void {\n\t\tlet _width, _height;\n\t\t// Test size again\n\t\tclearTimeout(this.expanding);\n\t\trequestAnimationFrame(this.resizeCheck.bind(this));\n\t\tthis.expanding = setTimeout(this.resizeListeners.bind(this), 350);\n\t}\n\n\t/**\n\t * Listen for visibility of tab to change\n\t * @private\n\t */\n\tvisibilityListeners(): void {\n\t\tdocument.addEventListener(\"visibilitychange\", () => {\n\t\t\tif (document.visibilityState === \"visible\" && this.active === false) {\n\t\t\t\tthis.active = true;\n\t\t\t\tthis.resizeListeners();\n\t\t\t} else {\n\t\t\t\tthis.active = false;\n\t\t\t\tclearTimeout(this.expanding);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Use css transitions to detect resize\n\t * @private\n\t */\n\ttransitionListeners(): void {\n\t\tconst body = this.content;\n\n\t\tbody.style[\"transitionProperty\"] = \"font, font-size, font-size-adjust, font-stretch, font-variation-settings, font-weight, width, height\";\n\t\tbody.style[\"transitionDuration\"] = \"0.001ms\";\n\t\tbody.style[\"transitionTimingFunction\"] = \"linear\";\n\t\tbody.style[\"transitionDelay\"] = \"0\";\n\n\t\tthis._resizeCheck = this.resizeCheck.bind(this);\n\t\tthis.document.addEventListener(\"transitionend\", this._resizeCheck!);\n\t}\n\n\t/**\n\t * Listen for media query changes and emit 'expand' event\n\t * Adapted from: https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js\n\t * @private\n\t */\n\tmediaQueryListeners(): void {\n\t\tconst sheets = this.document.styleSheets;\n\t\tconst mediaChangeHandler = function(m: MediaQueryListEvent){\n\t\t\tif(m.matches && !this._expanding) {\n\t\t\t\tsetTimeout(this.expand.bind(this), 1);\n\t\t\t}\n\t\t}.bind(this);\n\n\t\tfor (let i = 0; i < sheets.length; i += 1) {\n\t\t\tlet rules;\n\t\t\t// Firefox errors if we access cssRules cross-domain\n\t\t\ttry {\n\t\t\t\trules = sheets[i].cssRules;\n\t\t\t} catch (_e) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!rules) return; // Stylesheets changed\n\t\t\tfor (let j = 0; j < rules.length; j += 1) {\n\t\t\t\t//if (rules[j].constructor === CSSMediaRule) {\n\t\t\t\tif((rules[j] as CSSMediaRule).media){\n\t\t\t\t\tconst mql = this.window.matchMedia((rules[j] as CSSMediaRule).media.mediaText);\n\t\t\t\t\tmql.addListener(mediaChangeHandler);\n\t\t\t\t\t//mql.onchange = mediaChangeHandler;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Use ResizeObserver to listen for changes in the DOM and check for resize\n\t * @private\n\t */\n\tresizeObservers(): void {\n\t\t// create an observer instance\n\t\tthis.observer = new ResizeObserver((_e) => {\n\t\t\trequestAnimationFrame(this.resizeCheck.bind(this));\n\t\t});\n\n\t\t// pass in the target node\n\t\tthis.observer.observe(this.document.documentElement);\n\t}\n\n\t/**\n\t * Use MutationObserver to listen for changes in the DOM and check for resize\n\t * @private\n\t */\n\tmutationObservers(): void {\n\t\t// create an observer instance\n\t\tthis.observer = new MutationObserver((_mutations) => {\n\t\t\tthis.resizeCheck();\n\t\t});\n\n\t\t// configuration of the observer:\n\t\tconst config = { attributes: true, childList: true, characterData: true, subtree: true };\n\n\t\t// pass in the target node, as well as the observer options\n\t\tthis.observer.observe(this.document, config);\n\t}\n\n\t/**\n\t * Test if images are loaded or add listener for when they load\n\t * @private\n\t */\n\timageLoadListeners(): void {\n\t\tconst images = this.document.querySelectorAll(\"img\");\n\t\tlet img;\n\t\tfor (let i = 0; i < images.length; i++) {\n\t\t\timg = images[i];\n\n\t\t\tif (typeof img.naturalWidth !== \"undefined\" &&\n\t\t\t\t\timg.naturalWidth === 0) {\n\t\t\t\timg.onload = this.expand.bind(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Listen for font load and check for resize when loaded\n\t * @private\n\t */\n\tfontLoadListeners(): void {\n\t\tif (!this.document || !this.document.fonts) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.document.fonts.ready.then(function () {\n\t\t\tthis.resizeCheck();\n\t\t}.bind(this));\n\n\t}\n\n\t/**\n\t * Get the documentElement\n\t * @returns {element} documentElement\n\t */\n\troot(): HTMLElement | null {\n\t\tif(!this.document) return null;\n\t\treturn this.document.documentElement;\n\t}\n\n\t/**\n\t * Get the location offset of a EpubCFI or an #id\n\t * @param {string | EpubCFI} target\n\t * @param {string} [ignoreClass] for the cfi\n\t * @returns { {left: Number, top: Number }\n\t */\n\tlocationOf(target: string, ignoreClass?: string): { left: number; top: number } {\n\t\tlet position;\n\t\tconst targetPos = {\"left\": 0, \"top\": 0};\n\n\t\tif(!this.document) return targetPos;\n\n\t\tif(this.epubcfi.isCfiString(target)) {\n\t\t\tconst range = new EpubCFI(target).toRange(this.document, ignoreClass);\n\n\t\t\tif(range) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!range.endContainer ||\n\t\t\t\t\t\t(range.startContainer == range.endContainer\n\t\t\t\t\t\t&& range.startOffset == range.endOffset)) {\n\t\t\t\t\t\t// If the end for the range is not set, it results in collapsed becoming\n\t\t\t\t\t\t// true. This in turn leads to inconsistent behaviour when calling\n\t\t\t\t\t\t// getBoundingRect. Wrong bounds lead to the wrong page being displayed.\n\t\t\t\t\t\t// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/15684911/\n\t\t\t\t\t\tlet pos = (range.startContainer.textContent ?? \"\").indexOf(\" \", range.startOffset);\n\t\t\t\t\t\tif (pos == -1) {\n\t\t\t\t\t\t\tpos = (range.startContainer.textContent ?? \"\").length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trange.setEnd(range.startContainer, pos);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(\"setting end offset to start container length failed\", e);\n\t\t\t\t}\n\n\t\t\t\tif (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\tposition = (range.startContainer as Element).getBoundingClientRect();\n\t\t\t\t\ttargetPos.left = position.left;\n\t\t\t\t\ttargetPos.top = position.top;\n\t\t\t\t} else {\n\t\t\t\t\t// Webkit does not handle collapsed range bounds correctly\n\t\t\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=138949\n\n\t\t\t\t\t// Construct a new non-collapsed range\n\t\t\t\t\tif (isWebkit) {\n\t\t\t\t\t\tconst container = range.startContainer;\n\t\t\t\t\t\tconst newRange = new Range();\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (container.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tposition = (container as Element).getBoundingClientRect();\n\t\t\t\t\t\t\t} else if (range.startOffset + 2 < (container as CharacterData).length) {\n\t\t\t\t\t\t\t\tnewRange.setStart(container, range.startOffset);\n\t\t\t\t\t\t\t\tnewRange.setEnd(container, range.startOffset + 2);\n\t\t\t\t\t\t\t\tposition = newRange.getBoundingClientRect();\n\t\t\t\t\t\t\t} else if (range.startOffset - 2 > 0) {\n\t\t\t\t\t\t\t\tnewRange.setStart(container, range.startOffset - 2);\n\t\t\t\t\t\t\t\tnewRange.setEnd(container, range.startOffset);\n\t\t\t\t\t\t\t\tposition = newRange.getBoundingClientRect();\n\t\t\t\t\t\t\t} else { // empty, return the parent element\n\t\t\t\t\t\t\t\tposition = (container.parentNode as Element).getBoundingClientRect();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\tconsole.error(e, e.stack);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition = range.getBoundingClientRect();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if(typeof target === \"string\" &&\n\t\t\ttarget.indexOf(\"#\") > -1) {\n\n\t\t\tconst id = target.substring(target.indexOf(\"#\")+1);\n\t\t\tconst el = this.document.getElementById(id);\n\t\t\tif(el) {\n\t\t\t\tif (isWebkit) {\n\t\t\t\t\t// Webkit reports incorrect bounding rects in Columns\n\t\t\t\t\tconst newRange = new Range();\n\t\t\t\t\tnewRange.selectNode(el);\n\t\t\t\t\tposition = newRange.getBoundingClientRect();\n\t\t\t\t} else {\n\t\t\t\t\tposition = el.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (position) {\n\t\t\ttargetPos.left = position.left;\n\t\t\ttargetPos.top = position.top;\n\t\t}\n\n\t\treturn targetPos;\n\t}\n\n\t/**\n\t * Append a stylesheet link to the document head\n\t * @param {string} src url\n\t */\n\taddStylesheet(src: string): Promise<boolean> {\n\t\treturn new Promise(function(resolve: (value: boolean) => void, _reject: (reason?: unknown) => void){\n\t\t\tlet $stylesheet;\n\t\t\tlet ready = false;\n\n\t\t\tif(!this.document) {\n\t\t\t\tresolve(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if link already exists\n\t\t\t$stylesheet = this.document.querySelector(\"link[href='\"+src+\"']\");\n\t\t\tif ($stylesheet) {\n\t\t\t\tresolve(true);\n\t\t\t\treturn; // already present\n\t\t\t}\n\n\t\t\t$stylesheet = this.document.createElement(\"link\");\n\t\t\t$stylesheet.type = \"text/css\";\n\t\t\t$stylesheet.rel = \"stylesheet\";\n\t\t\t$stylesheet.href = src;\n\t\t\t$stylesheet.onload = $stylesheet.onreadystatechange = function() {\n\t\t\t\tif ( !ready && (!this.readyState || this.readyState == \"complete\") ) {\n\t\t\t\t\tready = true;\n\t\t\t\t\t// Let apply\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.document.head.appendChild($stylesheet);\n\n\t\t}.bind(this));\n\t}\n\n\t_getStylesheetNode(key?: string): HTMLStyleElement | false {\n\t\tlet styleEl: HTMLStyleElement;\n\t\tkey = \"epubjs-inserted-css-\" + (key || \"\");\n\n\t\tif(!this.document) return false;\n\n\t\t// Check if link already exists\n\t\tstyleEl = this.document.getElementById(key) as HTMLStyleElement;\n\t\tif (!styleEl) {\n\t\t\tstyleEl = this.document.createElement(\"style\");\n\t\t\tstyleEl.id = key;\n\t\t\t// Append style element to head\n\t\t\tthis.document.head.appendChild(styleEl);\n\t\t}\n\t\treturn styleEl;\n\t}\n\n\t/**\n\t * Append stylesheet css\n\t * @param {string} serializedCss\n\t * @param {string} key If the key is the same, the CSS will be replaced instead of inserted\n\t */\n\taddStylesheetCss(serializedCss: string, key?: string): boolean {\n\t\tif(!this.document || !serializedCss) return false;\n\n\t\tconst styleEl = this._getStylesheetNode(key);\n\t\tif (!styleEl) return false;\n\t\tstyleEl.innerHTML = serializedCss;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Append stylesheet rules to a generate stylesheet\n\t * Array: https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule\n\t * Object: https://github.com/desirable-objects/json-to-css\n\t * @param {array | object} rules\n\t * @param {string} key If the key is the same, the CSS will be replaced instead of inserted\n\t */\n\taddStylesheetRules(rules: any, key?: string): void {\n\t\tif(!this.document || !rules || rules.length === 0) return;\n\n\t\t// Grab style sheet\n\t\tconst styleSheet: CSSStyleSheet = (this._getStylesheetNode(key) as HTMLStyleElement).sheet as CSSStyleSheet;\n\n\t\tif (Object.prototype.toString.call(rules) === \"[object Array]\") {\n\t\t\tfor (let i = 0, rl = rules.length; i < rl; i++) {\n\t\t\t\tlet j = 1, rule = rules[i], propStr = \"\";\n\t\t\t\tconst selector = rules[i][0];\n\t\t\t\t// If the second argument of a rule is an array of arrays, correct our variables.\n\t\t\t\tif (Object.prototype.toString.call(rule[1][0]) === \"[object Array]\") {\n\t\t\t\t\trule = rule[1];\n\t\t\t\t\tj = 0;\n\t\t\t\t}\n\n\t\t\t\tfor (let pl = rule.length; j < pl; j++) {\n\t\t\t\t\tconst prop = rule[j];\n\t\t\t\t\tpropStr += prop[0] + \":\" + prop[1] + (prop[2] ? \" !important\" : \"\") + \";\\n\";\n\t\t\t\t}\n\n\t\t\t\t// Insert CSS Rule\n\t\t\t\tstyleSheet.insertRule(selector + \"{\" + propStr + \"}\", styleSheet.cssRules.length);\n\t\t\t}\n\t\t} else {\n\t\t\tconst selectors = Object.keys(rules);\n\t\t\tselectors.forEach((selector) => {\n\t\t\t\tconst definition = rules[selector];\n\t\t\t\tif (Array.isArray(definition)) {\n\t\t\t\t\tdefinition.forEach((item) => {\n\t\t\t\t\t\tconst _rules = Object.keys(item);\n\t\t\t\t\t\tconst result = _rules.map((rule) => {\n\t\t\t\t\t\t\treturn `${rule}:${item[rule]}`;\n\t\t\t\t\t\t}).join(\";\");\n\t\t\t\t\t\tstyleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst _rules = Object.keys(definition);\n\t\t\t\t\tconst result = _rules.map((rule) => {\n\t\t\t\t\t\treturn `${rule}:${definition[rule]}`;\n\t\t\t\t\t}).join(\";\");\n\t\t\t\t\tstyleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Append a script tag to the document head\n\t * @param {string} src url\n\t * @returns {Promise} loaded\n\t */\n\taddScript(src: string): Promise<boolean> {\n\n\t\treturn new Promise(function(resolve: (value: boolean) => void, _reject: (reason?: unknown) => void){\n\t\t\tlet ready = false;\n\n\t\t\tif(!this.document) {\n\t\t\t\tresolve(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst $script = this.document.createElement(\"script\");\n\t\t\t$script.type = \"text/javascript\";\n\t\t\t$script.async = true;\n\t\t\t$script.src = src;\n\t\t\t$script.onload = $script.onreadystatechange = function() {\n\t\t\t\tif ( !ready && (!this.readyState || this.readyState == \"complete\") ) {\n\t\t\t\t\tready = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.document.head.appendChild($script);\n\n\t\t}.bind(this));\n\t}\n\n\t/**\n\t * Add a class to the contents container\n\t * @param {string} className\n\t */\n\taddClass(className: string): void {\n\t\tif(!this.document) return;\n\n\t\tconst content = this.content || this.document.body;\n\n\t\tif (content) {\n\t\t\tcontent.classList.add(className);\n\t\t}\n\n\t}\n\n\t/**\n\t * Remove a class from the contents container\n\t * @param {string} removeClass\n\t */\n\tremoveClass(className: string): void {\n\t\tif(!this.document) return;\n\n\t\tconst content = this.content || this.document.body;\n\n\t\tif (content) {\n\t\t\tcontent.classList.remove(className);\n\t\t}\n\n\t}\n\n\t/**\n\t * Add DOM event listeners\n\t * @private\n\t */\n\taddEventListeners(): void {\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._triggerEvent = this.triggerEvent.bind(this);\n\n\t\tDOM_EVENTS.forEach(function(eventName){\n\t\t\tthis.document.addEventListener(eventName, this._triggerEvent, { passive: true });\n\t\t}, this);\n\n\t}\n\n\t/**\n\t * Remove DOM event listeners\n\t * @private\n\t */\n\tremoveEventListeners(): void {\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\t\tDOM_EVENTS.forEach(function(eventName){\n\t\t\tthis.document.removeEventListener(eventName, this._triggerEvent, { passive: true });\n\t\t}, this);\n\t\tthis._triggerEvent = undefined;\n\t}\n\n\t/**\n\t * Emit passed browser events\n\t * @private\n\t */\n\ttriggerEvent(e: Event): void {\n\t\tthis.emit(e.type, e);\n\t}\n\n\t/**\n\t * Add listener for text selection\n\t * @private\n\t */\n\taddSelectionListeners(): void {\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\t\tthis._onSelectionChange = this.onSelectionChange.bind(this);\n\t\tthis.document.addEventListener(\"selectionchange\", this._onSelectionChange!, { passive: true });\n\t}\n\n\t/**\n\t * Remove listener for text selection\n\t * @private\n\t */\n\tremoveSelectionListeners(): void {\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\t\tthis.document.removeEventListener(\"selectionchange\", this._onSelectionChange!);\n\t\tthis._onSelectionChange = undefined;\n\t}\n\n\t/**\n\t * Handle getting text on selection\n\t * @private\n\t */\n\tonSelectionChange(_e: Event): void {\n\t\tif (this.selectionEndTimeout) {\n\t\t\tclearTimeout(this.selectionEndTimeout);\n\t\t}\n\t\tthis.selectionEndTimeout = setTimeout(function() {\n\t\t\tconst selection = this.window.getSelection();\n\t\t\tthis.triggerSelectedEvent(selection);\n\t\t}.bind(this), 250);\n\t}\n\n\t/**\n\t * Emit event on text selection\n\t * @private\n\t */\n\ttriggerSelectedEvent(selection: Selection): void {\n\t\tlet range, cfirange;\n\n\t\tif (selection && selection.rangeCount > 0) {\n\t\t\trange = selection.getRangeAt(0);\n\t\t\tif(!range.collapsed) {\n\t\t\t\t// cfirange = this.section.cfiFromRange(range);\n\t\t\t\tcfirange = new EpubCFI(range, this.cfiBase).toString();\n\t\t\t\tthis.emit(EVENTS.CONTENTS.SELECTED, cfirange);\n\t\t\t\tthis.emit(EVENTS.CONTENTS.SELECTED_RANGE, range);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get a Dom Range from EpubCFI\n\t * @param {EpubCFI} _cfi\n\t * @param {string} [ignoreClass]\n\t * @returns {Range} range\n\t */\n\trange(_cfi: string, ignoreClass?: string): Range {\n\t\tconst cfi = new EpubCFI(_cfi);\n\t\treturn cfi.toRange(this.document, ignoreClass)!;\n\t}\n\n\t/**\n\t * Get an EpubCFI from a Dom Range\n\t * @param {Range} range\n\t * @param {string} [ignoreClass]\n\t * @returns {EpubCFI} cfi\n\t */\n\tcfiFromRange(range: Range, ignoreClass?: string): string {\n\t\treturn new EpubCFI(range, this.cfiBase, ignoreClass).toString();\n\t}\n\n\t/**\n\t * Get an EpubCFI from a Dom node\n\t * @param {node} node\n\t * @param {string} [ignoreClass]\n\t * @returns {EpubCFI} cfi\n\t */\n\tcfiFromNode(node: Node, ignoreClass?: string): string {\n\t\treturn new EpubCFI(node, this.cfiBase, ignoreClass).toString();\n\t}\n\n\t// TODO: find where this is used - remove?\n\tmap(layout: LayoutProps): EpubCFIPair[] {\n\t\tconst map = new Mapping(layout);\n\t\treturn map.section(undefined as any);\n\t}\n\n\t/**\n\t * Size the contents to a given width and height\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n\tsize(width?: number, height?: number): void {\n\t\tconst viewport: Partial<Record<keyof ViewportSettings, string | number>> = { scale: 1.0, scalable: \"no\" };\n\n\t\tthis.layoutStyle(\"scrolling\");\n\n\t\tif (width !== undefined && width >= 0) {\n\t\t\tthis.width(width);\n\t\t\tviewport.width = width;\n\t\t\tthis.css(\"padding\", \"0 \"+(width/12)+\"px\");\n\t\t}\n\n\t\tif (height !== undefined && height >= 0) {\n\t\t\tthis.height(height);\n\t\t\tviewport.height = height;\n\t\t}\n\n\t\tthis.css(\"margin\", \"0\");\n\t\tthis.css(\"box-sizing\", \"border-box\");\n\n\n\t\tthis.viewport(viewport);\n\t}\n\n\t/**\n\t * Apply columns to the contents for pagination\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {number} columnWidth\n\t * @param {number} gap\n\t */\n\tcolumns(width: number, height: number, columnWidth: number, gap: number, dir?: string): void {\n\t\tconst COLUMN_AXIS = prefixed(\"column-axis\");\n\t\tconst COLUMN_GAP = prefixed(\"column-gap\");\n\t\tconst COLUMN_WIDTH = prefixed(\"column-width\");\n\t\tconst COLUMN_FILL = prefixed(\"column-fill\");\n\n\t\tconst writingMode = this.writingMode();\n\t\tconst axis = (writingMode.indexOf(\"vertical\") === 0) ? \"vertical\" : \"horizontal\";\n\n\t\tthis.layoutStyle(\"paginated\");\n\n\t\tif (dir === \"rtl\" && axis === \"horizontal\") {\n\t\t\tthis.direction(dir);\n\t\t}\n\n\t\tthis.width(width);\n\t\tthis.height(height);\n\n\t\t// Deal with Mobile trying to scale to viewport\n\t\tthis.viewport({ width: width, height: height, scale: 1.0, scalable: \"no\" });\n\n\t\t// TODO: inline-block needs more testing\n\t\t// Fixes Safari column cut offs, but causes RTL issues\n\t\t// this.css(\"display\", \"inline-block\");\n\n\t\tthis.css(\"overflow-y\", \"hidden\");\n\t\tthis.css(\"margin\", \"0\", true);\n\n\t\tif (axis === \"vertical\") {\n\t\t\tthis.css(\"padding-top\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(\"padding-bottom\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(\"padding-left\", \"20px\");\n\t\t\tthis.css(\"padding-right\", \"20px\");\n\t\t\tthis.css(COLUMN_AXIS, \"vertical\");\n\t\t} else {\n\t\t\tthis.css(\"padding-top\", \"20px\");\n\t\t\tthis.css(\"padding-bottom\", \"20px\");\n\t\t\tthis.css(\"padding-left\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(\"padding-right\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(COLUMN_AXIS, \"horizontal\");\n\t\t}\n\n\t\tthis.css(\"box-sizing\", \"border-box\");\n\t\tthis.css(\"max-width\", \"inherit\");\n\n\t\tthis.css(COLUMN_FILL, \"auto\");\n\n\t\tthis.css(COLUMN_GAP, gap+\"px\");\n\t\tthis.css(COLUMN_WIDTH, columnWidth+\"px\");\n\n\t\t// Fix glyph clipping in WebKit\n\t\t// https://github.com/futurepress/epub.js/issues/983\n\t\tthis.css(\"-webkit-line-box-contain\", \"block glyphs replaced\");\n\t}\n\n\t/**\n\t * Scale contents from center\n\t * @param {number} scale\n\t * @param {number} offsetX\n\t * @param {number} offsetY\n\t */\n\tscaler(scale: number, offsetX?: number, offsetY?: number): void {\n\t\tconst scaleStr = \"scale(\" + scale + \")\";\n\t\tlet translateStr = \"\";\n\t\t// this.css(\"position\", \"absolute\"));\n\t\tthis.css(\"transform-origin\", \"top left\");\n\n\t\tif ((offsetX !== undefined && offsetX >= 0) || (offsetY !== undefined && offsetY >= 0)) {\n\t\t\ttranslateStr = \" translate(\" + (offsetX || 0 )+ \"px, \" + (offsetY || 0 )+ \"px )\";\n\t\t}\n\n\t\tthis.css(\"transform\", scaleStr + translateStr);\n\t}\n\n\t/**\n\t * Fit contents into a fixed width and height\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\tfit(width: number, height: number, section?: Section): void {\n\t\tconst viewport = this.viewport();\n\t\tconst viewportWidth = parseInt(viewport.width);\n\t\tconst viewportHeight = parseInt(viewport.height);\n\t\tconst widthScale = width / viewportWidth;\n\t\tconst heightScale = height / viewportHeight;\n\t\tconst scale = widthScale < heightScale ? widthScale : heightScale;\n\n\t\t// the translate does not work as intended, elements can end up unaligned\n\t\t// var offsetY = (height - (viewportHeight * scale)) / 2;\n\t\t// var offsetX = 0;\n\t\t// if (this.sectionIndex % 2 === 1) {\n\t\t// \toffsetX = width - (viewportWidth * scale);\n\t\t// }\n\n\t\tthis.layoutStyle(\"paginated\");\n\n\t\t// scale needs width and height to be set\n\t\tthis.width(viewportWidth);\n\t\tthis.height(viewportHeight);\n\t\tthis.overflow(\"hidden\");\n\n\t\t// Scale to the correct size\n\t\tthis.scaler(scale, 0, 0);\n\t\t// this.scaler(scale, offsetX > 0 ? offsetX : 0, offsetY);\n\n\t\t// background images are not scaled by transform\n\t\tthis.css(\"background-size\", viewportWidth * scale + \"px \" + viewportHeight * scale + \"px\");\n\n\t\tthis.css(\"background-color\", \"transparent\");\n\t\tif (section && section.properties.includes(\"page-spread-left\")) {\n\t\t\t// set margin since scale is weird\n\t\t\tconst marginLeft = width - (viewportWidth * scale);\n\t\t\tthis.css(\"margin-left\", marginLeft + \"px\");\n\t\t}\n\t}\n\n\t/**\n\t * Set the direction of the text\n\t * @param {string} [dir=\"ltr\"] \"rtl\" | \"ltr\"\n\t */\n\tdirection(dir: string): void {\n\t\tif (this.documentElement) {\n\t\t\tthis.documentElement.style[\"direction\"] = dir;\n\t\t}\n\t}\n\n\tmapPage(cfiBase: string, layout: LayoutProps, start: number, end: number, dev?: boolean): EpubCFIPair | undefined {\n\t\tconst mapping = new Mapping(layout, undefined, undefined, dev);\n\n\t\treturn mapping.page(this, cfiBase, start, end);\n\t}\n\n\t/**\n\t * Emit event when link in content is clicked\n\t * @private\n\t */\n\tlinksHandler(): void {\n\t\treplaceLinks(this.content, (href) => {\n\t\t\tthis.emit(EVENTS.CONTENTS.LINK_CLICKED, href);\n\t\t});\n\t}\n\n\t/**\n\t * Set the writingMode of the text\n\t * @param {string} [mode=\"horizontal-tb\"] \"horizontal-tb\" | \"vertical-rl\" | \"vertical-lr\"\n\t */\n\twritingMode(mode?: string): string {\n\t\tconst WRITING_MODE = prefixed(\"writing-mode\");\n\n\t\tif (mode && this.documentElement) {\n\t\t\t(this.documentElement.style as Record<string, any>)[WRITING_MODE] = mode;\n\t\t}\n\n\t\treturn (this.window.getComputedStyle(this.documentElement) as Record<string, any>)[WRITING_MODE] || \"\";\n\t}\n\n\t/**\n\t * Set the layoutStyle of the content\n\t * @param {string} [style=\"paginated\"] \"scrolling\" | \"paginated\"\n\t * @private\n\t */\n\tlayoutStyle(style?: string): string {\n\n\t\tif (style) {\n\t\t\tthis._layoutStyle = style;\n\t\t\t(navigator as any).epubReadingSystem.layoutStyle = this._layoutStyle;\n\t\t}\n\n\t\treturn this._layoutStyle || \"paginated\";\n\t}\n\n\t/**\n\t * Add the epubReadingSystem object to the navigator\n\t * @param {string} name\n\t * @param {string} version\n\t * @private\n\t */\n\tepubReadingSystem(name: string, version: string): void {\n\t\t(navigator as any).epubReadingSystem = {\n\t\t\tname: name,\n\t\t\tversion: version,\n\t\t\tlayoutStyle: this.layoutStyle(),\n\t\t\thasFeature: function (feature: string) {\n\t\t\t\tswitch (feature) {\n\t\t\t\t\tcase \"dom-manipulation\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"layout-changes\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"touch-events\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"mouse-events\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"keyboard-events\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"spine-scripting\":\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn (navigator as any).epubReadingSystem;\n\t}\n\n\tdestroy(): void {\n\t\t// this.document.removeEventListener('transitionend', this._resizeCheck);\n\n\t\tthis.removeListeners();\n\n\t}\n}\n\nEventEmitter(Contents.prototype);\n\nexport default Contents;\n","/**\n * Inlined from marks-pane v1.0.9 (https://github.com/fchasen/marks)\n * SVG-based text annotation marks (highlights, underlines) for iframes.\n */\n\n// -- SVG helpers --\n\nfunction svgCreate(name: string): SVGElement {\n\treturn document.createElementNS(\"http://www.w3.org/2000/svg\", name);\n}\n\n// -- Mouse event proxying --\n\nfunction proxyMouse(target: HTMLElement | HTMLIFrameElement, tracked: Mark[]): void {\n\tfunction dispatch(e: any): void {\n\t\tfor (let i = tracked.length - 1; i >= 0; i--) {\n\t\t\tconst t = tracked[i];\n\t\t\tlet x = e.clientX;\n\t\t\tlet y = e.clientY;\n\n\t\t\tif (e.touches && e.touches.length) {\n\t\t\t\tx = e.touches[0].clientX;\n\t\t\t\ty = e.touches[0].clientY;\n\t\t\t}\n\n\t\t\tif (!hitTest(t, target, x, y)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt.dispatchEvent(cloneEvent(e));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet eventTarget;\n\tif (target.nodeName === \"iframe\" || target.nodeName === \"IFRAME\") {\n\t\ttry {\n\t\t\teventTarget = (target as HTMLIFrameElement).contentDocument;\n\t\t} catch (_err) {\n\t\t\teventTarget = target;\n\t\t}\n\t} else {\n\t\teventTarget = target;\n\t}\n\n\tfor (const ev of [\"mouseup\", \"mousedown\", \"click\", \"touchstart\"]) {\n\t\teventTarget!.addEventListener(ev, (e) => dispatch(e), false);\n\t}\n}\n\nfunction cloneEvent(e: any): MouseEvent {\n\tconst opts = Object.assign({}, e, { bubbles: false });\n\ttry {\n\t\treturn new MouseEvent(e.type, opts);\n\t} catch (_err) {\n\t\tconst copy = document.createEvent(\"MouseEvents\");\n\t\tcopy.initMouseEvent(e.type, false, opts.cancelable, opts.view,\n\t\t\topts.detail, opts.screenX, opts.screenY,\n\t\t\topts.clientX, opts.clientY, opts.ctrlKey,\n\t\t\topts.altKey, opts.shiftKey, opts.metaKey,\n\t\t\topts.button, opts.relatedTarget);\n\t\treturn copy;\n\t}\n}\n\nfunction hitTest(item: Mark, target: HTMLElement | HTMLIFrameElement, x: number, y: number): boolean {\n\tconst offset = target.getBoundingClientRect();\n\n\tfunction rectContains(r: DOMRect, x: number, y: number): boolean {\n\t\tconst top = r.top - offset.top;\n\t\tconst left = r.left - offset.left;\n\t\tconst bottom = top + r.height;\n\t\tconst right = left + r.width;\n\t\treturn (top <= y && left <= x && bottom > y && right > x);\n\t}\n\n\tconst rect = item.getBoundingClientRect();\n\tif (!rectContains(rect, x, y)) {\n\t\treturn false;\n\t}\n\n\tconst rects = item.getClientRects();\n\tfor (let i = 0, len = rects.length; i < len; i++) {\n\t\tif (rectContains(rects[i], x, y)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n// -- Geometry helpers --\n\nfunction coords(el: Element, container: Element): { top: number; left: number; height: number; width: number } {\n\tconst offset = container.getBoundingClientRect();\n\tconst rect = el.getBoundingClientRect();\n\n\treturn {\n\t\ttop: rect.top - offset.top,\n\t\tleft: rect.left - offset.left,\n\t\theight: el.scrollHeight,\n\t\twidth: el.scrollWidth\n\t};\n}\n\nfunction setCoords(el: any, c: { top: number; left: number; height: number; width: number }): void {\n\tel.style.setProperty(\"top\", `${c.top}px`, \"important\");\n\tel.style.setProperty(\"left\", `${c.left}px`, \"important\");\n\tel.style.setProperty(\"height\", `${c.height}px`, \"important\");\n\tel.style.setProperty(\"width\", `${c.width}px`, \"important\");\n}\n\nfunction containsRect(rect1: DOMRect, rect2: DOMRect): boolean {\n\treturn (\n\t\t(rect2.right <= rect1.right) &&\n\t\t(rect2.left >= rect1.left) &&\n\t\t(rect2.top >= rect1.top) &&\n\t\t(rect2.bottom <= rect1.bottom)\n\t);\n}\n\n// -- Classes --\n\nexport class Pane {\n\ttarget: HTMLElement | HTMLIFrameElement;\n\telement: SVGElement;\n\tmarks: Mark[];\n\tcontainer: HTMLElement;\n\n\tconstructor(target: HTMLElement | HTMLIFrameElement, container: HTMLElement = document.body) {\n\t\tthis.target = target;\n\t\tthis.element = svgCreate(\"svg\");\n\t\tthis.marks = [];\n\n\t\tthis.element.style.position = \"absolute\";\n\t\tthis.element.setAttribute(\"pointer-events\", \"none\");\n\n\t\tproxyMouse(this.target, this.marks);\n\n\t\tthis.container = container;\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis.render();\n\t}\n\n\taddMark(mark: Mark): Mark {\n\t\tconst g = svgCreate(\"g\");\n\t\tthis.element.appendChild(g);\n\t\tmark.bind(g, this.container);\n\n\t\tthis.marks.push(mark);\n\n\t\tmark.render();\n\t\treturn mark;\n\t}\n\n\tremoveMark(mark: Mark): void {\n\t\tconst idx = this.marks.indexOf(mark);\n\t\tif (idx === -1) {\n\t\t\treturn;\n\t\t}\n\t\tconst el = mark.unbind();\n\t\tthis.element.removeChild(el!);\n\t\tthis.marks.splice(idx, 1);\n\t}\n\n\trender(): void {\n\t\tsetCoords(this.element, coords(this.target, this.container));\n\t\tfor (const m of this.marks) {\n\t\t\tm.render();\n\t\t}\n\t}\n}\n\nexport class Mark {\n\telement: SVGElement | null;\n\tcontainer: HTMLElement;\n\trange: Range;\n\n\tconstructor() {\n\t\tthis.element = null;\n\t}\n\n\tbind(element: SVGElement, container: HTMLElement): void {\n\t\tthis.element = element;\n\t\tthis.container = container;\n\t}\n\n\tunbind(): SVGElement | null {\n\t\tconst el = this.element;\n\t\tthis.element = null;\n\t\treturn el;\n\t}\n\n\trender(): void {}\n\n\tdispatchEvent(e: Event): void {\n\t\tif (!this.element) return;\n\t\tthis.element.dispatchEvent(e);\n\t}\n\n\tgetBoundingClientRect(): DOMRect {\n\t\treturn this.element!.getBoundingClientRect();\n\t}\n\n\tgetClientRects(): DOMRect[] {\n\t\tconst rects: DOMRect[] = [];\n\t\tlet el = this.element!.firstChild as any;\n\t\twhile (el) {\n\t\t\trects.push(el.getBoundingClientRect());\n\t\t\tel = el.nextSibling;\n\t\t}\n\t\treturn rects;\n\t}\n\n\tfilteredRanges(): DOMRect[] {\n\t\tconst rects = Array.from(this.range.getClientRects());\n\n\t\treturn rects.filter((box) => {\n\t\t\tfor (let i = 0; i < rects.length; i++) {\n\t\t\t\tif (rects[i] === box) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (containsRect(rects[i], box)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t}\n}\n\nexport class Highlight extends Mark {\n\trange: Range;\n\tclassName: string;\n\tdata: Record<string, string>;\n\tattributes: Record<string, string>;\n\n\tconstructor(range: Range, className: string, data?: Record<string, string>, attributes?: Record<string, string>) {\n\t\tsuper();\n\t\tthis.range = range;\n\t\tthis.className = className;\n\t\tthis.data = data || {};\n\t\tthis.attributes = attributes || {};\n\t}\n\n\tbind(element: SVGElement, container: HTMLElement): void {\n\t\tsuper.bind(element, container);\n\n\t\tfor (const attr in this.data) {\n\t\t\tif (this.data.hasOwnProperty(attr)) {\n\t\t\t\tthis.element!.dataset[attr] = this.data[attr];\n\t\t\t}\n\t\t}\n\n\t\tfor (const attr in this.attributes) {\n\t\t\tif (this.attributes.hasOwnProperty(attr)) {\n\t\t\t\tthis.element!.setAttribute(attr, this.attributes[attr]);\n\t\t\t}\n\t\t}\n\n\t\tif (this.className) {\n\t\t\tthis.element!.classList.add(this.className);\n\t\t}\n\t}\n\n\trender(): void {\n\t\twhile (this.element!.firstChild) {\n\t\t\tthis.element!.removeChild(this.element!.firstChild);\n\t\t}\n\n\t\tconst docFrag = this.element!.ownerDocument!.createDocumentFragment();\n\t\tconst filtered = this.filteredRanges();\n\t\tconst offset = this.element!.getBoundingClientRect();\n\t\tconst container = this.container.getBoundingClientRect();\n\n\t\tfor (let i = 0, len = filtered.length; i < len; i++) {\n\t\t\tconst r = filtered[i];\n\t\t\tconst el = svgCreate(\"rect\");\n\t\t\tel.setAttribute(\"x\", (r.left - offset.left + container.left) as any);\n\t\t\tel.setAttribute(\"y\", (r.top - offset.top + container.top) as any);\n\t\t\tel.setAttribute(\"height\", r.height as any);\n\t\t\tel.setAttribute(\"width\", r.width as any);\n\t\t\tdocFrag.appendChild(el);\n\t\t}\n\n\t\tthis.element!.appendChild(docFrag);\n\t}\n}\n\nexport class Underline extends Highlight {\n\tconstructor(range: Range, className: string, data?: Record<string, string>, attributes?: Record<string, string>) {\n\t\tsuper(range, className, data, attributes);\n\t}\n\n\trender(): void {\n\t\twhile (this.element!.firstChild) {\n\t\t\tthis.element!.removeChild(this.element!.firstChild);\n\t\t}\n\n\t\tconst docFrag = this.element!.ownerDocument!.createDocumentFragment();\n\t\tconst filtered = this.filteredRanges();\n\t\tconst offset = this.element!.getBoundingClientRect();\n\t\tconst container = this.container.getBoundingClientRect();\n\n\t\tfor (let i = 0, len = filtered.length; i < len; i++) {\n\t\t\tconst r = filtered[i];\n\n\t\t\tconst rect = svgCreate(\"rect\");\n\t\t\trect.setAttribute(\"x\", (r.left - offset.left + container.left) as any);\n\t\t\trect.setAttribute(\"y\", (r.top - offset.top + container.top) as any);\n\t\t\trect.setAttribute(\"height\", r.height as any);\n\t\t\trect.setAttribute(\"width\", r.width as any);\n\t\t\trect.setAttribute(\"fill\", \"none\");\n\n\t\t\tconst line = svgCreate(\"line\");\n\t\t\tline.setAttribute(\"x1\", (r.left - offset.left + container.left) as any);\n\t\t\tline.setAttribute(\"x2\", (r.left - offset.left + container.left + r.width) as any);\n\t\t\tline.setAttribute(\"y1\", (r.top - offset.top + container.top + r.height - 1) as any);\n\t\t\tline.setAttribute(\"y2\", (r.top - offset.top + container.top + r.height - 1) as any);\n\n\t\t\tline.setAttribute(\"stroke-width\", 1 as any);\n\t\t\tline.setAttribute(\"stroke\", \"black\");\n\t\t\tline.setAttribute(\"stroke-linecap\", \"square\");\n\n\t\t\tdocFrag.appendChild(rect);\n\t\t\tdocFrag.appendChild(line);\n\t\t}\n\n\t\tthis.element!.appendChild(docFrag);\n\t}\n}\n","import EventEmitter from \"../../utils/event-emitter\";\nimport {extend, borders, uuid, isNumber, bounds, defer, createBlobUrl, revokeBlobUrl} from \"../../utils/core\";\nimport EpubCFI from \"../../epubcfi\";\nimport Contents from \"../../contents\";\nimport { EVENTS } from \"../../utils/constants\";\nimport { Pane, Highlight, Underline, Mark } from \"../../marks-pane\";\nimport type { IEventEmitter, ViewSettings, ReframeBounds, RequestFunction } from \"../../types\";\nimport type Section from \"../../section\";\nimport type Layout from \"../../layout\";\n\nclass IframeView implements IEventEmitter {\n\tsettings: ViewSettings;\n\tid: string;\n\tsection: Section;\n\tindex: number;\n\telement: HTMLElement;\n\tadded: boolean;\n\tdisplayed: boolean;\n\trendered: boolean;\n\tfixedWidth: number;\n\tfixedHeight: number;\n\tepubcfi: EpubCFI;\n\tlayout: Layout;\n\tpane: Pane | undefined;\n\thighlights: Record<string, { mark: Mark; element: SVGElement | null; listeners: (Function | undefined)[] }>;\n\tunderlines: Record<string, { mark: Mark; element: SVGElement | null; listeners: (Function | undefined)[] }>;\n\tmarks: Record<string, { element: HTMLAnchorElement; range: Range; listeners: (Function | undefined)[] }>;\n\tiframe: HTMLIFrameElement | undefined;\n\tresizing: boolean;\n\t_width: number;\n\t_height: number;\n\t_textWidth: number;\n\t_textHeight: number;\n\t_contentWidth: number;\n\t_contentHeight: number;\n\t_needsReframe: boolean;\n\t_expanding: boolean;\n\telementBounds: { width: number; height: number };\n\tsupportsSrcdoc: boolean;\n\tsectionRender: Promise<string>;\n\tlockedWidth: number;\n\tlockedHeight: number;\n\tprevBounds: ReframeBounds | undefined;\n\tblobUrl: string;\n\tdocument: Document;\n\twindow: Window;\n\tcontents: Contents | undefined;\n\trendering: boolean;\n\twritingMode: string;\n\tstopExpanding: boolean;\n\taxis: string;\n\n\tdeclare on: IEventEmitter[\"on\"];\n\tdeclare off: IEventEmitter[\"off\"];\n\tdeclare emit: IEventEmitter[\"emit\"];\n\n\tconstructor(section: Section, options?: ViewSettings) {\n\t\tthis.settings = extend({\n\t\t\tignoreClass : \"\",\n\t\t\taxis: undefined, //options.layout && options.layout.props.flow === \"scrolled\" ? \"vertical\" : \"horizontal\",\n\t\t\tdirection: undefined,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tlayout: undefined,\n\t\t\tglobalLayoutProperties: {},\n\t\t\tmethod: undefined,\n\t\t\tforceRight: false,\n\t\t\tallowScriptedContent: false,\n\t\t\tallowPopups: false\n\t\t}, options || {});\n\n\t\tthis.id = \"epubjs-view-\" + uuid();\n\t\tthis.section = section;\n\t\tthis.index = section.index;\n\n\t\tthis.element = this.container(this.settings.axis);\n\n\t\tthis.added = false;\n\t\tthis.displayed = false;\n\t\tthis.rendered = false;\n\n\t\t// this.width = this.settings.width;\n\t\t// this.height = this.settings.height;\n\n\t\tthis.fixedWidth = 0;\n\t\tthis.fixedHeight = 0;\n\n\t\t// Blank Cfi for Parsing\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.layout = this.settings.layout as unknown as Layout;\n\t\t// Dom events to listen for\n\t\t// this.listenedEvents = [\"keydown\", \"keyup\", \"keypressed\", \"mouseup\", \"mousedown\", \"click\", \"touchend\", \"touchstart\"];\n\n\t\tthis.pane = undefined;\n\t\tthis.highlights = {};\n\t\tthis.underlines = {};\n\t\tthis.marks = {};\n\n\t}\n\n\tcontainer(axis?: string): HTMLElement {\n\t\tconst element = document.createElement(\"div\");\n\n\t\telement.classList.add(\"epub-view\");\n\n\t\t// this.element.style.minHeight = \"100px\";\n\t\telement.style.height = \"0px\";\n\t\telement.style.width = \"0px\";\n\t\telement.style.overflow = \"hidden\";\n\t\telement.style.position = \"relative\";\n\t\telement.style.display = \"block\";\n\n\t\tif(axis && axis == \"horizontal\"){\n\t\t\telement.style.flex = \"none\";\n\t\t} else {\n\t\t\telement.style.flex = \"initial\";\n\t\t}\n\n\t\treturn element;\n\t}\n\n\tcreate(): HTMLIFrameElement {\n\n\t\tif(this.iframe) {\n\t\t\treturn this.iframe;\n\t\t}\n\n\t\tif(!this.element) {\n\t\t\tthis.element = this.container();\n\t\t}\n\n\t\tthis.iframe = document.createElement(\"iframe\");\n\t\tthis.iframe.id = this.id;\n\t\tthis.iframe.scrolling = \"no\"; // Might need to be removed: breaks ios width calculations\n\t\tthis.iframe.style.overflow = \"hidden\";\n\t\t(this.iframe as any).seamless = \"seamless\";\n\t\t// Back up if seamless isn't supported\n\t\tthis.iframe.style.border = \"none\";\n\n\t\t// sandbox\n\t\tthis.iframe.sandbox = \"allow-same-origin\";\n\t\tif (this.settings.allowScriptedContent) {\n\t\t\tthis.iframe.sandbox += \" allow-scripts\";\n\t\t}\n\t\tif (this.settings.allowPopups) {\n\t\t\tthis.iframe.sandbox += \" allow-popups\";\n\t\t}\n\n\t\tthis.iframe.setAttribute(\"enable-annotation\", \"true\");\n\n\t\tthis.resizing = true;\n\n\t\t// this.iframe.style.display = \"none\";\n\t\tthis.element.style.visibility = \"hidden\";\n\t\tthis.iframe.style.visibility = \"hidden\";\n\n\t\tthis.iframe.style.width = \"0\";\n\t\tthis.iframe.style.height = \"0\";\n\t\tthis._width = 0;\n\t\tthis._height = 0;\n\n\t\tthis.element.setAttribute(\"ref\", String(this.index));\n\n\t\tthis.added = true;\n\n\t\tthis.elementBounds = bounds(this.element);\n\n\t\t// if(width || height){\n\t\t// this.resize(width, height);\n\t\t// } else if(this.width && this.height){\n\t\t// this.resize(this.width, this.height);\n\t\t// } else {\n\t\t// this.iframeBounds = bounds(this.iframe);\n\t\t// }\n\n\n\t\tif((\"srcdoc\" in this.iframe)) {\n\t\t\tthis.supportsSrcdoc = true;\n\t\t} else {\n\t\t\tthis.supportsSrcdoc = false;\n\t\t}\n\n\t\tif (!this.settings.method) {\n\t\t\tthis.settings.method = this.supportsSrcdoc ? \"srcdoc\" : \"write\";\n\t\t}\n\n\t\treturn this.iframe;\n\t}\n\n\trender(request: RequestFunction, _show?: boolean): Promise<void> {\n\n\t\t// view.onLayout = this.layout.format.bind(this.layout);\n\t\tthis.create();\n\n\t\t// Fit to size of the container, apply padding\n\t\tthis.size();\n\n\t\tif(!this.sectionRender) {\n\t\t\tthis.sectionRender = this.section.render(request);\n\t\t}\n\n\t\t// Render Chain\n\t\treturn this.sectionRender\n\t\t\t.then(function(contents: string){\n\t\t\t\treturn this.load(contents);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\n\t\t\t\t// find and report the writingMode axis\n\t\t\t\tconst writingMode = this.contents.writingMode();\n\n\t\t\t\t// Set the axis based on the flow and writing mode\n\t\t\t\tlet axis;\n\t\t\t\tif (this.settings.flow === \"scrolled\") {\n\t\t\t\t\taxis = (writingMode.indexOf(\"vertical\") === 0) ? \"horizontal\" : \"vertical\";\n\t\t\t\t} else {\n\t\t\t\t\taxis = (writingMode.indexOf(\"vertical\") === 0) ? \"vertical\" : \"horizontal\";\n\t\t\t\t}\n\n\t\t\t\tif (writingMode.indexOf(\"vertical\") === 0 && this.settings.flow === \"paginated\") {\n\t\t\t\t\tthis.layout.delta = this.layout.height;\n\t\t\t\t}\n\n\t\t\t\tthis.setAxis(axis);\n\t\t\t\tthis.emit(EVENTS.VIEWS.AXIS, axis);\n\n\t\t\t\tthis.setWritingMode(writingMode);\n\t\t\t\tthis.emit(EVENTS.VIEWS.WRITING_MODE, writingMode);\n\n\n\t\t\t\t// apply the layout function to the contents\n\t\t\t\tthis.layout.format(this.contents, this.section, this.axis);\n\n\t\t\t\t// Listen for events that require an expansion of the iframe\n\t\t\t\tthis.addListeners();\n\n\t\t\t\treturn new Promise<void>((resolve, _reject) => {\n\t\t\t\t\t// Expand the iframe to the full size of the content\n\t\t\t\t\tthis.expand();\n\n\t\t\t\t\tif (this.settings.forceRight) {\n\t\t\t\t\t\tthis.element.style.marginLeft = this.width() + \"px\";\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t}.bind(this), function(e: Error){\n\t\t\t\tthis.emit(EVENTS.VIEWS.LOAD_ERROR, e);\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\treject(e);\n\t\t\t\t});\n\t\t\t}.bind(this))\n\t\t\t.then(function() {\n\t\t\t\tthis.emit(EVENTS.VIEWS.RENDERED, this.section);\n\t\t\t}.bind(this));\n\n\t}\n\n\treset (): void {\n\t\tif (this.iframe) {\n\t\t\tthis.iframe.style.width = \"0\";\n\t\t\tthis.iframe.style.height = \"0\";\n\t\t\tthis._width = 0;\n\t\t\tthis._height = 0;\n\t\t\t(this as any)._textWidth = undefined;\n\t\t\t(this as any)._contentWidth = undefined;\n\t\t\t(this as any)._textHeight = undefined;\n\t\t\t(this as any)._contentHeight = undefined;\n\t\t}\n\t\tthis._needsReframe = true;\n\t}\n\n\t// Determine locks base on settings\n\tsize(_width?: number, _height?: number): void {\n\t\tconst width = _width || this.settings.width!;\n\t\tconst height = _height || this.settings.height!;\n\n\t\tif(this.layout.name === \"pre-paginated\") {\n\t\t\tthis.lock(\"both\", width, height);\n\t\t} else if(this.settings.axis === \"horizontal\") {\n\t\t\tthis.lock(\"height\", width, height);\n\t\t} else {\n\t\t\tthis.lock(\"width\", width, height);\n\t\t}\n\n\t\tthis.settings.width = width;\n\t\tthis.settings.height = height;\n\t}\n\n\t// Lock an axis to element dimensions, taking borders into account\n\tlock(what: string, width: number, height: number): void {\n\t\tconst elBorders = borders(this.element);\n\t\tlet iframeBorders;\n\n\t\tif(this.iframe) {\n\t\t\tiframeBorders = borders(this.iframe);\n\t\t} else {\n\t\t\tiframeBorders = {width: 0, height: 0};\n\t\t}\n\n\t\tif(what == \"width\" && isNumber(width)){\n\t\t\tthis.lockedWidth = width - elBorders.width - iframeBorders.width;\n\t\t\t// this.resize(this.lockedWidth, width); // width keeps ratio correct\n\t\t}\n\n\t\tif(what == \"height\" && isNumber(height)){\n\t\t\tthis.lockedHeight = height - elBorders.height - iframeBorders.height;\n\t\t\t// this.resize(width, this.lockedHeight);\n\t\t}\n\n\t\tif(what === \"both\" &&\n\t\t\t isNumber(width) &&\n\t\t\t isNumber(height)){\n\n\t\t\tthis.lockedWidth = width - elBorders.width - iframeBorders.width;\n\t\t\tthis.lockedHeight = height - elBorders.height - iframeBorders.height;\n\t\t\t// this.resize(this.lockedWidth, this.lockedHeight);\n\t\t}\n\n\t\tif(this.displayed && this.iframe) {\n\n\t\t\t// this.contents.layout();\n\t\t\tthis.expand();\n\t\t}\n\n\n\n\t}\n\n\t// Resize a single axis based on content dimensions\n\texpand(_force?: boolean): void {\n\t\tlet width = this.lockedWidth;\n\t\tlet height = this.lockedHeight;\n\t\tlet columns;\n\n\t\tlet _textWidth, _textHeight;\n\n\t\tif(!this.iframe || this._expanding) return;\n\n\t\tthis._expanding = true;\n\n\t\tif(this.layout.name === \"pre-paginated\") {\n\t\t\twidth = this.layout.columnWidth;\n\t\t\theight = this.layout.height;\n\t\t}\n\t\t// Expand Horizontally\n\t\telse if(this.settings.axis === \"horizontal\") {\n\t\t\t// Get the width of the text\n\t\t\twidth = this.contents!.textWidth();\n\n\t\t\tif (width % this.layout.pageWidth > 0) {\n\t\t\t\twidth = Math.ceil(width / this.layout.pageWidth) * this.layout.pageWidth;\n\t\t\t}\n\n\t\t\tif (this.settings.forceEvenPages) {\n\t\t\t\tcolumns = (width / this.layout.pageWidth);\n\t\t\t\tif ( this.layout.divisor > 1 &&\n\t\t\t\t\t\t this.layout.name === \"reflowable\" &&\n\t\t\t\t\t\t(columns % 2 > 0)) {\n\t\t\t\t\t// add a blank page\n\t\t\t\t\twidth += this.layout.pageWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} // Expand Vertically\n\t\telse if(this.settings.axis === \"vertical\") {\n\t\t\theight = this.contents!.textHeight();\n\t\t\tif (this.settings.flow === \"paginated\" &&\n\t\t\t\theight % this.layout.height > 0) {\n\t\t\t\theight = Math.ceil(height / this.layout.height) * this.layout.height;\n\t\t\t}\n\t\t}\n\n\t\t// Only Resize if dimensions have changed or\n\t\t// if Frame is still hidden, so needs reframing\n\t\tif(this._needsReframe || width != this._width || height != this._height){\n\t\t\tthis.reframe(width, height);\n\t\t}\n\n\t\tthis._expanding = false;\n\t}\n\n\treframe(width: number, height: number): void {\n\t\tif(isNumber(width)){\n\t\t\tthis.element.style.width = width + \"px\";\n\t\t\tthis.iframe!.style.width = width + \"px\";\n\t\t\tthis._width = width;\n\t\t}\n\n\t\tif(isNumber(height)){\n\t\t\tthis.element.style.height = height + \"px\";\n\t\t\tthis.iframe!.style.height = height + \"px\";\n\t\t\tthis._height = height;\n\t\t}\n\n\t\tconst widthDelta = this.prevBounds ? width - this.prevBounds.width : width;\n\t\tconst heightDelta = this.prevBounds ? height - this.prevBounds.height : height;\n\n\t\tconst size = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthDelta: widthDelta,\n\t\t\theightDelta: heightDelta,\n\t\t};\n\n\t\tthis.pane && this.pane.render();\n\n\t\trequestAnimationFrame(() => {\n\t\t\tlet mark;\n\t\t\tfor (const m in this.marks) {\n\t\t\t\tif (this.marks.hasOwnProperty(m)) {\n\t\t\t\t\tmark = this.marks[m];\n\t\t\t\t\tthis.placeMark(mark.element, mark.range);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.onResize(this, size);\n\n\t\tthis.emit(EVENTS.VIEWS.RESIZED, size);\n\n\t\tthis.prevBounds = size;\n\n\t\tthis.elementBounds = bounds(this.element);\n\n\t}\n\n\n\tload(contents: string): Promise<Contents> {\n\t\tconst loading = new defer();\n\t\tconst loaded = loading.promise;\n\n\t\tif(!this.iframe) {\n\t\t\tloading.reject(new Error(\"No Iframe Available\"));\n\t\t\treturn loaded;\n\t\t}\n\n\t\tthis.iframe.onload = function(event: Event) {\n\n\t\t\tthis.onLoad(event, loading);\n\n\t\t}.bind(this);\n\n\t\tif (this.settings.method === \"blobUrl\") {\n\t\t\tthis.blobUrl = createBlobUrl(contents, \"application/xhtml+xml\");\n\t\t\tthis.iframe.src = this.blobUrl;\n\t\t\tthis.element.appendChild(this.iframe);\n\t\t} else if(this.settings.method === \"srcdoc\"){\n\t\t\tthis.iframe.srcdoc = contents;\n\t\t\tthis.element.appendChild(this.iframe);\n\t\t} else {\n\n\t\t\tthis.element.appendChild(this.iframe);\n\n\t\t\tthis.document = this.iframe.contentDocument!;\n\n\t\t\tif(!this.document) {\n\t\t\t\tloading.reject(new Error(\"No Document Available\"));\n\t\t\t\treturn loaded;\n\t\t\t}\n\n\t\t\tthis.document.open();\n\t\t\t// For Cordova windows platform\n\t\t\tif((window as any).MSApp && (window as any).MSApp.execUnsafeLocalFunction) {\n\t\t\t\tconst outerThis = this;\n\t\t\t\t(window as any).MSApp.execUnsafeLocalFunction(function () {\n\t\t\t\t\touterThis.document.write(contents);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.document.write(contents);\n\t\t\t}\n\t\t\tthis.document.close();\n\n\t\t}\n\n\t\treturn loaded;\n\t}\n\n\tonLoad(event: Event, promise: { resolve: (value?: any) => void; reject: (reason?: any) => void }): void {\n\n\t\tthis.window = this.iframe!.contentWindow!;\n\t\tthis.document = this.iframe!.contentDocument!;\n\n\t\tthis.contents = new Contents(this.document, this.document.body, this.section.cfiBase, this.section.index);\n\n\t\tthis.rendering = false;\n\n\t\tlet link = this.document.querySelector(\"link[rel='canonical']\");\n\t\tif (link) {\n\t\t\tlink.setAttribute(\"href\", this.section.canonical);\n\t\t} else {\n\t\t\tlink = this.document.createElement(\"link\");\n\t\t\tlink.setAttribute(\"rel\", \"canonical\");\n\t\t\tlink.setAttribute(\"href\", this.section.canonical);\n\t\t\tthis.document.querySelector(\"head\")!.appendChild(link);\n\t\t}\n\n\t\tthis.contents.on(EVENTS.CONTENTS.EXPAND, () => {\n\t\t\tif(this.displayed && this.iframe) {\n\t\t\t\tthis.expand();\n\t\t\t\tif (this.contents) {\n\t\t\t\t\tthis.layout.format(this.contents);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.contents.on(EVENTS.CONTENTS.RESIZE, (_e: Event) => {\n\t\t\tif(this.displayed && this.iframe) {\n\t\t\t\tthis.expand();\n\t\t\t\tif (this.contents) {\n\t\t\t\t\tthis.layout.format(this.contents);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tpromise.resolve(this.contents);\n\t}\n\n\tsetLayout(layout: Layout): void {\n\t\tthis.layout = layout;\n\n\t\tif (this.contents) {\n\t\t\tthis.layout.format(this.contents);\n\t\t\tthis.expand();\n\t\t}\n\t}\n\n\tsetAxis(axis: string): void {\n\n\t\tthis.settings.axis = axis;\n\n\t\tif(axis == \"horizontal\"){\n\t\t\tthis.element.style.flex = \"none\";\n\t\t} else {\n\t\t\tthis.element.style.flex = \"initial\";\n\t\t}\n\n\t\tthis.size();\n\n\t}\n\n\tsetWritingMode(mode: string): void {\n\t\t// this.element.style.writingMode = writingMode;\n\t\tthis.writingMode = mode;\n\t}\n\n\taddListeners(): void {\n\t\t//TODO: Add content listeners for expanding\n\t}\n\n\tremoveListeners(_layoutFunc?: Function): void {\n\t\t//TODO: remove content listeners for expanding\n\t}\n\n\tdisplay(request: RequestFunction): Promise<IframeView> {\n\t\tconst displayed = new defer();\n\n\t\tif (!this.displayed) {\n\n\t\t\tthis.render(request)\n\t\t\t\t.then(function () {\n\n\t\t\t\t\tthis.emit(EVENTS.VIEWS.DISPLAYED, this);\n\t\t\t\t\tthis.onDisplayed(this);\n\n\t\t\t\t\tthis.displayed = true;\n\t\t\t\t\tdisplayed.resolve(this);\n\n\t\t\t\t}.bind(this), function (err) {\n\t\t\t\t\tdisplayed.reject(err);\n\t\t\t\t});\n\n\t\t} else {\n\t\t\tdisplayed.resolve(this);\n\t\t}\n\n\n\t\treturn displayed.promise;\n\t}\n\n\tshow(): void {\n\n\t\tthis.element.style.visibility = \"visible\";\n\n\t\tif(this.iframe){\n\t\t\tthis.iframe.style.visibility = \"visible\";\n\n\t\t\t// Remind Safari to redraw the iframe\n\t\t\tthis.iframe.style.transform = \"translateZ(0)\";\n\t\t\tthis.iframe.offsetWidth;\n\t\t\tthis.iframe.style.transform = \"\";\n\t\t}\n\n\t\tthis.emit(EVENTS.VIEWS.SHOWN, this);\n\t}\n\n\thide(): void {\n\t\t// this.iframe.style.display = \"none\";\n\t\tthis.element.style.visibility = \"hidden\";\n\t\tthis.iframe!.style.visibility = \"hidden\";\n\n\t\tthis.stopExpanding = true;\n\t\tthis.emit(EVENTS.VIEWS.HIDDEN, this);\n\t}\n\n\toffset(): { top: number; left: number } {\n\t\treturn {\n\t\t\ttop: this.element.offsetTop,\n\t\t\tleft: this.element.offsetLeft\n\t\t}\n\t}\n\n\twidth(): number {\n\t\treturn this._width;\n\t}\n\n\theight(): number {\n\t\treturn this._height;\n\t}\n\n\tposition(): DOMRect {\n\t\treturn this.element.getBoundingClientRect();\n\t}\n\n\tlocationOf(target: string): { left: number; top: number } {\n\t\tconst _parentPos = this.iframe!.getBoundingClientRect();\n\t\tconst targetPos = this.contents!.locationOf(target, this.settings.ignoreClass);\n\n\t\treturn {\n\t\t\t\"left\": targetPos.left,\n\t\t\t\"top\": targetPos.top\n\t\t};\n\t}\n\n\tonDisplayed(_view: IframeView): void {\n\t\t// Stub, override with a custom functions\n\t}\n\n\tonResize(_view: IframeView, _e?: ReframeBounds): void {\n\t\t// Stub, override with a custom functions\n\t}\n\n\tbounds(force?: boolean): { width: number; height: number } {\n\t\tif(force || !this.elementBounds) {\n\t\t\tthis.elementBounds = bounds(this.element);\n\t\t}\n\n\t\treturn this.elementBounds;\n\t}\n\n\thighlight(cfiRange: string, data: Record<string, string> = {}, cb?: Function, className: string = \"epubjs-hl\", styles: Record<string, string> = {}): Mark | undefined {\n\t\tif (!this.contents) {\n\t\t\treturn;\n\t\t}\n\t\tconst attributes = Object.assign({\"fill\": \"yellow\", \"fill-opacity\": \"0.3\", \"mix-blend-mode\": \"multiply\"}, styles);\n\t\tconst range = this.contents.range(cfiRange);\n\n\t\tconst emitter = () => {\n\t\t\tthis.emit(EVENTS.VIEWS.MARK_CLICKED, cfiRange, data);\n\t\t};\n\n\t\tdata[\"epubcfi\"] = cfiRange;\n\n\t\tif (!this.pane) {\n\t\t\tthis.pane = new Pane(this.iframe!, this.element);\n\t\t}\n\n\t\tconst m = new Highlight(range, className, data, attributes);\n\t\tconst h = this.pane.addMark(m);\n\n\t\tthis.highlights[cfiRange] = { \"mark\": h, \"element\": h.element, \"listeners\": [emitter, cb] };\n\n\t\th.element!.setAttribute(\"ref\", className);\n\t\th.element!.addEventListener(\"click\", emitter as EventListener);\n\t\th.element!.addEventListener(\"touchstart\", emitter as EventListener);\n\n\t\tif (cb) {\n\t\t\th.element!.addEventListener(\"click\", cb as EventListener);\n\t\t\th.element!.addEventListener(\"touchstart\", cb as EventListener);\n\t\t}\n\t\treturn h;\n\t}\n\n\tunderline(cfiRange: string, data: Record<string, string> = {}, cb?: Function, className: string = \"epubjs-ul\", styles: Record<string, string> = {}): Mark | undefined {\n\t\tif (!this.contents) {\n\t\t\treturn;\n\t\t}\n\t\tconst attributes = Object.assign({\"stroke\": \"black\", \"stroke-opacity\": \"0.3\", \"mix-blend-mode\": \"multiply\"}, styles);\n\t\tconst range = this.contents.range(cfiRange);\n\t\tconst emitter = () => {\n\t\t\tthis.emit(EVENTS.VIEWS.MARK_CLICKED, cfiRange, data);\n\t\t};\n\n\t\tdata[\"epubcfi\"] = cfiRange;\n\n\t\tif (!this.pane) {\n\t\t\tthis.pane = new Pane(this.iframe!, this.element);\n\t\t}\n\n\t\tconst m = new Underline(range, className, data, attributes);\n\t\tconst h = this.pane.addMark(m);\n\n\t\tthis.underlines[cfiRange] = { \"mark\": h, \"element\": h.element, \"listeners\": [emitter, cb] };\n\n\t\th.element!.setAttribute(\"ref\", className);\n\t\th.element!.addEventListener(\"click\", emitter as EventListener);\n\t\th.element!.addEventListener(\"touchstart\", emitter as EventListener);\n\n\t\tif (cb) {\n\t\t\th.element!.addEventListener(\"click\", cb as EventListener);\n\t\t\th.element!.addEventListener(\"touchstart\", cb as EventListener);\n\t\t}\n\t\treturn h;\n\t}\n\n\tmark(cfiRange: string, data: Record<string, string> = {}, cb?: Function): any {\n\t\tif (!this.contents) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (cfiRange in this.marks) {\n\t\t\tconst item = this.marks[cfiRange];\n\t\t\treturn item;\n\t\t}\n\n\t\tlet range = this.contents.range(cfiRange);\n\t\tif (!range) {\n\t\t\treturn;\n\t\t}\n\t\tconst container = range.commonAncestorContainer;\n\t\tconst parent = (container.nodeType === 1) ? container : container.parentNode;\n\n\t\tconst emitter = (_e: Event) => {\n\t\t\tthis.emit(EVENTS.VIEWS.MARK_CLICKED, cfiRange, data);\n\t\t};\n\n\t\tif (range.collapsed && container.nodeType === 1) {\n\t\t\trange = new Range();\n\t\t\trange.selectNodeContents(container);\n\t\t} else if (range.collapsed) { // Webkit doesn't like collapsed ranges\n\t\t\trange = new Range();\n\t\t\trange.selectNodeContents(parent!);\n\t\t}\n\n\t\tconst mark = this.document.createElement(\"a\");\n\t\tmark.setAttribute(\"ref\", \"epubjs-mk\");\n\t\tmark.style.position = \"absolute\";\n\n\t\tmark.dataset[\"epubcfi\"] = cfiRange;\n\n\t\tif (data) {\n\t\t\tObject.keys(data).forEach((key) => {\n\t\t\t\tmark.dataset[key] = data[key];\n\t\t\t});\n\t\t}\n\n\t\tif (cb) {\n\t\t\tmark.addEventListener(\"click\", cb as EventListener);\n\t\t\tmark.addEventListener(\"touchstart\", cb as EventListener);\n\t\t}\n\n\t\tmark.addEventListener(\"click\", emitter as EventListener);\n\t\tmark.addEventListener(\"touchstart\", emitter as EventListener);\n\n\t\tthis.placeMark(mark, range);\n\n\t\tthis.element.appendChild(mark);\n\n\t\tthis.marks[cfiRange] = { \"element\": mark, \"range\": range, \"listeners\": [emitter, cb] };\n\n\t\treturn parent;\n\t}\n\n\tplaceMark(element: HTMLElement, range: Range): void {\n\t\tlet top, right, left;\n\n\t\tif(this.layout.name === \"pre-paginated\" ||\n\t\t\tthis.settings.axis !== \"horizontal\") {\n\t\t\tconst pos = range.getBoundingClientRect();\n\t\t\ttop = pos.top;\n\t\t\tright = pos.right;\n\t\t} else {\n\t\t\t// Element might break columns, so find the left most element\n\t\t\tconst rects = range.getClientRects();\n\n\t\t\tlet rect;\n\t\t\tfor (let i = 0; i != rects.length; i++) {\n\t\t\t\trect = rects[i];\n\t\t\t\tif (!left || rect.left < left) {\n\t\t\t\t\tleft = rect.left;\n\t\t\t\t\t// right = rect.right;\n\t\t\t\t\tright = Math.ceil(left / this.layout.props.pageWidth!) * this.layout.props.pageWidth! - (this.layout.gap / 2);\n\t\t\t\t\ttop = rect.top;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\telement.style.top = `${top}px`;\n\t\telement.style.left = `${right}px`;\n\t}\n\n\tunhighlight(cfiRange: string): void {\n\t\tif (cfiRange in this.highlights) {\n\t\t\tconst item = this.highlights[cfiRange];\n\n\t\t\tthis.pane!.removeMark(item.mark);\n\t\t\titem.listeners.forEach((l: Function | undefined) => {\n\t\t\t\tif (l) {\n\t\t\t\t\titem.element!.removeEventListener(\"click\", l as EventListener);\n\t\t\t\t\titem.element!.removeEventListener(\"touchstart\", l as EventListener);\n\t\t\t\t};\n\t\t\t});\n\t\t\tdelete this.highlights[cfiRange];\n\t\t}\n\t}\n\n\tununderline(cfiRange: string): void {\n\t\tif (cfiRange in this.underlines) {\n\t\t\tconst item = this.underlines[cfiRange];\n\t\t\tthis.pane!.removeMark(item.mark);\n\t\t\titem.listeners.forEach((l: Function | undefined) => {\n\t\t\t\tif (l) {\n\t\t\t\t\titem.element!.removeEventListener(\"click\", l as EventListener);\n\t\t\t\t\titem.element!.removeEventListener(\"touchstart\", l as EventListener);\n\t\t\t\t};\n\t\t\t});\n\t\t\tdelete this.underlines[cfiRange];\n\t\t}\n\t}\n\n\tunmark(cfiRange: string): void {\n\t\tif (cfiRange in this.marks) {\n\t\t\tconst item = this.marks[cfiRange];\n\t\t\tthis.element.removeChild(item.element);\n\t\t\titem.listeners.forEach((l: Function | undefined) => {\n\t\t\t\tif (l) {\n\t\t\t\t\titem.element.removeEventListener(\"click\", l as EventListener);\n\t\t\t\t\titem.element.removeEventListener(\"touchstart\", l as EventListener);\n\t\t\t\t};\n\t\t\t});\n\t\t\tdelete this.marks[cfiRange];\n\t\t}\n\t}\n\n\tdestroy(): void {\n\n\t\tfor (const cfiRange in this.highlights) {\n\t\t\tthis.unhighlight(cfiRange);\n\t\t}\n\n\t\tfor (const cfiRange in this.underlines) {\n\t\t\tthis.ununderline(cfiRange);\n\t\t}\n\n\t\tfor (const cfiRange in this.marks) {\n\t\t\tthis.unmark(cfiRange);\n\t\t}\n\n\t\tif (this.blobUrl) {\n\t\t\trevokeBlobUrl(this.blobUrl);\n\t\t}\n\n\t\tif(this.displayed){\n\t\t\tthis.displayed = false;\n\n\t\t\tthis.removeListeners();\n\t\t\tthis.contents!.destroy();\n\n\t\t\tthis.stopExpanding = true;\n\t\t\tthis.element.removeChild(this.iframe!);\n\n\t\t\tif (this.pane) {\n\t\t\t\tthis.pane.element.remove();\n\t\t\t\tthis.pane = undefined;\n\t\t\t}\n\n\t\t\tthis.iframe = undefined;\n\t\t\tthis.contents = undefined;\n\n\t\t\t(this as any)._textWidth = null;\n\t\t\t(this as any)._textHeight = null;\n\t\t\t(this as any)._width = null;\n\t\t\t(this as any)._height = null;\n\t\t}\n\n\t\t// this.element.style.height = \"0px\";\n\t\t// this.element.style.width = \"0px\";\n\t}\n}\n\nEventEmitter(IframeView.prototype);\n\nexport default IframeView;\n","// Detect RTL scroll type\n// Based on https://github.com/othree/jquery.rtl-scroll-type/blob/master/src/jquery.rtl-scroll.js\nexport default function scrollType(): string {\n\tlet type = \"reverse\";\n\tconst definer = createDefiner();\n\tdocument.body.appendChild(definer);\n\n\tif (definer.scrollLeft > 0) {\n\t\ttype = \"default\";\n\t} else {\n\t\tif (typeof Element !== \"undefined\" && typeof Element.prototype.scrollIntoView === \"function\") {\n\t\t\tdefiner.children[0].children[1].scrollIntoView();\n\t\t\tif (definer.scrollLeft < 0) {\n\t\t\t\ttype = \"negative\";\n\t\t\t}\n\t\t} else {\n\t\t\tdefiner.scrollLeft = 1;\n\t\t\tif (definer.scrollLeft === 0) {\n\t\t\t\ttype = \"negative\";\n\t\t\t}\n\t\t}\n\t}\n\n\tdocument.body.removeChild(definer);\n\treturn type;\n}\n\nexport function createDefiner(): HTMLDivElement {\n\tconst definer = document.createElement(\"div\");\n\tdefiner.dir=\"rtl\";\n\n\tdefiner.style.position = \"fixed\";\n\tdefiner.style.width = \"1px\";\n\tdefiner.style.height = \"1px\";\n\tdefiner.style.top = \"0px\";\n\tdefiner.style.left = \"0px\";\n\tdefiner.style.overflow = \"hidden\";\n\n\tconst innerDiv = document.createElement(\"div\");\n\tinnerDiv.style.width = \"2px\";\n\n\tconst spanA = document.createElement(\"span\");\n\tspanA.style.width = \"1px\";\n\tspanA.style.display = \"inline-block\";\n\n\tconst spanB = document.createElement(\"span\");\n\tspanB.style.width = \"1px\";\n\tspanB.style.display = \"inline-block\";\n\n\tinnerDiv.appendChild(spanA);\n\tinnerDiv.appendChild(spanB);\n\tdefiner.appendChild(innerDiv);\n\n\treturn definer;\n}\n","import {uuid, isNumber, isElement, windowBounds, extend} from \"../../utils/core\";\nimport type { StageOptions } from \"../../types\";\nfunction throttle(func: Function, wait: number): () => void {\n\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\tlet previous = 0;\n\treturn function() {\n\t\tconst now = Date.now();\n\t\tconst remaining = wait - (now - previous);\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timeout) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\ttimeout = null;\n\t\t\t}\n\t\t\tprevious = now;\n\t\t\tfunc.apply(this, arguments);\n\t\t} else if (!timeout) {\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\tprevious = Date.now();\n\t\t\t\ttimeout = null;\n\t\t\t\tfunc.apply(this, arguments);\n\t\t\t}, remaining);\n\t\t}\n\t};\n}\n\nclass Stage {\n\tsettings: StageOptions;\n\tid: string;\n\tcontainer: HTMLDivElement;\n\twrapper: HTMLDivElement;\n\telement: HTMLElement;\n\tresizeFunc: () => void;\n\torientationChangeFunc: (e: Event) => void;\n\tcontainerStyles: CSSStyleDeclaration;\n\tcontainerPadding: { left: number; right: number; top: number; bottom: number };\n\tsheet: CSSStyleSheet;\n\n\tconstructor(_options?: StageOptions) {\n\t\tthis.settings = _options || {};\n\t\tthis.id = \"epubjs-container-\" + uuid();\n\n\t\tthis.container = this.create(this.settings);\n\n\t\tif(this.settings.hidden) {\n\t\t\tthis.wrapper = this.wrap(this.container);\n\t\t}\n\n\t}\n\n\t/*\n\t* Creates an element to render to.\n\t* Resizes to passed width and height or to the elements size\n\t*/\n\tcreate(options: StageOptions): HTMLDivElement {\n\t\tlet height: string | number | undefined = options.height;// !== false ? options.height : \"100%\";\n\t\tlet width: string | number | undefined = options.width;// !== false ? options.width : \"100%\";\n\t\tconst overflow = options.overflow || false;\n\t\tconst axis = options.axis || \"vertical\";\n\t\tconst direction = options.direction;\n\n\t\textend(this.settings, options);\n\n\t\tif(options.height && isNumber(options.height)) {\n\t\t\theight = options.height + \"px\";\n\t\t}\n\n\t\tif(options.width && isNumber(options.width)) {\n\t\t\twidth = options.width + \"px\";\n\t\t}\n\n\t\t// Create new container element\n\t\tconst container = document.createElement(\"div\");\n\n\t\tcontainer.id = this.id;\n\t\tcontainer.classList.add(\"epub-container\");\n\n\t\t// Style Element\n\t\t// container.style.fontSize = \"0\";\n\t\tcontainer.style.wordSpacing = \"0\";\n\t\tcontainer.style.lineHeight = \"0\";\n\t\tcontainer.style.verticalAlign = \"top\";\n\t\tcontainer.style.position = \"relative\";\n\n\t\tif(axis === \"horizontal\") {\n\t\t\t// container.style.whiteSpace = \"nowrap\";\n\t\t\tcontainer.style.display = \"flex\";\n\t\t\tcontainer.style.flexDirection = \"row\";\n\t\t\tcontainer.style.flexWrap = \"nowrap\";\n\t\t}\n\n\t\tif(width){\n\t\t\tcontainer.style.width = width as string;\n\t\t}\n\n\t\tif(height){\n\t\t\tcontainer.style.height = height as string;\n\t\t}\n\n\t\tif (overflow) {\n\t\t\tif (overflow === \"scroll\" && axis === \"vertical\") {\n\t\t\t\tcontainer.style.overflowY = overflow;\n\t\t\t\tcontainer.style.overflowX = \"hidden\";\n\t\t\t} else if (overflow === \"scroll\" && axis === \"horizontal\") {\n\t\t\t\tcontainer.style.overflowY = \"hidden\";\n\t\t\t\tcontainer.style.overflowX = overflow;\n\t\t\t} else {\n\t\t\t\tcontainer.style.overflow = overflow as string;\n\t\t\t}\n\t\t}\n\n\t\tif (direction) {\n\t\t\tcontainer.dir = direction;\n\t\t\tcontainer.style.direction = direction;\n\t\t}\n\n\t\tif (direction && this.settings.fullsize) {\n\t\t\tdocument.body.style.direction = direction;\n\t\t}\n\n\t\treturn container;\n\t}\n\n\twrap(container: HTMLElement): HTMLDivElement {\n\t\tconst wrapper = document.createElement(\"div\");\n\n\t\twrapper.style.visibility = \"hidden\";\n\t\twrapper.style.overflow = \"hidden\";\n\t\twrapper.style.width = \"0\";\n\t\twrapper.style.height = \"0\";\n\n\t\twrapper.appendChild(container);\n\t\treturn wrapper;\n\t}\n\n\n\tgetElement(_element: HTMLElement | string): HTMLElement {\n\t\tlet element: HTMLElement | null = null;\n\n\t\tif(isElement(_element)) {\n\t\t\telement = _element as HTMLElement;\n\t\t} else if (typeof _element === \"string\") {\n\t\t\telement = document.getElementById(_element);\n\t\t}\n\n\t\tif(!element){\n\t\t\tthrow new Error(\"Not an Element\");\n\t\t}\n\n\t\treturn element;\n\t}\n\n\tattachTo(what: HTMLElement | string): HTMLElement | void {\n\n\t\tconst element = this.getElement(what);\n\t\tlet base;\n\n\t\tif(!element){\n\t\t\treturn;\n\t\t}\n\n\t\tif(this.settings.hidden) {\n\t\t\tbase = this.wrapper;\n\t\t} else {\n\t\t\tbase = this.container;\n\t\t}\n\n\t\telement.appendChild(base);\n\n\t\tthis.element = element;\n\n\t\treturn element;\n\n\t}\n\n\tgetContainer(): HTMLDivElement {\n\t\treturn this.container;\n\t}\n\n\tonResize(func: () => void): void {\n\t\t// Only listen to window for resize event if width and height are not fixed.\n\t\t// This applies if it is set to a percent or auto.\n\t\tif(!isNumber(this.settings.width) ||\n\t\t\t !isNumber(this.settings.height) ) {\n\t\t\tthis.resizeFunc = throttle(func, 50);\n\t\t\twindow.addEventListener(\"resize\", this.resizeFunc, false);\n\t\t}\n\n\t}\n\n\tonOrientationChange(func: (e: Event) => void): void {\n\t\tthis.orientationChangeFunc = func;\n\t\twindow.addEventListener(\"orientationchange\", this.orientationChangeFunc, false);\n\t}\n\n\tsize(width?: number | string | null, height?: number | string | null): { width: number; height: number } {\n\t\tlet bounds;\n\t\tconst _width = width || this.settings.width;\n\t\tconst _height = height || this.settings.height;\n\n\t\t// If width or height are set to false, inherit them from containing element\n\t\tif(width === null) {\n\t\t\tbounds = this.element.getBoundingClientRect();\n\n\t\t\tif(bounds.width) {\n\t\t\t\twidth = Math.floor(bounds.width);\n\t\t\t\tthis.container.style.width = width + \"px\";\n\t\t\t}\n\t\t} else {\n\t\t\tif (isNumber(width)) {\n\t\t\t\tthis.container.style.width = width + \"px\";\n\t\t\t} else if (width) {\n\t\t\t\tthis.container.style.width = width as string;\n\t\t\t}\n\t\t}\n\n\t\tif(height === null) {\n\t\t\tbounds = bounds || this.element.getBoundingClientRect();\n\n\t\t\tif(bounds.height) {\n\t\t\t\theight = bounds.height;\n\t\t\t\tthis.container.style.height = height + \"px\";\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (isNumber(height)) {\n\t\t\t\tthis.container.style.height = height + \"px\";\n\t\t\t} else if (height) {\n\t\t\t\tthis.container.style.height = height as string;\n\t\t\t}\n\t\t}\n\n\t\tif(!isNumber(width)) {\n\t\t\twidth = this.container.clientWidth;\n\t\t}\n\n\t\tif(!isNumber(height)) {\n\t\t\theight = this.container.clientHeight;\n\t\t}\n\n\t\tthis.containerStyles = window.getComputedStyle(this.container);\n\n\t\tthis.containerPadding = {\n\t\t\tleft: parseFloat(this.containerStyles.paddingLeft) || 0,\n\t\t\tright: parseFloat(this.containerStyles.paddingRight) || 0,\n\t\t\ttop: parseFloat(this.containerStyles.paddingTop) || 0,\n\t\t\tbottom: parseFloat(this.containerStyles.paddingBottom) || 0\n\t\t};\n\n\t\t// Bounds not set, get them from window\n\t\tconst _windowBounds = windowBounds();\n\t\tconst bodyStyles = window.getComputedStyle(document.body);\n\t\tconst bodyPadding = {\n\t\t\tleft: parseFloat(bodyStyles.paddingLeft) || 0,\n\t\t\tright: parseFloat(bodyStyles.paddingRight) || 0,\n\t\t\ttop: parseFloat(bodyStyles.paddingTop) || 0,\n\t\t\tbottom: parseFloat(bodyStyles.paddingBottom) || 0\n\t\t};\n\n\t\tif (!_width) {\n\t\t\twidth = _windowBounds.width -\n\t\t\t\t\t\t\t\tbodyPadding.left -\n\t\t\t\t\t\t\t\tbodyPadding.right;\n\t\t}\n\n\t\tif ((this.settings.fullsize && !_height) || !_height) {\n\t\t\theight = _windowBounds.height -\n\t\t\t\t\t\t\t\tbodyPadding.top -\n\t\t\t\t\t\t\t\tbodyPadding.bottom;\n\t\t}\n\n\t\treturn {\n\t\t\twidth: (width as number) -\n\t\t\t\t\t\t\tthis.containerPadding.left -\n\t\t\t\t\t\t\tthis.containerPadding.right,\n\t\t\theight: (height as number) -\n\t\t\t\t\t\t\tthis.containerPadding.top -\n\t\t\t\t\t\t\tthis.containerPadding.bottom\n\t\t};\n\n\t}\n\n\tbounds(): DOMRect | { width: number; height: number } {\n\t\tlet box;\n\t\tif (this.container.style.overflow !== \"visible\") {\n\t\t\tbox = this.container && this.container.getBoundingClientRect();\n\t\t}\n\n\t\tif(!box || !box.width || !box.height) {\n\t\t\treturn windowBounds();\n\t\t} else {\n\t\t\treturn box;\n\t\t}\n\n\t}\n\n\tgetSheet(): CSSStyleSheet {\n\t\tconst style = document.createElement(\"style\");\n\n\t\t// WebKit hack --> https://davidwalsh.name/add-rules-stylesheets\n\t\tstyle.appendChild(document.createTextNode(\"\"));\n\n\t\tdocument.head.appendChild(style);\n\n\t\treturn style.sheet!;\n\t}\n\n\taddStyleRules(selector: string, rulesArray: Record<string, string>[]): void {\n\t\tconst scope = \"#\" + this.id + \" \";\n\t\tlet rules = \"\";\n\n\t\tif(!this.sheet){\n\t\t\tthis.sheet = this.getSheet();\n\t\t}\n\n\t\trulesArray.forEach(function(set) {\n\t\t\tfor (const prop in set) {\n\t\t\t\tif(set.hasOwnProperty(prop)) {\n\t\t\t\t\trules += prop + \":\" + set[prop] + \";\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.sheet.insertRule(scope + selector + \" {\" + rules + \"}\", 0);\n\t}\n\n\taxis(axis: string): void {\n\t\tif(axis === \"horizontal\") {\n\t\t\tthis.container.style.display = \"flex\";\n\t\t\tthis.container.style.flexDirection = \"row\";\n\t\t\tthis.container.style.flexWrap = \"nowrap\";\n\t\t} else {\n\t\t\tthis.container.style.display = \"block\";\n\t\t}\n\t\tthis.settings.axis = axis;\n\t}\n\n\t// orientation(orientation) {\n\t// \tif (orientation === \"landscape\") {\n\t//\n\t// \t} else {\n\t//\n\t// \t}\n\t//\n\t// \tthis.orientation = orientation;\n\t// }\n\n\tdirection(dir: string): void {\n\t\tif (this.container) {\n\t\t\tthis.container.dir = dir;\n\t\t\tthis.container.style.direction = dir;\n\t\t}\n\n\t\tif (this.settings.fullsize) {\n\t\t\tdocument.body.style.direction = dir;\n\t\t}\n\t\tthis.settings.dir = dir;\n\t}\n\n\toverflow(overflow: string): void {\n\t\tif (this.container) {\n\t\t\tif (overflow === \"scroll\" && this.settings.axis === \"vertical\") {\n\t\t\t\tthis.container.style.overflowY = overflow;\n\t\t\t\tthis.container.style.overflowX = \"hidden\";\n\t\t\t} else if (overflow === \"scroll\" && this.settings.axis === \"horizontal\") {\n\t\t\t\tthis.container.style.overflowY = \"hidden\";\n\t\t\t\tthis.container.style.overflowX = overflow;\n\t\t\t} else {\n\t\t\t\tthis.container.style.overflow = overflow;\n\t\t\t}\n\t\t}\n\t\tthis.settings.overflow = overflow;\n\t}\n\n\tdestroy(): void {\n\t\tlet _base;\n\n\t\tif (this.element) {\n\n\t\t\tif(this.settings.hidden) {\n\t\t\t\t_base = this.wrapper;\n\t\t\t} else {\n\t\t\t\t_base = this.container;\n\t\t\t}\n\n\t\t\tif(this.element.contains(this.container)) {\n\t\t\t\tthis.element.removeChild(this.container);\n\t\t\t}\n\n\t\t\twindow.removeEventListener(\"resize\", this.resizeFunc);\n\t\t\twindow.removeEventListener(\"orientationChange\", this.orientationChangeFunc);\n\n\t\t}\n\t}\n}\n\nexport default Stage;\n","import type IframeView from \"../views/iframe\";\nimport type Section from \"../../section\";\n\nclass Views {\n\tcontainer: HTMLElement;\n\t_views: IframeView[];\n\tlength: number;\n\thidden: boolean;\n\n\tconstructor(container: HTMLElement) {\n\t\tthis.container = container;\n\t\tthis._views = [];\n\t\tthis.length = 0;\n\t\tthis.hidden = false;\n\t}\n\n\tall(): IframeView[] {\n\t\treturn this._views;\n\t}\n\n\tfirst(): IframeView | undefined {\n\t\treturn this._views[0];\n\t}\n\n\tlast(): IframeView | undefined {\n\t\treturn this._views[this._views.length-1];\n\t}\n\n\tindexOf(view: IframeView): number {\n\t\treturn this._views.indexOf(view);\n\t}\n\n\tslice(...args: [start?: number, end?: number]): IframeView[] {\n\t\treturn this._views.slice.apply(this._views, args);\n\t}\n\n\tget(i: number): IframeView {\n\t\treturn this._views[i];\n\t}\n\n\tappend(view: IframeView): IframeView {\n\t\tthis._views.push(view);\n\t\tif(this.container){\n\t\t\tthis.container.appendChild(view.element);\n\t\t}\n\t\tthis.length++;\n\t\treturn view;\n\t}\n\n\tprepend(view: IframeView): IframeView {\n\t\tthis._views.unshift(view);\n\t\tif(this.container){\n\t\t\tthis.container.insertBefore(view.element, this.container.firstChild);\n\t\t}\n\t\tthis.length++;\n\t\treturn view;\n\t}\n\n\tinsert(view: IframeView, index: number): IframeView {\n\t\tthis._views.splice(index, 0, view);\n\n\t\tif(this.container){\n\t\t\tif(index < this.container.children.length){\n\t\t\t\tthis.container.insertBefore(view.element, this.container.children[index]);\n\t\t\t} else {\n\t\t\t\tthis.container.appendChild(view.element);\n\t\t\t}\n\t\t}\n\n\t\tthis.length++;\n\t\treturn view;\n\t}\n\n\tremove(view: IframeView): void {\n\t\tconst index = this._views.indexOf(view);\n\n\t\tif(index > -1) {\n\t\t\tthis._views.splice(index, 1);\n\t\t}\n\n\n\t\tthis.destroy(view);\n\n\t\tthis.length--;\n\t}\n\n\tdestroy(view: IframeView): void {\n\t\tif(view.displayed){\n\t\t\tview.destroy();\n\t\t}\n\n\t\tif(this.container){\n\t\t\t this.container.removeChild(view.element);\n\t\t}\n\t}\n\n\t// Iterators\n\n\tforEach(callbackfn: (value: IframeView, index: number, array: IframeView[]) => void): void {\n\t\treturn this._views.forEach(callbackfn);\n\t}\n\n\tclear(): void {\n\t\t// Remove all views\n\t\tlet view: IframeView;\n\t\tconst len = this.length;\n\n\t\tif(!this.length) return;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tview = this._views[i];\n\t\t\tthis.destroy(view);\n\t\t}\n\n\t\tthis._views = [];\n\t\tthis.length = 0;\n\t}\n\n\tfind(section: Section): IframeView | undefined {\n\n\t\tlet view: IframeView;\n\t\tconst len = this.length;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tview = this._views[i];\n\t\t\tif(view.displayed && view.section.index == section.index) {\n\t\t\t\treturn view;\n\t\t\t}\n\t\t}\n\n\t}\n\n\tdisplayed(): IframeView[] {\n\t\tconst displayed: IframeView[] = [];\n\t\tlet view: IframeView;\n\t\tconst len = this.length;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tview = this._views[i];\n\t\t\tif(view.displayed){\n\t\t\t\tdisplayed.push(view);\n\t\t\t}\n\t\t}\n\t\treturn displayed;\n\t}\n\n\tshow(): void {\n\t\tlet view;\n\t\tconst len = this.length;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tview = this._views[i];\n\t\t\tif(view.displayed){\n\t\t\t\tview.show();\n\t\t\t}\n\t\t}\n\t\tthis.hidden = false;\n\t}\n\n\thide(): void {\n\t\tlet view;\n\t\tconst len = this.length;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tview = this._views[i];\n\t\t\tif(view.displayed){\n\t\t\t\tview.hide();\n\t\t\t}\n\t\t}\n\t\tthis.hidden = true;\n\t}\n}\n\nexport default Views;\n","import EventEmitter from \"../../utils/event-emitter\";\nimport {extend, defer, windowBounds, isNumber} from \"../../utils/core\";\nimport scrollType from \"../../utils/scrolltype\";\nimport Mapping from \"../../mapping\";\nimport Queue from \"../../utils/queue\";\nimport Stage from \"../helpers/stage\";\nimport Views from \"../helpers/views\";\nimport { EVENTS } from \"../../utils/constants\";\nimport type Layout from \"../../layout\";\nimport type Section from \"../../section\";\nimport type Contents from \"../../contents\";\nimport type IframeView from \"../views/iframe\";\nimport type { IEventEmitter, ManagerOptions, ViewSettings, ViewLocation, RequestFunction, SizeObject, ReframeBounds, LayoutProps } from \"../../types\";\n\nclass DefaultViewManager implements IEventEmitter {\n\tname: string;\n\toptsSettings: ManagerOptions;\n\tView: new (section: Section, options?: ViewSettings) => IframeView;\n\trequest: RequestFunction;\n\trenditionQueue: Queue;\n\tq: Queue;\n\tsettings: ManagerOptions;\n\tviewSettings: Omit<ViewSettings, \"layout\"> & { layout?: Layout | LayoutProps };\n\trendered: boolean;\n\tstage: Stage;\n\tcontainer: HTMLElement;\n\tviews: Views;\n\t_bounds: { left: number; right: number; top: number; bottom: number; width: number; height: number };\n\t_stageSize: SizeObject;\n\toverflow: string;\n\tlayout: Layout;\n\tmapping: Mapping;\n\tlocation: ViewLocation[];\n\tisPaginated: boolean;\n\tscrollLeft: number;\n\tscrollTop: number;\n\tignore: boolean;\n\twritingMode: string;\n\t_hasScrolled: boolean;\n\t_onScroll: (...args: any[]) => void;\n\torientationTimeout: ReturnType<typeof setTimeout>;\n\tresizeTimeout: ReturnType<typeof setTimeout>;\n\tafterScrolled: ReturnType<typeof setTimeout>;\n\twinBounds: { top: number; left: number; right: number; bottom: number; width: number; height: number };\n\n\tdeclare on: IEventEmitter[\"on\"];\n\tdeclare off: IEventEmitter[\"off\"];\n\tdeclare emit: IEventEmitter[\"emit\"];\n\n\tconstructor(options: ManagerOptions) {\n\n\t\tthis.name = \"default\";\n\t\tthis.optsSettings = options.settings;\n\t\tthis.View = options.view as unknown as new (section: Section, options?: ViewSettings) => IframeView;\n\t\tthis.request = options.request!;\n\t\tthis.renditionQueue = options.queue;\n\t\tthis.q = new Queue(this);\n\n\t\tthis.settings = extend(this.settings || {}, {\n\t\t\tinfinite: true,\n\t\t\thidden: false,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t\taxis: undefined,\n\t\t\twritingMode: undefined,\n\t\t\tflow: \"scrolled\",\n\t\t\tignoreClass: \"\",\n\t\t\tfullsize: undefined,\n\t\t\tallowScriptedContent: false,\n\t\t\tallowPopups: false\n\t\t});\n\n\t\textend(this.settings, options.settings || {});\n\n\t\tthis.viewSettings = {\n\t\t\tignoreClass: this.settings.ignoreClass,\n\t\t\taxis: this.settings.axis,\n\t\t\tflow: this.settings.flow,\n\t\t\tlayout: this.layout,\n\t\t\tmethod: this.settings.method, // srcdoc, blobUrl, write\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tforceEvenPages: true,\n\t\t\tallowScriptedContent: this.settings.allowScriptedContent,\n\t\t\tallowPopups: this.settings.allowPopups\n\t\t};\n\n\t\tthis.rendered = false;\n\n\t}\n\n\trender(element: HTMLElement, size: SizeObject): void {\n\t\tconst tag = element.tagName;\n\n\t\tif (typeof this.settings.fullsize === \"undefined\" &&\n\t\t\t\ttag && (tag.toLowerCase() == \"body\" ||\n\t\t\t\ttag.toLowerCase() == \"html\")) {\n\t\t\t\tthis.settings.fullsize = true;\n\t\t}\n\n\t\tif (this.settings.fullsize) {\n\t\t\tthis.settings.overflow = \"visible\";\n\t\t\tthis.overflow = this.settings.overflow;\n\t\t}\n\n\t\tthis.settings.size = size;\n\n\t\tthis.settings.rtlScrollType = scrollType();\n\n\t\t// Save the stage\n\t\tthis.stage = new Stage({\n\t\t\twidth: size.width,\n\t\t\theight: size.height,\n\t\t\toverflow: this.overflow,\n\t\t\thidden: this.settings.hidden,\n\t\t\taxis: this.settings.axis,\n\t\t\tfullsize: this.settings.fullsize,\n\t\t\tdirection: this.settings.direction\n\t\t});\n\n\t\tthis.stage.attachTo(element);\n\n\t\t// Get this stage container div\n\t\tthis.container = this.stage.getContainer();\n\n\t\t// Views array methods\n\t\tthis.views = new Views(this.container);\n\n\t\t// Calculate Stage Size\n\t\tthis._bounds = this.bounds();\n\t\tthis._stageSize = this.stage.size();\n\n\t\t// Set the dimensions for views\n\t\tthis.viewSettings.width = this._stageSize.width;\n\t\tthis.viewSettings.height = this._stageSize.height;\n\n\t\t// Function to handle a resize event.\n\t\t// Will only attach if width and height are both fixed.\n\t\tthis.stage.onResize(this.onResized.bind(this));\n\n\t\tthis.stage.onOrientationChange(this.onOrientationChange.bind(this));\n\n\t\t// Add Event Listeners\n\t\tthis.addEventListeners();\n\n\t\t// Add Layout method\n\t\t// this.applyLayoutMethod();\n\t\tif (this.layout) {\n\t\t\tthis.updateLayout();\n\t\t}\n\n\t\tthis.rendered = true;\n\n\t}\n\n\taddEventListeners(): void {\n\t\tlet scroller;\n\n\t\twindow.addEventListener(\"unload\", function(_e: Event){\n\t\t\tthis.destroy();\n\t\t}.bind(this));\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tscroller = this.container;\n\t\t} else {\n\t\t\tscroller = window;\n\t\t}\n\n\t\tthis._onScroll = this.onScroll.bind(this);\n\t\tscroller.addEventListener(\"scroll\", this._onScroll);\n\t}\n\n\tremoveEventListeners(): void {\n\t\tlet scroller;\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tscroller = this.container;\n\t\t} else {\n\t\t\tscroller = window;\n\t\t}\n\n\t\tscroller.removeEventListener(\"scroll\", this._onScroll);\n\t\t(this as any)._onScroll = undefined;\n\t}\n\n\tdestroy(): void {\n\t\tclearTimeout(this.orientationTimeout);\n\t\tclearTimeout(this.resizeTimeout);\n\t\tclearTimeout(this.afterScrolled);\n\n\t\tthis.clear();\n\n\t\tthis.removeEventListeners();\n\n\t\tthis.stage.destroy();\n\n\t\tthis.rendered = false;\n\n\t\t/*\n\n\t\t\tclearTimeout(this.trimTimeout);\n\t\t\tif(this.settings.hidden) {\n\t\t\t\tthis.element.removeChild(this.wrapper);\n\t\t\t} else {\n\t\t\t\tthis.element.removeChild(this.container);\n\t\t\t}\n\t\t*/\n\t}\n\n\tonOrientationChange(_e?: Event): void {\n\t\tconst {orientation} = window;\n\n\t\tif(this.optsSettings.resizeOnOrientationChange) {\n\t\t\tthis.resize();\n\t\t}\n\n\t\t// Per ampproject:\n\t\t// In IOS 10.3, the measured size of an element is incorrect if the\n\t\t// element size depends on window size directly and the measurement\n\t\t// happens in window.resize event. Adding a timeout for correct\n\t\t// measurement. See https://github.com/ampproject/amphtml/issues/8479\n\t\tclearTimeout(this.orientationTimeout);\n\t\tthis.orientationTimeout = setTimeout(function(){\n\t\t\tthis.orientationTimeout = undefined;\n\n\t\t\tif(this.optsSettings.resizeOnOrientationChange) {\n\t\t\t\tthis.resize();\n\t\t\t}\n\n\t\t\tthis.emit(EVENTS.MANAGERS.ORIENTATION_CHANGE, orientation);\n\t\t}.bind(this), 500);\n\n\t}\n\n\tonResized(_e?: Event): void {\n\t\tthis.resize();\n\t}\n\n\tresize(width?: number, height?: number, epubcfi?: string): void {\n\t\tconst stageSize = this.stage.size(width, height);\n\n\t\t// For Safari, wait for orientation to catch up\n\t\t// if the window is a square\n\t\tthis.winBounds = windowBounds();\n\t\tif (this.orientationTimeout &&\n\t\t\t\tthis.winBounds.width === this.winBounds.height) {\n\t\t\t// reset the stage size for next resize\n\t\t\t(this as any)._stageSize = undefined;\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._stageSize &&\n\t\t\t\tthis._stageSize.width === stageSize.width &&\n\t\t\t\tthis._stageSize.height === stageSize.height ) {\n\t\t\t// Size is the same, no need to resize\n\t\t\treturn;\n\t\t}\n\n\t\tthis._stageSize = stageSize;\n\n\t\tthis._bounds = this.bounds();\n\n\t\t// Clear current views\n\t\tthis.clear();\n\n\t\t// Update for new views\n\t\tthis.viewSettings.width = this._stageSize.width;\n\t\tthis.viewSettings.height = this._stageSize.height;\n\n\t\tthis.updateLayout();\n\n\t\tthis.emit(EVENTS.MANAGERS.RESIZED, {\n\t\t\twidth: this._stageSize.width,\n\t\t\theight: this._stageSize.height\n\t\t}, epubcfi);\n\t}\n\n\tcreateView(section: Section, forceRight?: boolean): IframeView {\n\t\treturn new this.View(section, extend(this.viewSettings, { forceRight }) );\n\t}\n\n\thandleNextPrePaginated(forceRight: boolean, section: Section, action: Function): any {\n\t\tlet next;\n\n\t\tif (this.layout.name === \"pre-paginated\" && this.layout.divisor > 1) {\n\t\t\tif (forceRight || section.index === 0) {\n\t\t\t\t// First page (cover) should stand alone for pre-paginated books\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnext = section.next();\n\t\t\tif (next && !next.properties.includes(\"page-spread-left\")) {\n\t\t\t\treturn action.call(this, next);\n\t\t\t}\n\t\t}\n\t}\n\n\tdisplay(section: Section, target?: string): Promise<any> {\n\n\t\tconst displaying = new defer();\n\t\tconst displayed = displaying.promise;\n\n\t\t// Check if moving to target is needed\n\t\tif (target === section.href || isNumber(target)) {\n\t\t\ttarget = undefined;\n\t\t}\n\n\t\t// Check to make sure the section we want isn't already shown\n\t\tconst visible = this.views.find(section);\n\n\t\t// View is already shown, just move to correct location in view\n\t\tif(visible && section && this.layout.name !== \"pre-paginated\") {\n\t\t\tconst offset = visible.offset();\n\n\t\t\tif (this.settings.direction === \"ltr\") {\n\t\t\t\tthis.scrollTo(offset.left, offset.top, true);\n\t\t\t} else {\n\t\t\t\tconst width = visible.width();\n\t\t\t\tthis.scrollTo(offset.left + width, offset.top, true);\n\t\t\t}\n\n\t\t\tif(target) {\n\t\t\t\tconst offset = visible.locationOf(target);\n\t\t\t\tconst width = visible.width();\n\t\t\t\tthis.moveTo(offset, width);\n\t\t\t}\n\n\t\t\tdisplaying.resolve();\n\t\t\treturn displayed;\n\t\t}\n\n\t\t// Hide all current views\n\t\tthis.clear();\n\n\t\tlet forceRight = false;\n\t\tif (this.layout.name === \"pre-paginated\" && this.layout.divisor === 2 && section.properties.includes(\"page-spread-right\")) {\n\t\t\tforceRight = true;\n\t\t}\n\n\t\tthis.add(section, forceRight)\n\t\t\t.then(function(view: IframeView){\n\n\t\t\t\t// Move to correct place within the section, if needed\n\t\t\t\tif(target) {\n\t\t\t\t\tconst offset = view.locationOf(target);\n\t\t\t\t\tconst width = view.width();\n\t\t\t\t\tthis.moveTo(offset, width);\n\t\t\t\t}\n\n\t\t\t}.bind(this), (err) => {\n\t\t\t\tdisplaying.reject(err);\n\t\t\t})\n\t\t\t.then(function(){\n\t\t\t\treturn this.handleNextPrePaginated(forceRight, section, this.add);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\n\t\t\t\tthis.views.show();\n\n\t\t\t\tdisplaying.resolve();\n\n\t\t\t}.bind(this));\n\t\t// .then(function(){\n\t\t// \treturn this.hooks.display.trigger(view);\n\t\t// }.bind(this))\n\t\t// .then(function(){\n\t\t// \tthis.views.show();\n\t\t// }.bind(this));\n\t\treturn displayed;\n\t}\n\n\tafterDisplayed(view: IframeView): void {\n\t\tthis.emit(EVENTS.MANAGERS.ADDED, view);\n\t}\n\n\tafterResized(view: IframeView): void {\n\t\tthis.emit(EVENTS.MANAGERS.RESIZE, view.section);\n\t}\n\n\tmoveTo(offset: { left: number; top: number }, width?: number): void {\n\t\tlet distX = 0,\n\t\t\t\tdistY = 0;\n\n\t\tif(!this.isPaginated) {\n\t\t\tdistY = offset.top;\n\t\t} else {\n\t\t\tdistX = Math.floor(offset.left / this.layout.delta) * this.layout.delta;\n\n\t\t\tif (distX + this.layout.delta > this.container.scrollWidth) {\n\t\t\t\tdistX = this.container.scrollWidth - this.layout.delta;\n\t\t\t}\n\n\t\t\tdistY = Math.floor(offset.top / this.layout.delta) * this.layout.delta;\n\n\t\t\tif (distY + this.layout.delta > this.container.scrollHeight) {\n\t\t\t\tdistY = this.container.scrollHeight - this.layout.delta;\n\t\t\t}\n\t\t}\n\t\tif(this.settings.direction === \"rtl\"){\n\t\t\t/***\n\t\t\t\tthe `floor` function above (L343) is on positive values, so we should add one `layout.delta`\n\t\t\t\tto distX or use `Math.ceil` function, or multiply offset.left by -1\n\t\t\t\tbefore `Math.floor`\n\t\t\t*/\n\t\t\tdistX = distX + this.layout.delta\n\t\t\tdistX = distX - width!\n\t\t}\n\t\tthis.scrollTo(distX, distY, true);\n\t}\n\n\tadd(section: Section, forceRight?: boolean): Promise<any> {\n\t\tconst view = this.createView(section, forceRight);\n\n\t\tthis.views.append(view);\n\n\t\t// view.on(EVENTS.VIEWS.SHOWN, this.afterDisplayed.bind(this));\n\t\tview.onDisplayed = this.afterDisplayed.bind(this);\n\t\tview.onResize = this.afterResized.bind(this);\n\n\t\tview.on(EVENTS.VIEWS.AXIS, (axis: string) => {\n\t\t\tthis.updateAxis(axis);\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.WRITING_MODE, (mode: string) => {\n\t\t\tthis.updateWritingMode(mode);\n\t\t});\n\n\t\treturn view.display(this.request);\n\t}\n\n\tappend(section: Section, forceRight?: boolean): Promise<any> {\n\t\tconst view = this.createView(section, forceRight);\n\t\tthis.views.append(view);\n\n\t\tview.onDisplayed = this.afterDisplayed.bind(this);\n\t\tview.onResize = this.afterResized.bind(this);\n\n\t\tview.on(EVENTS.VIEWS.AXIS, (axis: string) => {\n\t\t\tthis.updateAxis(axis);\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.WRITING_MODE, (mode: string) => {\n\t\t\tthis.updateWritingMode(mode);\n\t\t});\n\n\t\treturn view.display(this.request);\n\t}\n\n\tprepend(section: Section, forceRight?: boolean): Promise<any> {\n\t\tconst view = this.createView(section, forceRight);\n\n\t\tview.on(EVENTS.VIEWS.RESIZED, (bounds: ReframeBounds) => {\n\t\t\tthis.counter(bounds);\n\t\t});\n\n\t\tthis.views.prepend(view);\n\n\t\tview.onDisplayed = this.afterDisplayed.bind(this);\n\t\tview.onResize = this.afterResized.bind(this);\n\n\t\tview.on(EVENTS.VIEWS.AXIS, (axis: string) => {\n\t\t\tthis.updateAxis(axis);\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.WRITING_MODE, (mode: string) => {\n\t\t\tthis.updateWritingMode(mode);\n\t\t});\n\n\t\treturn view.display(this.request);\n\t}\n\n\tcounter(bounds: ReframeBounds): void {\n\t\tif(this.settings.axis === \"vertical\") {\n\t\t\tthis.scrollBy(0, bounds.heightDelta, true);\n\t\t} else {\n\t\t\tthis.scrollBy(bounds.widthDelta, 0, true);\n\t\t}\n\n\t}\n\n\t// resizeView(view) {\n\t//\n\t// \tif(this.settings.globalLayoutProperties.layout === \"pre-paginated\") {\n\t// \t\tview.lock(\"both\", this.bounds.width, this.bounds.height);\n\t// \t} else {\n\t// \t\tview.lock(\"width\", this.bounds.width, this.bounds.height);\n\t// \t}\n\t//\n\t// };\n\n\tnext(): any {\n\t\tlet next: any;\n\t\tlet left;\n\n\t\tconst dir = this.settings.direction;\n\n\t\tif(!this.views.length) return;\n\n\t\tif(this.isPaginated && this.settings.axis === \"horizontal\" && (!dir || dir === \"ltr\")) {\n\n\t\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\t\tleft = this.container.scrollLeft + this.container.offsetWidth + this.layout.delta;\n\n\t\t\tif(left <= this.container.scrollWidth) {\n\t\t\t\tthis.scrollBy(this.layout.delta, 0, true);\n\t\t\t} else {\n\t\t\t\tnext = this.views.last()!.section.next();\n\t\t\t}\n\t\t} else if (this.isPaginated && this.settings.axis === \"horizontal\" && dir === \"rtl\") {\n\n\t\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\t\tif (this.settings.rtlScrollType === \"default\"){\n\t\t\t\tleft = this.container.scrollLeft;\n\n\t\t\t\tif (left > 0) {\n\t\t\t\t\tthis.scrollBy(this.layout.delta, 0, true);\n\t\t\t\t} else {\n\t\t\t\t\tnext = this.views.last()!.section.next();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tleft = this.container.scrollLeft + ( this.layout.delta * -1 );\n\n\t\t\t\tif (left > this.container.scrollWidth * -1){\n\t\t\t\t\tthis.scrollBy(this.layout.delta, 0, true);\n\t\t\t\t} else {\n\t\t\t\t\tnext = this.views.last()!.section.next();\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if (this.isPaginated && this.settings.axis === \"vertical\") {\n\n\t\t\tthis.scrollTop = this.container.scrollTop;\n\n\t\t\tconst top = this.container.scrollTop + this.container.offsetHeight;\n\n\t\t\tif(top < this.container.scrollHeight) {\n\t\t\t\tthis.scrollBy(0, this.layout.height, true);\n\t\t\t} else {\n\t\t\t\tnext = this.views.last()!.section.next();\n\t\t\t}\n\n\t\t} else {\n\t\t\tnext = this.views.last()!.section.next();\n\t\t}\n\n\t\tif(next) {\n\t\t\tthis.clear();\n\t\t\t// The new section may have a different writing-mode from the old section. Thus, we need to update layout.\n\t\t\tthis.updateLayout();\n\n\t\t\tlet forceRight = false;\n\t\t\tif (this.layout.name === \"pre-paginated\" && this.layout.divisor === 2 && next.properties.includes(\"page-spread-right\")) {\n\t\t\t\tforceRight = true;\n\t\t\t}\n\n\t\t\treturn this.append(next, forceRight)\n\t\t\t\t.then(function(){\n\t\t\t\t\treturn this.handleNextPrePaginated(forceRight, next, this.append);\n\t\t\t\t}.bind(this), (err) => {\n\t\t\t\t\treturn err;\n\t\t\t\t})\n\t\t\t\t.then(function(){\n\n\t\t\t\t\t// Reset position to start for scrolled-doc vertical-rl in default mode\n\t\t\t\t\tif (!this.isPaginated &&\n\t\t\t\t\t\tthis.settings.axis === \"horizontal\" &&\n\t\t\t\t\t\tthis.settings.direction === \"rtl\" &&\n\t\t\t\t\t\tthis.settings.rtlScrollType === \"default\") {\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.scrollTo(this.container.scrollWidth, 0, true);\n\t\t\t\t\t}\n\t\t\t\t\tthis.views.show();\n\t\t\t\t}.bind(this));\n\t\t}\n\n\n\t}\n\n\tprev(): any {\n\t\tlet prev: any;\n\t\tlet left;\n\t\tconst dir = this.settings.direction;\n\n\t\tif(!this.views.length) return;\n\n\t\tif(this.isPaginated && this.settings.axis === \"horizontal\" && (!dir || dir === \"ltr\")) {\n\n\t\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\t\tleft = this.container.scrollLeft;\n\n\t\t\tif(left > 0) {\n\t\t\t\tthis.scrollBy(-this.layout.delta, 0, true);\n\t\t\t} else {\n\t\t\t\tprev = this.views.first()!.section.prev();\n\t\t\t}\n\n\t\t} else if (this.isPaginated && this.settings.axis === \"horizontal\" && dir === \"rtl\") {\n\n\t\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\t\tif (this.settings.rtlScrollType === \"default\"){\n\t\t\t\tleft = this.container.scrollLeft + this.container.offsetWidth;\n\n\t\t\t\tif (left < this.container.scrollWidth) {\n\t\t\t\t\tthis.scrollBy(-this.layout.delta, 0, true);\n\t\t\t\t} else {\n\t\t\t\t\tprev = this.views.first()!.section.prev();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse{\n\t\t\t\tleft = this.container.scrollLeft;\n\n\t\t\t\tif (left < 0) {\n\t\t\t\t\tthis.scrollBy(-this.layout.delta, 0, true);\n\t\t\t\t} else {\n\t\t\t\t\tprev = this.views.first()!.section.prev();\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if (this.isPaginated && this.settings.axis === \"vertical\") {\n\n\t\t\tthis.scrollTop = this.container.scrollTop;\n\n\t\t\tconst top = this.container.scrollTop;\n\n\t\t\tif(top > 0) {\n\t\t\t\tthis.scrollBy(0, -(this.layout.height), true);\n\t\t\t} else {\n\t\t\t\tprev = this.views.first()!.section.prev();\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tprev = this.views.first()!.section.prev();\n\n\t\t}\n\n\t\tif(prev) {\n\t\t\tthis.clear();\n\t\t\t// The new section may have a different writing-mode from the old section. Thus, we need to update layout.\n\t\t\tthis.updateLayout();\n\n\t\t\tlet forceRight = false;\n\t\t\tif (this.layout.name === \"pre-paginated\" && this.layout.divisor === 2 && typeof prev.prev() !== \"object\") {\n\t\t\t\tforceRight = true;\n\t\t\t}\n\n\t\t\treturn this.prepend(prev, forceRight)\n\t\t\t\t.then(function(){\n\t\t\t\t\tlet left;\n\t\t\t\t\tif (this.layout.name === \"pre-paginated\" && this.layout.divisor > 1) {\n\t\t\t\t\t\tleft = prev.prev();\n\t\t\t\t\t\tif (left) {\n\t\t\t\t\t\t\treturn this.prepend(left);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}.bind(this), (err) => {\n\t\t\t\t\treturn err;\n\t\t\t\t})\n\t\t\t\t.then(function(){\n\t\t\t\t\tif(this.isPaginated && this.settings.axis === \"horizontal\") {\n\t\t\t\t\t\tif (this.settings.direction === \"rtl\") {\n\t\t\t\t\t\t\tif (this.settings.rtlScrollType === \"default\"){\n\t\t\t\t\t\t\t\tthis.scrollTo(0, 0, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\tthis.scrollTo((this.container.scrollWidth * -1) + this.layout.delta, 0, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.scrollTo(this.container.scrollWidth - this.layout.delta, 0, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.views.show();\n\t\t\t\t}.bind(this));\n\t\t}\n\t}\n\n\tcurrent(): IframeView | null {\n\t\tconst visible = this.visible();\n\t\tif(visible.length){\n\t\t\t// Current is the last visible view\n\t\t\treturn visible[visible.length-1];\n\t\t}\n\t\treturn null;\n\t}\n\n\tclear (): void {\n\n\t\t// this.q.clear();\n\n\t\tif (this.views) {\n\t\t\tthis.views.hide();\n\t\t\tthis.scrollTo(0,0, true);\n\t\t\tthis.views.clear();\n\t\t}\n\t}\n\n\tcurrentLocation(): ViewLocation[] {\n\t\tthis.updateLayout();\n\t\tif (this.isPaginated && this.settings.axis === \"horizontal\") {\n\t\t\tthis.location = this.paginatedLocation();\n\t\t} else {\n\t\t\tthis.location = this.scrolledLocation();\n\t\t}\n\t\treturn this.location;\n\t}\n\n\tscrolledLocation(): ViewLocation[] {\n\t\tconst visible = this.visible();\n\t\tconst container = this.container.getBoundingClientRect();\n\t\tconst pageHeight = (container.height < window.innerHeight) ? container.height : window.innerHeight;\n\t\tconst pageWidth = (container.width < window.innerWidth) ? container.width : window.innerWidth;\n\t\tconst vertical = (this.settings.axis === \"vertical\");\n\t\tconst _rtl = (this.settings.direction === \"rtl\");\n\t\t\n\t\tlet offset = 0;\n\t\tconst used = 0;\n\n\t\tif(this.settings.fullsize) {\n\t\t\toffset = vertical ? window.scrollY : window.scrollX;\n\t\t}\n\n\t\tconst sections = visible.map((view) => {\n\t\t\tconst {index, href} = view.section;\n\t\t\tconst position = view.position();\n\t\t\tconst width = view.width();\n\t\t\tconst height = view.height();\n\n\t\t\tlet startPos;\n\t\t\tlet endPos;\n\t\t\tlet stopPos;\n\t\t\tlet totalPages;\n\n\t\t\tif (vertical) {\n\t\t\t\tstartPos = offset + container.top - position.top + used;\n\t\t\t\tendPos = startPos + pageHeight - used;\n\t\t\t\ttotalPages = this.layout.count(height, pageHeight).pages;\n\t\t\t\tstopPos = pageHeight;\n\t\t\t} else {\n\t\t\t\tstartPos = offset + container.left - position.left + used;\n\t\t\t\tendPos = startPos + pageWidth - used;\n\t\t\t\ttotalPages = this.layout.count(width, pageWidth).pages;\n\t\t\t\tstopPos = pageWidth;\n\t\t\t}\n\n\t\t\tlet currPage = Math.ceil(startPos / stopPos);\n\t\t\tlet pages = [];\n\t\t\tlet endPage = Math.ceil(endPos / stopPos);\n\n\t\t\t// Reverse page counts for horizontal rtl\n\t\t\tif (this.settings.direction === \"rtl\" && !vertical) {\n\t\t\t\tconst tempStartPage = currPage;\n\t\t\t\tcurrPage = totalPages - endPage;\n\t\t\t\tendPage = totalPages - tempStartPage;\n\t\t\t}\n\n\t\t\tpages = [];\n\t\t\tfor (let i = currPage; i <= endPage; i++) {\n\t\t\t\tconst pg = i + 1;\n\t\t\t\tpages.push(pg);\n\t\t\t}\n\n\t\t\tconst mapping = this.mapping.page(view.contents, view.section.cfiBase, startPos, endPos);\n\n\t\t\treturn {\n\t\t\t\tindex,\n\t\t\t\thref,\n\t\t\t\tpages,\n\t\t\t\ttotalPages,\n\t\t\t\tmapping: mapping!\n\t\t\t};\n\t\t});\n\n\t\treturn sections;\n\t}\n\n\tpaginatedLocation(): ViewLocation[] {\n\t\tconst visible = this.visible();\n\t\tconst container = this.container.getBoundingClientRect();\n\n\t\tlet left = 0;\n\t\tlet used = 0;\n\n\t\tif(this.settings.fullsize) {\n\t\t\tleft = window.scrollX;\n\t\t}\n\n\t\tconst sections = visible.map((view) => {\n\t\t\tconst {index, href} = view.section;\n\t\t\tlet offset;\n\t\t\tconst position = view.position();\n\t\t\tconst width = view.width();\n\n\t\t\t// Find mapping\n\t\t\tlet start;\n\t\t\tlet end;\n\t\t\tlet pageWidth;\n\n\t\t\tif (this.settings.direction === \"rtl\") {\n\t\t\t\toffset = container.right - left;\n\t\t\t\tpageWidth = Math.min(Math.abs(offset - position.left), this.layout.width) - used;\n\t\t\t\tend = position.width - (position.right - offset) - used;\n\t\t\t\tstart = end - pageWidth;\n\t\t\t} else {\n\t\t\t\toffset = container.left + left;\n\t\t\t\tpageWidth = Math.min(position.right - offset, this.layout.width) - used;\n\t\t\t\tstart = offset - position.left + used;\n\t\t\t\tend = start + pageWidth;\n\t\t\t}\n\n\t\t\tused += pageWidth;\n\n\t\t\tconst mapping = this.mapping.page(view.contents, view.section.cfiBase, start, end);\n\n\t\t\tconst totalPages = this.layout.count(width).pages;\n\t\t\tlet startPage = Math.floor(start / this.layout.pageWidth);\n\t\t\tconst pages = [];\n\t\t\tlet endPage = Math.floor(end / this.layout.pageWidth);\n\n\t\t\t// start page should not be negative\n\t\t\tif (startPage < 0) {\n\t\t\t\tstartPage = 0;\n\t\t\t\tendPage = endPage + 1;\n\t\t\t}\n\n\t\t\t// Reverse page counts for rtl\n\t\t\tif (this.settings.direction === \"rtl\") {\n\t\t\t\tconst tempStartPage = startPage;\n\t\t\t\tstartPage = totalPages - endPage;\n\t\t\t\tendPage = totalPages - tempStartPage;\n\t\t\t}\n\n\n\t\t\tfor (let i = startPage + 1; i <= endPage; i++) {\n\t\t\t\tconst pg = i;\n\t\t\t\tpages.push(pg);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tindex,\n\t\t\t\thref,\n\t\t\t\tpages,\n\t\t\t\ttotalPages,\n\t\t\t\tmapping: mapping!\n\t\t\t};\n\t\t});\n\n\t\treturn sections;\n\t}\n\n\tisVisible(view: IframeView, offsetPrev: number, offsetNext: number, _container?: { left: number; right: number; top: number; bottom: number; width: number; height: number }): boolean {\n\t\tconst position = view.position();\n\t\tconst container = _container || this.bounds();\n\n\t\tif(this.settings.axis === \"horizontal\" &&\n\t\t\tposition.right > container.left - offsetPrev &&\n\t\t\tposition.left < container.right + offsetNext) {\n\n\t\t\treturn true;\n\n\t\t} else if(this.settings.axis === \"vertical\" &&\n\t\t\tposition.bottom > container.top - offsetPrev &&\n\t\t\tposition.top < container.bottom + offsetNext) {\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tvisible(): IframeView[] {\n\t\tconst container = this.bounds();\n\t\tconst views = this.views.displayed();\n\t\tconst viewsLength = views.length;\n\t\tconst visible = [];\n\t\tlet isVisible;\n\t\tlet view;\n\n\t\tfor (let i = 0; i < viewsLength; i++) {\n\t\t\tview = views[i];\n\t\t\tisVisible = this.isVisible(view, 0, 0, container);\n\n\t\t\tif(isVisible === true) {\n\t\t\t\tvisible.push(view);\n\t\t\t}\n\n\t\t}\n\t\treturn visible;\n\t}\n\n\tscrollBy(x: number, y: number, silent?: boolean): void {\n\t\tconst dir = this.settings.direction === \"rtl\" ? -1 : 1;\n\n\t\tif(silent) {\n\t\t\tthis.ignore = true;\n\t\t}\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tif(x) this.container.scrollLeft += x * dir;\n\t\t\tif(y) this.container.scrollTop += y;\n\t\t} else {\n\t\t\twindow.scrollBy(x * dir, y * dir);\n\t\t}\n\t\tthis._hasScrolled = true;\n\t}\n\n\tscrollTo(x: number, y: number, silent?: boolean): void {\n\t\tif(silent) {\n\t\t\tthis.ignore = true;\n\t\t}\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tthis.container.scrollLeft = x;\n\t\t\tthis.container.scrollTop = y;\n\t\t} else {\n\t\t\twindow.scrollTo(x,y);\n\t\t}\n\t\tthis._hasScrolled = true;\n\t}\n\n\tonScroll(): void {\n\t\tlet scrollTop;\n\t\tlet scrollLeft;\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tscrollTop = this.container.scrollTop;\n\t\t\tscrollLeft = this.container.scrollLeft;\n\t\t} else {\n\t\t\tscrollTop = window.scrollY;\n\t\t\tscrollLeft = window.scrollX;\n\t\t}\n\n\t\tthis.scrollTop = scrollTop;\n\t\tthis.scrollLeft = scrollLeft;\n\n\t\tif(!this.ignore) {\n\t\t\tthis.emit(EVENTS.MANAGERS.SCROLL, {\n\t\t\t\ttop: scrollTop,\n\t\t\t\tleft: scrollLeft\n\t\t\t});\n\n\t\t\tclearTimeout(this.afterScrolled);\n\t\t\tthis.afterScrolled = setTimeout(function () {\n\t\t\t\tthis.emit(EVENTS.MANAGERS.SCROLLED, {\n\t\t\t\t\ttop: this.scrollTop,\n\t\t\t\t\tleft: this.scrollLeft\n\t\t\t\t});\n\t\t\t}.bind(this), 20);\n\n\n\n\t\t} else {\n\t\t\tthis.ignore = false;\n\t\t}\n\n\t}\n\n\tbounds(): { left: number; right: number; top: number; bottom: number; width: number; height: number } {\n\t\tconst bounds = this.stage.bounds();\n\n\t\treturn bounds as { left: number; right: number; top: number; bottom: number; width: number; height: number };\n\t}\n\n\tapplyLayout(layout: Layout): void {\n\n\t\tthis.layout = layout;\n\t\tthis.updateLayout();\n\t\tif (this.views && this.views.length > 0 && this.layout.name === \"pre-paginated\") {\n\t\t\tthis.display(this.views.first()!.section);\n\t\t}\n\t\t // this.manager.layout(this.layout.format);\n\t}\n\n\tupdateLayout(): void {\n\n\t\tif (!this.stage) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._stageSize = this.stage.size();\n\n\t\tif(!this.isPaginated) {\n\t\t\tthis.layout.calculate(this._stageSize.width, this._stageSize.height);\n\t\t} else {\n\t\t\tthis.layout.calculate(\n\t\t\t\tthis._stageSize.width,\n\t\t\t\tthis._stageSize.height,\n\t\t\t\tthis.settings.gap\n\t\t\t);\n\n\t\t\t// Set the look ahead offset for what is visible\n\t\t\tthis.settings.offset = this.layout.delta / this.layout.divisor;\n\n\t\t\t// this.stage.addStyleRules(\"iframe\", [{\"margin-right\" : this.layout.gap + \"px\"}]);\n\n\t\t}\n\n\t\t// Set the dimensions for views\n\t\tthis.viewSettings.width = this.layout.width;\n\t\tthis.viewSettings.height = this.layout.height;\n\n\t\tthis.setLayout(this.layout);\n\t}\n\n\tsetLayout(layout: Layout): void {\n\n\t\tthis.viewSettings.layout = layout;\n\n\t\tthis.mapping = new Mapping(layout.props, this.settings.direction, this.settings.axis);\n\n\t\tif(this.views) {\n\n\t\t\tthis.views.forEach(function(view: IframeView){\n\t\t\t\tif (view) {\n\t\t\t\t\tview.setLayout(layout);\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\tupdateWritingMode(mode: string): void {\n\t\tthis.writingMode = mode;\n\t}\n\n\tupdateAxis(axis: string, forceUpdate?: boolean): void {\n\n\t\tif (!forceUpdate && axis === this.settings.axis) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.settings.axis = axis;\n\n\t\tthis.stage && this.stage.axis(axis);\n\n\t\tthis.viewSettings.axis = axis;\n\n\t\tif (this.mapping) {\n\t\t\tthis.mapping = new Mapping(this.layout.props, this.settings.direction, this.settings.axis);\n\t\t}\n\n\t\tif (this.layout) {\n\t\t\tif (axis === \"vertical\") {\n\t\t\t\tthis.layout.spread(\"none\");\n\t\t\t} else {\n\t\t\t\tthis.layout.spread(this.layout.settings.spread);\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateFlow(flow: string, defaultScrolledOverflow: string = \"auto\"): void {\n\t\tconst isPaginated = (flow === \"paginated\" || flow === \"auto\");\n\n\t\tthis.isPaginated = isPaginated;\n\n\t\tif (flow === \"scrolled-doc\" ||\n\t\t\t\tflow === \"scrolled-continuous\" ||\n\t\t\t\tflow === \"scrolled\") {\n\t\t\tthis.updateAxis(\"vertical\");\n\t\t} else {\n\t\t\tthis.updateAxis(\"horizontal\");\n\t\t}\n\n\t\tthis.viewSettings.flow = flow;\n\n\t\tif (!this.settings.overflow) {\n\t\t\tthis.overflow = isPaginated ? \"hidden\" : defaultScrolledOverflow;\n\t\t} else {\n\t\t\tthis.overflow = this.settings.overflow;\n\t\t}\n\n\t\tthis.stage && this.stage.overflow(this.overflow);\n\n\t\tthis.updateLayout();\n\n\t}\n\n\tgetContents(): Contents[] {\n\t\tconst contents: Contents[] = [];\n\t\tif (!this.views) {\n\t\t\treturn contents;\n\t\t}\n\t\tthis.views.forEach(function(view: IframeView){\n\t\t\tconst viewContents = view && view.contents;\n\t\t\tif (viewContents) {\n\t\t\t\tcontents.push(viewContents);\n\t\t\t}\n\t\t});\n\t\treturn contents;\n\t}\n\n\tdirection(dir: string = \"ltr\"): void {\n\t\tthis.settings.direction = dir;\n\n\t\tthis.stage && this.stage.direction(dir);\n\n\t\tthis.viewSettings.direction = dir;\n\n\t\tthis.updateLayout();\n\t}\n\n\tisRendered(): boolean {\n\t\treturn this.rendered;\n\t}\n}\n\n//-- Enable binding events to Manager\nEventEmitter(DefaultViewManager.prototype);\n\nexport default DefaultViewManager;\n","import {extend, defer} from \"../../utils/core\";\nimport { EVENTS } from \"../../utils/constants\";\nimport EventEmitter from \"../../utils/event-emitter\";\nimport type { IEventEmitter } from \"../../types\";\nimport type DefaultViewManager from \"../default/index\";\nimport type Contents from \"../../contents\";\nimport type Layout from \"../../layout\";\n\n// easing equations from https://github.com/danro/easing-js/blob/master/easing.js\nconst PI_D2 = (Math.PI / 2);\nconst EASING_EQUATIONS = {\n\t\teaseOutSine: function (pos: number) {\n\t\t\t\treturn Math.sin(pos * PI_D2);\n\t\t},\n\t\teaseInOutSine: function (pos: number) {\n\t\t\t\treturn (-0.5 * (Math.cos(Math.PI * pos) - 1));\n\t\t},\n\t\teaseInOutQuint: function (pos: number) {\n\t\t\t\tif ((pos /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * Math.pow(pos, 5);\n\t\t\t\t}\n\t\t\t\treturn 0.5 * (Math.pow((pos - 2), 5) + 2);\n\t\t},\n\t\teaseInCubic: function(pos: number) {\n\t\t\treturn Math.pow(pos, 3);\n \t}\n};\n\nclass Snap implements IEventEmitter {\n\tsettings: { duration: number; minVelocity: number; minDistance: number; easing: (pos: number) => number; [key: string]: any };\n\tmanager: DefaultViewManager;\n\tlayout: Layout;\n\tfullsize: boolean;\n\telement: HTMLElement;\n\tscroller: HTMLElement | Window;\n\tisVertical: boolean;\n\ttouchCanceler: boolean;\n\tresizeCanceler: boolean;\n\tsnapping: boolean;\n\tscrollLeft: number;\n\tscrollTop: number;\n\tstartTouchX: number;\n\tstartTouchY: number;\n\tstartTime: number;\n\tendTouchX: number;\n\tendTouchY: number;\n\tendTime: number;\n\t_onResize: (...args: any[]) => void;\n\t_onScroll: (...args: any[]) => void;\n\t_onTouchStart: (...args: any[]) => void;\n\t_onTouchMove: (...args: any[]) => void;\n\t_onTouchEnd: (...args: any[]) => void;\n\t_afterDisplayed: (...args: any[]) => void;\n\n\tdeclare on: IEventEmitter[\"on\"];\n\tdeclare off: IEventEmitter[\"off\"];\n\tdeclare emit: IEventEmitter[\"emit\"];\n\n\tconstructor(manager: DefaultViewManager, options?: Record<string, any>) {\n\n\t\tthis.settings = extend({\n\t\t\tduration: 80,\n\t\t\tminVelocity: 0.2,\n\t\t\tminDistance: 10,\n\t\t\teasing: EASING_EQUATIONS[\"easeInCubic\"]\n\t\t}, options || {});\n\n\t\t(this as any).supportsTouch = this.supportsTouch();\n\n\t\tif ((this as any).supportsTouch) {\n\t\t\tthis.setup(manager);\n\t\t}\n\t}\n\n\tsetup(manager: DefaultViewManager): void {\n\t\tthis.manager = manager;\n\n\t\tthis.layout = this.manager.layout;\n\n\t\tthis.fullsize = this.manager.settings.fullsize ?? false;\n\t\tif (this.fullsize) {\n\t\t\tthis.element = this.manager.stage.element;\n\t\t\tthis.scroller = window;\n\t\t\tthis.disableScroll();\n\t\t} else {\n\t\t\tthis.element = this.manager.stage.container;\n\t\t\tthis.scroller = this.element;\n\t\t\t(this.element.style as any)[\"WebkitOverflowScrolling\"] = \"touch\";\n\t\t}\n\n\t\t// this.overflow = this.manager.overflow;\n\n\t\t// set lookahead offset to page width\n\t\tthis.manager.settings.offset = this.layout.width;\n\t\tthis.manager.settings.afterScrolledTimeout = this.settings.duration * 2;\n\n\t\tthis.isVertical = this.manager.settings.axis === \"vertical\";\n\n\t\t// disable snapping if not paginated or axis in not horizontal\n\t\tif (!this.manager.isPaginated || this.isVertical) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.touchCanceler = false;\n\t\tthis.resizeCanceler = false;\n\t\tthis.snapping = false;\n\n\n\t\tthis.scrollLeft;\n\t\tthis.scrollTop;\n\n\t\t(this as any).startTouchX = undefined;\n\t\t(this as any).startTouchY = undefined;\n\t\t(this as any).startTime = undefined;\n\t\t(this as any).endTouchX = undefined;\n\t\t(this as any).endTouchY = undefined;\n\t\t(this as any).endTime = undefined;\n\n\t\tthis.addListeners();\n\t}\n\n\tsupportsTouch(): boolean {\n\t\tif ((\"ontouchstart\" in window) || (window as any).DocumentTouch && document instanceof (window as any).DocumentTouch) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tdisableScroll(): void {\n\t\tthis.element.style.overflow = \"hidden\";\n\t}\n\n\tenableScroll(): void {\n\t\tthis.element.style.overflow = \"\";\n\t}\n\n\taddListeners(): void {\n\t\tthis._onResize = this.onResize.bind(this);\n\t\twindow.addEventListener(\"resize\", this._onResize);\n\n\t\tthis._onScroll = this.onScroll.bind(this);\n\t\tthis.scroller.addEventListener(\"scroll\", this._onScroll);\n\n\t\tthis._onTouchStart = this.onTouchStart.bind(this);\n\t\tthis.scroller.addEventListener(\"touchstart\", this._onTouchStart, { passive: true });\n\t\tthis.on(\"touchstart\", this._onTouchStart);\n\n\t\tthis._onTouchMove = this.onTouchMove.bind(this);\n\t\tthis.scroller.addEventListener(\"touchmove\", this._onTouchMove, { passive: true });\n\t\tthis.on(\"touchmove\", this._onTouchMove);\n\n\t\tthis._onTouchEnd = this.onTouchEnd.bind(this);\n\t\tthis.scroller.addEventListener(\"touchend\", this._onTouchEnd, { passive: true });\n\t\tthis.on(\"touchend\", this._onTouchEnd);\n\n\t\tthis._afterDisplayed = this.afterDisplayed.bind(this);\n\t\tthis.manager.on(EVENTS.MANAGERS.ADDED, this._afterDisplayed);\n\t}\n\n\tremoveListeners(): void {\n\t\twindow.removeEventListener(\"resize\", this._onResize);\n\t\t(this as any)._onResize = undefined;\n\n\t\tthis.scroller.removeEventListener(\"scroll\", this._onScroll);\n\t\t(this as any)._onScroll = undefined;\n\n\t\tthis.scroller.removeEventListener(\"touchstart\", this._onTouchStart, { passive: true } as EventListenerOptions);\n\t\tthis.off(\"touchstart\", this._onTouchStart);\n\t\t(this as any)._onTouchStart = undefined;\n\n\t\tthis.scroller.removeEventListener(\"touchmove\", this._onTouchMove, { passive: true } as EventListenerOptions);\n\t\tthis.off(\"touchmove\", this._onTouchMove);\n\t\t(this as any)._onTouchMove = undefined;\n\n\t\tthis.scroller.removeEventListener(\"touchend\", this._onTouchEnd, { passive: true } as EventListenerOptions);\n\t\tthis.off(\"touchend\", this._onTouchEnd);\n\t\t(this as any)._onTouchEnd = undefined;\n\n\t\tthis.manager.off(EVENTS.MANAGERS.ADDED, this._afterDisplayed);\n\t\t(this as any)._afterDisplayed = undefined;\n\t}\n\n\tafterDisplayed(view: { contents: Contents }): void {\n\t\tconst contents = view.contents;\n\t\t[\"touchstart\", \"touchmove\", \"touchend\"].forEach((e) => {\n\t\t\tcontents.on(e, (ev: TouchEvent) => this.triggerViewEvent(ev, contents));\n\t\t});\n\t}\n\n\ttriggerViewEvent(e: TouchEvent, contents: Contents): void {\n\t\tthis.emit(e.type, e, contents);\n\t}\n\n\tonScroll(_e?: Event): void {\n\t\tthis.scrollLeft = this.fullsize ? window.scrollX : (this.scroller as HTMLElement).scrollLeft;\n\t\tthis.scrollTop = this.fullsize ? window.scrollY : (this.scroller as HTMLElement).scrollTop;\n\t}\n\n\tonResize(_e?: Event): void {\n\t\tthis.resizeCanceler = true;\n\t}\n\n\tonTouchStart(e: TouchEvent): void {\n\t\tconst { screenX, screenY } = e.touches[0];\n\n\t\tif (this.fullsize) {\n\t\t\tthis.enableScroll();\n\t\t}\n\n\t\tthis.touchCanceler = true;\n\n\t\tif (!this.startTouchX) {\n\t\t\tthis.startTouchX = screenX;\n\t\t\tthis.startTouchY = screenY;\n\t\t\tthis.startTime = this.now();\n\t\t}\n\n\t\tthis.endTouchX = screenX;\n\t\tthis.endTouchY = screenY;\n\t\tthis.endTime = this.now();\n\t}\n\n\tonTouchMove(e: TouchEvent): void {\n\t\tconst { screenX, screenY } = e.touches[0];\n\t\tconst deltaY = Math.abs(screenY - this.endTouchY);\n\n\t\tthis.touchCanceler = true;\n\n\n\t\tif (!this.fullsize && deltaY < 10) {\n\t\t\tthis.element.scrollLeft -= screenX - this.endTouchX;\n\t\t}\n\n\t\tthis.endTouchX = screenX;\n\t\tthis.endTouchY = screenY;\n\t\tthis.endTime = this.now();\n\t}\n\n\tonTouchEnd(_e?: TouchEvent): void {\n\t\tif (this.fullsize) {\n\t\t\tthis.disableScroll();\n\t\t}\n\n\t\tthis.touchCanceler = false;\n\n\t\tconst swipped = this.wasSwiped();\n\n\t\tif (swipped !== 0) {\n\t\t\tthis.snap(swipped);\n\t\t} else {\n\t\t\tthis.snap();\n\t\t}\n\n\t\t(this as any).startTouchX = undefined;\n\t\t(this as any).startTouchY = undefined;\n\t\t(this as any).startTime = undefined;\n\t\t(this as any).endTouchX = undefined;\n\t\t(this as any).endTouchY = undefined;\n\t\t(this as any).endTime = undefined;\n\t}\n\n\twasSwiped(): number {\n\t\tconst snapWidth = this.layout.pageWidth * this.layout.divisor;\n\t\tconst distance = (this.endTouchX - this.startTouchX);\n\t\tconst absolute = Math.abs(distance);\n\t\tconst time = this.endTime - this.startTime;\n\t\tconst velocity = (distance / time);\n\t\tconst minVelocity = this.settings.minVelocity;\n\n\t\tif (absolute <= this.settings.minDistance || absolute >= snapWidth) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (velocity > minVelocity) {\n\t\t\t// previous\n\t\t\treturn -1;\n\t\t} else if (velocity < -minVelocity) {\n\t\t\t// next\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tneedsSnap(): boolean {\n\t\tconst left = this.scrollLeft;\n\t\tconst snapWidth = this.layout.pageWidth * this.layout.divisor;\n\t\treturn (left % snapWidth) !== 0;\n\t}\n\n\tsnap(howMany: number = 0): Promise<void> {\n\t\tconst left = this.scrollLeft;\n\t\tconst snapWidth = this.layout.pageWidth * this.layout.divisor;\n\t\tlet snapTo = Math.round(left / snapWidth) * snapWidth;\n\n\t\tif (howMany) {\n\t\t\tsnapTo += (howMany * snapWidth);\n\t\t}\n\n\t\treturn this.smoothScrollTo(snapTo);\n\t}\n\n\tsmoothScrollTo(destination: number): Promise<void> {\n\t\tconst deferred = new defer();\n\t\tconst start = this.scrollLeft;\n\t\tconst startTime = this.now();\n\n\t\tconst duration = this.settings.duration;\n\t\tconst easing = this.settings.easing;\n\n\t\tthis.snapping = true;\n\n\t\t// add animation loop\n\t\tfunction tick() {\n\t\t\tconst now = this.now();\n\t\t\tconst time = Math.min(1, ((now - startTime) / duration));\n\t\t\tconst _timeFunction = easing(time);\n\n\n\t\t\tif (this.touchCanceler || this.resizeCanceler) {\n\t\t\t\tthis.resizeCanceler = false;\n\t\t\t\tthis.snapping = false;\n\t\t\t\tdeferred.resolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (time < 1) {\n\t\t\t\t\twindow.requestAnimationFrame(tick.bind(this));\n\t\t\t\t\tthis.scrollTo(start + ((destination - start) * time), 0);\n\t\t\t} else {\n\t\t\t\t\tthis.scrollTo(destination, 0);\n\t\t\t\t\tthis.snapping = false;\n\t\t\t\t\tdeferred.resolve();\n\t\t\t}\n\t\t}\n\n\t\ttick.call(this);\n\n\t\treturn deferred.promise;\n\t}\n\n\tscrollTo(left: number = 0, top: number = 0): void {\n\t\tif (this.fullsize) {\n\t\t\twindow.scroll(left, top);\n\t\t} else {\n\t\t\t(this.scroller as HTMLElement).scrollLeft = left;\n\t\t\t(this.scroller as HTMLElement).scrollTop = top;\n\t\t}\n\t}\n\n\tnow(): number {\n\t\treturn (\"now\" in window.performance) ? performance.now() : new Date().getTime();\n\t}\n\n\tdestroy(): void {\n\t\tif (!this.scroller) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.fullsize) {\n\t\t\tthis.enableScroll();\n\t\t}\n\n\t\tthis.removeListeners();\n\n\t\t(this as any).scroller = undefined;\n\t}\n}\n\nEventEmitter(Snap.prototype);\n\nexport default Snap;\n","import {extend, defer, requestAnimationFrame} from \"../../utils/core\";\nimport DefaultViewManager from \"../default\";\nimport Snap from \"../helpers/snap\";\nimport { EVENTS } from \"../../utils/constants\";\nimport type Section from \"../../section\";\nimport type IframeView from \"../views/iframe\";\nimport type Stage from \"../helpers/stage\";\nimport type { ManagerOptions, ReframeBounds } from \"../../types\";\nfunction debounce(func: Function, wait: number): () => void {\n\tlet timeout: ReturnType<typeof setTimeout>;\n\treturn function() {\n\t\tconst context = this;\n\t\tconst args = arguments;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(function() {\n\t\t\tfunc.apply(context, args);\n\t\t}, wait);\n\t};\n}\n\nclass ContinuousViewManager extends DefaultViewManager {\n\tsnapper: Snap;\n\ttick: typeof requestAnimationFrame;\n\tscrollDeltaVert: number;\n\tscrollDeltaHorz: number;\n\t_scrolled: (...args: any[]) => void;\n\tdidScroll: boolean;\n\tprevScrollTop: number;\n\tprevScrollLeft: number;\n\tscrollTimeout: ReturnType<typeof setTimeout>;\n\ttrimTimeout: ReturnType<typeof setTimeout>;\n\n\tconstructor(options: ManagerOptions) {\n\t\tsuper(options);\n\n\t\tthis.name = \"continuous\";\n\n\t\tthis.settings = extend(this.settings || {}, {\n\t\t\tinfinite: true,\n\t\t\toverflow: undefined,\n\t\t\taxis: undefined,\n\t\t\twritingMode: undefined,\n\t\t\tflow: \"scrolled\",\n\t\t\toffset: 500,\n\t\t\toffsetDelta: 250,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t\tsnap: false,\n\t\t\tafterScrolledTimeout: 10,\n\t\t\tallowScriptedContent: false,\n\t\t\tallowPopups: false\n\t\t});\n\n\t\textend(this.settings, options.settings || {});\n\n\t\t// Gap can be 0, but defaults doesn't handle that\n\t\tif (options.settings.gap != \"undefined\" && options.settings.gap === 0) {\n\t\t\tthis.settings.gap = options.settings.gap;\n\t\t}\n\n\t\tthis.viewSettings = {\n\t\t\tignoreClass: this.settings.ignoreClass,\n\t\t\taxis: this.settings.axis,\n\t\t\tflow: this.settings.flow,\n\t\t\tlayout: this.layout,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tforceEvenPages: false,\n\t\t\tallowScriptedContent: this.settings.allowScriptedContent,\n\t\t\tallowPopups: this.settings.allowPopups\n\t\t};\n\n\t\tthis.scrollTop = 0;\n\t\tthis.scrollLeft = 0;\n\t}\n\n\tdisplay(section: Section, target?: string): Promise<any> {\n\t\treturn DefaultViewManager.prototype.display.call(this, section, target)\n\t\t\t.then(function () {\n\t\t\t\treturn this.fill();\n\t\t\t}.bind(this));\n\t}\n\n\tfill(_full?: InstanceType<typeof defer>): Promise<any> {\n\t\tconst full = _full || new defer();\n\n\t\tthis.q.enqueue(() => {\n\t\t\treturn this.check();\n\t\t}).then((result: boolean) => {\n\t\t\tif (result) {\n\t\t\t\tthis.fill(full);\n\t\t\t} else {\n\t\t\t\tfull.resolve();\n\t\t\t}\n\t\t});\n\n\t\treturn full.promise;\n\t}\n\n\tmoveTo(offset: { left: number; top: number }): void {\n\t\t// var bounds = this.stage.bounds();\n\t\t// var dist = Math.floor(offset.top / bounds.height) * bounds.height;\n\t\tlet distX = 0,\n\t\t\t\tdistY = 0;\n\n\t\tlet _offsetX = 0,\n\t\t\t\t_offsetY = 0;\n\n\t\tif(!this.isPaginated) {\n\t\t\tdistY = offset.top;\n\t\t\t_offsetY = offset.top+this.settings.offsetDelta;\n\t\t} else {\n\t\t\tdistX = Math.floor(offset.left / this.layout.delta) * this.layout.delta;\n\t\t\t_offsetX = distX+this.settings.offsetDelta;\n\t\t}\n\n\t\tif (distX > 0 || distY > 0) {\n\t\t\tthis.scrollBy(distX, distY, true);\n\t\t}\n\t}\n\n\tafterResized(view: IframeView): void {\n\t\tthis.emit(EVENTS.MANAGERS.RESIZE, view.section);\n\t}\n\n\t// Remove Previous Listeners if present\n\tremoveShownListeners(view: IframeView): void {\n\n\t\t// view.off(\"shown\", this.afterDisplayed);\n\t\t// view.off(\"shown\", this.afterDisplayedAbove);\n\t\tview.onDisplayed = function(){};\n\n\t}\n\n\tadd(section: Section): Promise<any> {\n\t\tconst view = this.createView(section);\n\n\t\tthis.views.append(view);\n\n\t\tview.on(EVENTS.VIEWS.RESIZED, (_bounds: ReframeBounds) => {\n\t\t\t(view as any).expanded = true;\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.AXIS, (axis: string) => {\n\t\t\tthis.updateAxis(axis);\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.WRITING_MODE, (mode: string) => {\n\t\t\tthis.updateWritingMode(mode);\n\t\t});\n\n\t\t// view.on(EVENTS.VIEWS.SHOWN, this.afterDisplayed.bind(this));\n\t\tview.onDisplayed = this.afterDisplayed.bind(this);\n\t\tview.onResize = this.afterResized.bind(this);\n\n\t\treturn view.display(this.request);\n\t}\n\n\tappend(section: Section): any {\n\t\tconst view = this.createView(section);\n\n\t\tview.on(EVENTS.VIEWS.RESIZED, (_bounds: ReframeBounds) => {\n\t\t\t(view as any).expanded = true;\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.AXIS, (axis: string) => {\n\t\t\tthis.updateAxis(axis);\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.WRITING_MODE, (mode: string) => {\n\t\t\tthis.updateWritingMode(mode);\n\t\t});\n\n\t\tthis.views.append(view);\n\n\t\tview.onDisplayed = this.afterDisplayed.bind(this);\n\n\t\treturn view;\n\t}\n\n\tprepend(section: Section): any {\n\t\tconst view = this.createView(section);\n\n\t\tview.on(EVENTS.VIEWS.RESIZED, (_bounds: ReframeBounds) => {\n\t\t\tthis.counter(_bounds);\n\t\t\t(view as any).expanded = true;\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.AXIS, (axis: string) => {\n\t\t\tthis.updateAxis(axis);\n\t\t});\n\n\t\tview.on(EVENTS.VIEWS.WRITING_MODE, (mode: string) => {\n\t\t\tthis.updateWritingMode(mode);\n\t\t});\n\n\t\tthis.views.prepend(view);\n\n\t\tview.onDisplayed = this.afterDisplayed.bind(this);\n\n\t\treturn view;\n\t}\n\n\tcounter(bounds: ReframeBounds): void {\n\t\tif(this.settings.axis === \"vertical\") {\n\t\t\tthis.scrollBy(0, bounds.heightDelta, true);\n\t\t} else {\n\t\t\tthis.scrollBy(bounds.widthDelta, 0, true);\n\t\t}\n\t}\n\n\tupdate(_offset?: number): Promise<any> {\n\t\tconst container = this.bounds();\n\t\tconst views = this.views.all();\n\t\tconst viewsLength = views.length;\n\t\tconst visible = [];\n\t\tconst offset = typeof _offset != \"undefined\" ? _offset : (this.settings.offset || 0);\n\t\tlet isVisible;\n\t\tlet view: IframeView;\n\n\t\tconst updating = new defer();\n\t\tconst promises = [];\n\t\tfor (let i = 0; i < viewsLength; i++) {\n\t\t\tview = views[i];\n\n\t\t\tisVisible = this.isVisible(view, offset, offset, container);\n\n\t\t\tif(isVisible === true) {\n\t\t\t\t// console.log(\"visible \" + view.index, view.displayed);\n\n\t\t\t\tif (!view.displayed) {\n\t\t\t\t\tconst displayed = view.display(this.request)\n\t\t\t\t\t\t.then(function (view: IframeView) {\n\t\t\t\t\t\t\tview.show();\n\t\t\t\t\t\t}, (_err: Error) => {\n\t\t\t\t\t\t\tview.hide();\n\t\t\t\t\t\t});\n\t\t\t\t\tpromises.push(displayed);\n\t\t\t\t} else {\n\t\t\t\t\tview.show();\n\t\t\t\t}\n\t\t\t\tvisible.push(view);\n\t\t\t} else {\n\t\t\t\tthis.q.enqueue(view.destroy.bind(view));\n\t\t\t\t// console.log(\"hidden \" + view.index, view.displayed);\n\n\t\t\t\tclearTimeout(this.trimTimeout);\n\t\t\t\tthis.trimTimeout = setTimeout(function(){\n\t\t\t\t\tthis.q.enqueue(this.trim.bind(this));\n\t\t\t\t}.bind(this), 250);\n\t\t\t}\n\n\t\t}\n\n\t\tif(promises.length){\n\t\t\treturn Promise.all(promises)\n\t\t\t\t.catch((err: Error) => {\n\t\t\t\t\tupdating.reject(err);\n\t\t\t\t});\n\t\t} else {\n\t\t\tupdating.resolve();\n\t\t\treturn updating.promise;\n\t\t}\n\n\t}\n\n\tcheck(_offsetLeft?: number, _offsetTop?: number): Promise<any> {\n\t\tconst checking = new defer();\n\t\tconst newViews: IframeView[] = [];\n\n\t\tconst horizontal = (this.settings.axis === \"horizontal\");\n\t\tlet delta = this.settings.offset || 0;\n\n\t\tif (_offsetLeft && horizontal) {\n\t\t\tdelta = _offsetLeft;\n\t\t}\n\n\t\tif (_offsetTop && !horizontal) {\n\t\t\tdelta = _offsetTop;\n\t\t}\n\n\t\tconst bounds = this._bounds; // bounds saved this until resize\n\n\t\tlet offset = horizontal ? this.scrollLeft : this.scrollTop;\n\t\tconst visibleLength = horizontal ? Math.floor(bounds.width) : bounds.height;\n\t\tconst contentLength = horizontal ? this.container.scrollWidth : this.container.scrollHeight;\n\t\tconst writingMode = (this.writingMode && this.writingMode.indexOf(\"vertical\") === 0) ? \"vertical\" : \"horizontal\";\n\t\tconst rtlScrollType = this.settings.rtlScrollType;\n\t\tconst rtl = this.settings.direction === \"rtl\";\n\n\t\tif (!this.settings.fullsize) {\n\t\t\t// Scroll offset starts at width of element\n\t\t\tif (rtl && rtlScrollType === \"default\" && writingMode === \"horizontal\") {\n\t\t\t\toffset = contentLength - visibleLength - offset;\n\t\t\t}\n\t\t\t// Scroll offset starts at 0 and goes negative\n\t\t\tif (rtl && rtlScrollType === \"negative\" && writingMode === \"horizontal\") {\n\t\t\t\toffset = offset * -1;\n\t\t\t}\n\t\t} else {\n\t\t\t// Scroll offset starts at 0 and goes negative\n\t\t\tif ((horizontal && rtl && rtlScrollType === \"negative\") ||\n\t\t\t\t(!horizontal && rtl && rtlScrollType === \"default\")) {\n\t\t\t\toffset = offset * -1;\n\t\t\t}\n\t\t}\n\n\t\tconst prepend = () => {\n\t\t\tconst first = this.views.first();\n\t\t\tconst prev: any = first && first.section.prev();\n\n\t\t\tif(prev) {\n\t\t\t\tnewViews.push(this.prepend(prev));\n\t\t\t}\n\t\t};\n\n\t\tconst append = () => {\n\t\t\tconst last = this.views.last();\n\t\t\tconst next: any = last && last.section.next();\n\n\t\t\tif(next) {\n\t\t\t\tnewViews.push(this.append(next));\n\t\t\t}\n\n\t\t};\n\n\t\tconst end = offset + visibleLength + delta;\n\t\tconst start = offset - delta;\n\n\t\tif (end >= contentLength) {\n\t\t\tappend();\n\t\t}\n\t\t\n\t\tif (start < 0) {\n\t\t\tprepend();\n\t\t}\n\t\t\n\n\t\tconst promises = newViews.map((view) => {\n\t\t\treturn view.display(this.request);\n\t\t});\n\n\t\tif(newViews.length){\n\t\t\treturn Promise.all(promises)\n\t\t\t\t.then(() => {\n\t\t\t\t\treturn this.check();\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\t// Check to see if anything new is on screen after rendering\n\t\t\t\t\treturn this.update(delta);\n\t\t\t\t}, (err: Error) => {\n\t\t\t\t\treturn err;\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.q.enqueue(function(){\n\t\t\t\tthis.update();\n\t\t\t}.bind(this));\n\t\t\tchecking.resolve(false);\n\t\t\treturn checking.promise;\n\t\t}\n\n\n\t}\n\n\ttrim(): Promise<any> {\n\t\tconst task = new defer();\n\t\tconst displayed = this.views.displayed();\n\t\tconst first = displayed[0];\n\t\tconst last = displayed[displayed.length-1];\n\t\tconst firstIndex = this.views.indexOf(first);\n\t\tconst lastIndex = this.views.indexOf(last);\n\t\tconst above = this.views.slice(0, firstIndex);\n\t\tconst below = this.views.slice(lastIndex+1);\n\n\t\t// Erase all but last above\n\t\tfor (let i = 0; i < above.length-1; i++) {\n\t\t\tthis.erase(above[i], above);\n\t\t}\n\n\t\t// Erase all except first below\n\t\tfor (let j = 1; j < below.length; j++) {\n\t\t\tthis.erase(below[j]);\n\t\t}\n\n\t\ttask.resolve();\n\t\treturn task.promise;\n\t}\n\n\terase(view: IframeView, above?: IframeView[]): void { //Trim\n\n\t\tlet prevTop;\n\t\tlet prevLeft;\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tprevTop = this.container.scrollTop;\n\t\t\tprevLeft = this.container.scrollLeft;\n\t\t} else {\n\t\t\tprevTop = window.scrollY;\n\t\t\tprevLeft = window.scrollX;\n\t\t}\n\n\t\tconst bounds = view.bounds();\n\n\t\tthis.views.remove(view);\n\t\t\n\t\tif(above) {\n\t\t\tif (this.settings.axis === \"vertical\") {\n\t\t\t\tthis.scrollTo(0, prevTop - bounds.height, true);\n\t\t\t} else {\n\t\t\t\tif(this.settings.direction === \"rtl\") {\n\t\t\t\t\tif (!this.settings.fullsize) {\n\t\t\t\t\t\tthis.scrollTo(prevLeft, 0, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.scrollTo(prevLeft + Math.floor(bounds.width), 0, true);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollTo(prevLeft - Math.floor(bounds.width), 0, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\taddEventListeners(_stage?: Stage): void {\n\n\t\twindow.addEventListener(\"unload\", function(_e: Event){\n\t\t\tthis.ignore = true;\n\t\t\t// this.scrollTo(0,0);\n\t\t\tthis.destroy();\n\t\t}.bind(this));\n\n\t\tthis.addScrollListeners();\n\n\t\tif (this.isPaginated && this.settings.snap) {\n\t\t\tthis.snapper = new Snap(this, (typeof this.settings.snap === \"object\") ? this.settings.snap as Record<string, any> : undefined);\n\t\t}\n\t}\n\n\taddScrollListeners(): void {\n\t\tlet scroller;\n\n\t\tthis.tick = requestAnimationFrame;\n\n\t\tconst dir = this.settings.direction === \"rtl\" && this.settings.rtlScrollType === \"default\" ? -1 : 1;\n\n\t\tthis.scrollDeltaVert = 0;\n\t\tthis.scrollDeltaHorz = 0;\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tscroller = this.container;\n\t\t\tthis.scrollTop = this.container.scrollTop;\n\t\t\tthis.scrollLeft = this.container.scrollLeft;\n\t\t} else {\n\t\t\tscroller = window;\n\t\t\tthis.scrollTop = window.scrollY * dir;\n\t\t\tthis.scrollLeft = window.scrollX * dir;\n\t\t}\n\n\t\tthis._onScroll = this.onScroll.bind(this);\n\t\tscroller.addEventListener(\"scroll\", this._onScroll);\n\t\tthis._scrolled = debounce(this.scrolled.bind(this), 30);\n\t\t// this.tick.call(window, this.onScroll.bind(this));\n\n\t\tthis.didScroll = false;\n\n\t}\n\n\tremoveEventListeners(): void {\n\t\tlet scroller;\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tscroller = this.container;\n\t\t} else {\n\t\t\tscroller = window;\n\t\t}\n\n\t\tscroller.removeEventListener(\"scroll\", this._onScroll);\n\t\t(this as any)._onScroll = undefined;\n\t}\n\n\tonScroll(): void {\n\t\tlet scrollTop;\n\t\tlet scrollLeft;\n\t\tconst dir = this.settings.direction === \"rtl\" && this.settings.rtlScrollType === \"default\" ? -1 : 1;\n\n\t\tif(!this.settings.fullsize) {\n\t\t\tscrollTop = this.container.scrollTop;\n\t\t\tscrollLeft = this.container.scrollLeft;\n\t\t} else {\n\t\t\tscrollTop = window.scrollY * dir;\n\t\t\tscrollLeft = window.scrollX * dir;\n\t\t}\n\n\t\tthis.scrollTop = scrollTop;\n\t\tthis.scrollLeft = scrollLeft;\n\n\t\tif(!this.ignore) {\n\n\t\t\tthis._scrolled();\n\n\t\t} else {\n\t\t\tthis.ignore = false;\n\t\t}\n\n\t\tthis.scrollDeltaVert += Math.abs(scrollTop-this.prevScrollTop);\n\t\tthis.scrollDeltaHorz += Math.abs(scrollLeft-this.prevScrollLeft);\n\n\t\tthis.prevScrollTop = scrollTop;\n\t\tthis.prevScrollLeft = scrollLeft;\n\n\t\tclearTimeout(this.scrollTimeout);\n\t\tthis.scrollTimeout = setTimeout(function(){\n\t\t\tthis.scrollDeltaVert = 0;\n\t\t\tthis.scrollDeltaHorz = 0;\n\t\t}.bind(this), 150);\n\n\t\tclearTimeout(this.afterScrolled);\n\n\t\tthis.didScroll = false;\n\n\t}\n\n\tscrolled(): void {\n\n\t\tthis.q.enqueue(function() {\n\t\t\treturn this.check();\n\t\t}.bind(this));\n\n\t\tthis.emit(EVENTS.MANAGERS.SCROLL, {\n\t\t\ttop: this.scrollTop,\n\t\t\tleft: this.scrollLeft\n\t\t});\n\n\t\tclearTimeout(this.afterScrolled);\n\t\tthis.afterScrolled = setTimeout(function () {\n\n\t\t\t// Don't report scroll if we are about the snap\n\t\t\tif (this.snapper && this.snapper.supportsTouch && this.snapper.needsSnap()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.emit(EVENTS.MANAGERS.SCROLLED, {\n\t\t\t\ttop: this.scrollTop,\n\t\t\t\tleft: this.scrollLeft\n\t\t\t});\n\n\t\t}.bind(this), this.settings.afterScrolledTimeout);\n\t}\n\n\tnext(): void {\n\n\t\tconst delta = this.layout.props.name === \"pre-paginated\" &&\n\t\t\t\t\t\t\t\tthis.layout.props.spread ? this.layout.props.delta * 2 : this.layout.props.delta;\n\n\t\tif(!this.views.length) return;\n\n\t\tif(this.isPaginated && this.settings.axis === \"horizontal\") {\n\n\t\t\tthis.scrollBy(delta, 0, true);\n\n\t\t} else {\n\n\t\t\tthis.scrollBy(0, this.layout.height, true);\n\n\t\t}\n\n\t\tthis.q.enqueue(function() {\n\t\t\treturn this.check();\n\t\t}.bind(this));\n\t}\n\n\tprev(): void {\n\n\t\tconst delta = this.layout.props.name === \"pre-paginated\" &&\n\t\t\t\t\t\t\t\tthis.layout.props.spread ? this.layout.props.delta * 2 : this.layout.props.delta;\n\n\t\tif(!this.views.length) return;\n\n\t\tif(this.isPaginated && this.settings.axis === \"horizontal\") {\n\n\t\t\tthis.scrollBy(-delta, 0, true);\n\n\t\t} else {\n\n\t\t\tthis.scrollBy(0, -this.layout.height, true);\n\n\t\t}\n\n\t\tthis.q.enqueue(function() {\n\t\t\treturn this.check();\n\t\t}.bind(this));\n\t}\n\n\tupdateFlow(flow: string): void {\n\t\tif (this.rendered && this.snapper) {\n\t\t\tthis.snapper.destroy();\n\t\t\t(this as any).snapper = undefined;\n\t\t}\n\n\t\tsuper.updateFlow(flow, \"scroll\");\n\n\t\tif (this.rendered && this.isPaginated && this.settings.snap) {\n\t\t\tthis.snapper = new Snap(this, (typeof this.settings.snap === \"object\") ? this.settings.snap as Record<string, any> : undefined);\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tsuper.destroy();\n\n\t\tif (this.snapper) {\n\t\t\tthis.snapper.destroy();\n\t\t}\n\t}\n\n}\n\nexport default ContinuousViewManager;\n","import EventEmitter from \"./utils/event-emitter\";\nimport { extend, defer, isFloat } from \"./utils/core\";\nimport Hook from \"./utils/hook\";\nimport EpubCFI from \"./epubcfi\";\nimport Queue from \"./utils/queue\";\nimport Layout from \"./layout\";\n// import Mapping from \"./mapping\";\nimport Themes from \"./themes\";\nimport Contents from \"./contents\";\nimport Annotations from \"./annotations\";\nimport { EVENTS, DOM_EVENTS } from \"./utils/constants\";\nimport type { IEventEmitter, RenditionOptions, Location, GlobalLayout, ViewLocation, SizeObject, PackagingMetadataObject } from \"./types\";\nimport type Book from \"./book\";\nimport type Section from \"./section\";\n\n// Default Views\nimport IframeView from \"./managers/views/iframe\";\n\n// Default View Managers\nimport DefaultViewManager from \"./managers/default/index\";\nimport ContinuousViewManager from \"./managers/continuous/index\";\n\n/**\n * Displays an Epub as a series of Views for each Section.\n * Requires Manager and View class to handle specifics of rendering\n * the section content.\n * @class\n * @param {Book} book\n * @param {object} [options]\n * @param {number} [options.width]\n * @param {number} [options.height]\n * @param {string} [options.ignoreClass] class for the cfi parser to ignore\n * @param {string | function | object} [options.manager='default']\n * @param {string | function} [options.view='iframe']\n * @param {string} [options.layout] layout to force\n * @param {string} [options.spread] force spread value\n * @param {number} [options.minSpreadWidth] overridden by spread: none (never) / both (always)\n * @param {string} [options.stylesheet] url of stylesheet to be injected\n * @param {boolean} [options.resizeOnOrientationChange] false to disable orientation events\n * @param {string} [options.script] url of script to be injected\n * @param {boolean | object} [options.snap=false] use snap scrolling\n * @param {string} [options.defaultDirection='ltr'] default text direction\n * @param {boolean} [options.allowScriptedContent=false] enable running scripts in content\n * @param {boolean} [options.allowPopups=false] enable opening popup in content\n */\ninterface RenditionHooks {\n\tdisplay: Hook;\n\tserialize: Hook;\n\tcontent: Hook;\n\tunloaded: Hook;\n\tlayout: Hook;\n\trender: Hook;\n\tshow: Hook;\n}\n\nclass Rendition implements IEventEmitter {\n\tsettings: RenditionOptions & Record<string, any>;\n\tbook: Book | undefined;\n\thooks: RenditionHooks;\n\tthemes: Themes;\n\tannotations: Annotations;\n\tepubcfi: EpubCFI;\n\tq: Queue;\n\tlocation: Location | undefined;\n\tstarting: defer;\n\tstarted: Promise<void>;\n\tmanager: DefaultViewManager | undefined;\n\tViewManager: typeof DefaultViewManager | typeof ContinuousViewManager | Function;\n\tView: typeof IframeView | Function;\n\t_layout: Layout | undefined;\n\tdisplaying: defer | undefined;\n\n\tdeclare on: IEventEmitter[\"on\"];\n\tdeclare off: IEventEmitter[\"off\"];\n\tdeclare emit: IEventEmitter[\"emit\"];\n\n\tconstructor(book: Book, options?: RenditionOptions) {\n\n\t\tthis.settings = extend(this.settings || {}, {\n\t\t\twidth: null,\n\t\t\theight: null,\n\t\t\tignoreClass: \"\",\n\t\t\tmanager: \"default\",\n\t\t\tview: \"iframe\",\n\t\t\tflow: null,\n\t\t\tlayout: null,\n\t\t\tspread: null,\n\t\t\tminSpreadWidth: 800,\n\t\t\tstylesheet: null,\n\t\t\tresizeOnOrientationChange: true,\n\t\t\tscript: null,\n\t\t\tsnap: false,\n\t\t\tdefaultDirection: \"ltr\",\n\t\t\tallowScriptedContent: false,\n\t\t\tallowPopups: false\n\t\t});\n\n\t\textend(this.settings, options);\n\n\t\tif (typeof(this.settings.manager) === \"object\") {\n\t\t\tthis.manager = this.settings.manager as DefaultViewManager;\n\t\t}\n\n\t\tthis.book = book;\n\n\t\t/**\n\t\t * Adds Hook methods to the Rendition prototype\n\t\t * @member {object} hooks\n\t\t * @property {Hook} hooks.content\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.hooks = {} as RenditionHooks;\n\t\tthis.hooks.display = new Hook(this);\n\t\tthis.hooks.serialize = new Hook(this);\n\t\tthis.hooks.content = new Hook(this);\n\t\tthis.hooks.unloaded = new Hook(this);\n\t\tthis.hooks.layout = new Hook(this);\n\t\tthis.hooks.render = new Hook(this);\n\t\tthis.hooks.show = new Hook(this);\n\n\t\tthis.hooks.content.register(this.handleLinks.bind(this));\n\t\tthis.hooks.content.register(this.passEvents.bind(this));\n\t\tthis.hooks.content.register(this.adjustImages.bind(this));\n\n\t\tthis.book!.spine!.hooks.content.register(this.injectIdentifier.bind(this));\n\n\t\tif (this.settings.stylesheet) {\n\t\t\tthis.book!.spine!.hooks.content.register(this.injectStylesheet.bind(this));\n\t\t}\n\n\t\tif (this.settings.script) {\n\t\t\tthis.book!.spine!.hooks.content.register(this.injectScript.bind(this));\n\t\t}\n\n\t\t/**\n\t\t * @member {Themes} themes\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.themes = new Themes(this);\n\n\t\t/**\n\t\t * @member {Annotations} annotations\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.annotations = new Annotations(this);\n\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.q = new Queue(this);\n\n\t\t/**\n\t\t * A Rendered Location Range\n\t\t * @typedef location\n\t\t * @type {Object}\n\t\t * @property {object} start\n\t\t * @property {string} start.index\n\t\t * @property {string} start.href\n\t\t * @property {object} start.displayed\n\t\t * @property {EpubCFI} start.cfi\n\t\t * @property {number} start.location\n\t\t * @property {number} start.percentage\n\t\t * @property {number} start.displayed.page\n\t\t * @property {number} start.displayed.total\n\t\t * @property {object} end\n\t\t * @property {string} end.index\n\t\t * @property {string} end.href\n\t\t * @property {object} end.displayed\n\t\t * @property {EpubCFI} end.cfi\n\t\t * @property {number} end.location\n\t\t * @property {number} end.percentage\n\t\t * @property {number} end.displayed.page\n\t\t * @property {number} end.displayed.total\n\t\t * @property {boolean} atStart\n\t\t * @property {boolean} atEnd\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.location = undefined;\n\n\t\t// Hold queue until book is opened\n\t\tthis.q.enqueue(this.book.opened);\n\n\t\tthis.starting = new defer();\n\t\t/**\n\t\t * @member {promise} started returns after the rendition has started\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.started = this.starting.promise;\n\n\t\t// Block the queue until rendering is started\n\t\tthis.q.enqueue(this.start);\n\t}\n\n\t/**\n\t * Set the manager function\n\t * @param {function} manager\n\t */\n\tsetManager(manager: DefaultViewManager): void {\n\t\tthis.manager = manager;\n\t}\n\n\t/**\n\t * Require the manager from passed string, or as a class function\n\t * @param {string|object} manager [description]\n\t * @return {method}\n\t */\n\trequireManager(manager: string | Function | object): typeof DefaultViewManager | typeof ContinuousViewManager | Function {\n\t\tlet viewManager;\n\n\t\t// If manager is a string, try to load from imported managers\n\t\tif (typeof manager === \"string\" && manager === \"default\") {\n\t\t\tviewManager = DefaultViewManager;\n\t\t} else if (typeof manager === \"string\" && manager === \"continuous\") {\n\t\t\tviewManager = ContinuousViewManager;\n\t\t} else {\n\t\t\t// otherwise, assume we were passed a class function\n\t\t\tviewManager = manager as Function;\n\t\t}\n\n\t\treturn viewManager;\n\t}\n\n\t/**\n\t * Require the view from passed string, or as a class function\n\t * @param {string|object} view\n\t * @return {view}\n\t */\n\trequireView(view: string | Function | object): typeof IframeView | Function {\n\t\tlet View;\n\n\t\t// If view is a string, try to load from imported views,\n\t\tif (typeof view == \"string\" && view === \"iframe\") {\n\t\t\tView = IframeView;\n\t\t} else {\n\t\t\t// otherwise, assume we were passed a class function\n\t\t\tView = view as Function;\n\t\t}\n\n\t\treturn View;\n\t}\n\n\t/**\n\t * Start the rendering\n\t * @return {Promise} rendering has started\n\t */\n\tstart(): void {\n\t\tif (!this.settings.layout && (this.book!.package!.metadata.layout === \"pre-paginated\" || this.book!.displayOptions!.fixedLayout === \"true\")) {\n\t\t\tthis.settings.layout = \"pre-paginated\";\n\t\t}\n\t\tswitch(this.book!.package!.metadata.spread) {\n\t\t\tcase \"none\":\n\t\t\t\tthis.settings.spread = \"none\";\n\t\t\t\tbreak;\n\t\t\tcase \"both\":\n\t\t\t\tthis.settings.spread = true;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(!this.manager) {\n\t\t\tthis.ViewManager = this.requireManager(this.settings.manager!);\n\t\t\tthis.View = this.requireView(this.settings.view!);\n\n\t\t\tthis.manager = new (this.ViewManager as new (options: Record<string, any>) => DefaultViewManager)({\n\t\t\t\tview: this.View,\n\t\t\t\tqueue: this.q,\n\t\t\t\trequest: this.book!.load.bind(this.book),\n\t\t\t\tsettings: this.settings\n\t\t\t});\n\t\t}\n\n\t\tthis.direction(this.book!.package!.metadata.direction || this.settings.defaultDirection);\n\n\t\t// Parse metadata to get layout props\n\t\tthis.settings.globalLayoutProperties = this.determineLayoutProperties(this.book!.package!.metadata);\n\n\t\tthis.flow(this.settings.globalLayoutProperties.flow);\n\n\t\tthis.layout(this.settings.globalLayoutProperties);\n\n\t\t// Listen for displayed views\n\t\tthis.manager.on(EVENTS.MANAGERS.ADDED, this.afterDisplayed.bind(this));\n\t\tthis.manager.on(EVENTS.MANAGERS.REMOVED, this.afterRemoved.bind(this));\n\n\t\t// Listen for resizing\n\t\tthis.manager.on(EVENTS.MANAGERS.RESIZED, this.onResized.bind(this));\n\n\t\t// Listen for rotation\n\t\tthis.manager.on(EVENTS.MANAGERS.ORIENTATION_CHANGE, this.onOrientationChange.bind(this));\n\n\t\t// Listen for scroll changes\n\t\tthis.manager.on(EVENTS.MANAGERS.SCROLLED, this.reportLocation.bind(this));\n\n\t\t/**\n\t\t * Emit that rendering has started\n\t\t * @event started\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.STARTED);\n\n\t\t// Start processing queue\n\t\tthis.starting.resolve();\n\t}\n\n\t/**\n\t * Call to attach the container to an element in the dom\n\t * Container must be attached before rendering can begin\n\t * @param {element} element to attach to\n\t * @return {Promise}\n\t */\n\tattachTo(element: HTMLElement | string): Promise<void> {\n\n\t\treturn this.q.enqueue(function () {\n\n\t\t\t// Start rendering\n\t\t\tthis.manager.render(element, {\n\t\t\t\t\"width\" : this.settings.width,\n\t\t\t\t\"height\" : this.settings.height\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Emit that rendering has attached to an element\n\t\t\t * @event attached\n\t\t\t * @memberof Rendition\n\t\t\t */\n\t\t\tthis.emit(EVENTS.RENDITION.ATTACHED);\n\n\t\t}.bind(this));\n\n\t}\n\n\t/**\n\t * Display a point in the book\n\t * The request will be added to the rendering Queue,\n\t * so it will wait until book is opened, rendering started\n\t * and all other rendering tasks have finished to be called.\n\t * @param {string} target Url or EpubCFI\n\t * @return {Promise}\n\t */\n\tdisplay(target?: string | number): Promise<Section> {\n\t\tif (this.displaying) {\n\t\t\tthis.displaying.resolve();\n\t\t}\n\t\treturn this.q.enqueue(this._display, target);\n\t}\n\n\t/**\n\t * Tells the manager what to display immediately\n\t * @private\n\t * @param {string} target Url or EpubCFI\n\t * @return {Promise}\n\t */\n\t_display(target?: string | number): Promise<Section> | undefined {\n\t\tif (!this.book) {\n\t\t\treturn;\n\t\t}\n\t\tconst _isCfiString = this.epubcfi.isCfiString(target);\n\t\tconst displaying = new defer();\n\t\tconst displayed = displaying.promise;\n\n\t\tthis.displaying = displaying;\n\n\t\t// Check if this is a book percentage\n\t\tif (this.book!.locations!.length() && isFloat(target)) {\n\t\t\ttarget = this.book!.locations!.cfiFromPercentage(parseFloat(target as string));\n\t\t}\n\n\t\tconst section: Section | null = this.book!.spine!.get(target);\n\n\t\tif(!section){\n\t\t\tdisplaying.reject(new Error(\"No Section Found\"));\n\t\t\treturn displayed;\n\t\t}\n\n\t\tthis.manager!.display(section, target as string)\n\t\t\t.then(() => {\n\t\t\t\tdisplaying.resolve(section);\n\t\t\t\tthis.displaying = undefined;\n\n\t\t\t\t/**\n\t\t\t\t * Emit that a section has been displayed\n\t\t\t\t * @event displayed\n\t\t\t\t * @param {Section} section\n\t\t\t\t * @memberof Rendition\n\t\t\t\t */\n\t\t\t\tthis.emit(EVENTS.RENDITION.DISPLAYED, section);\n\t\t\t\tthis.reportLocation();\n\t\t\t}, (err: Error) => {\n\t\t\t\t/**\n\t\t\t\t * Emit that has been an error displaying\n\t\t\t\t * @event displayError\n\t\t\t\t * @param {Section} section\n\t\t\t\t * @memberof Rendition\n\t\t\t\t */\n\t\t\t\tthis.emit(EVENTS.RENDITION.DISPLAY_ERROR, err);\n\t\t\t});\n\n\t\treturn displayed;\n\t}\n\n\t/*\n\trender(view, show) {\n\n\t\t// view.onLayout = this.layout.format.bind(this.layout);\n\t\tview.create();\n\n\t\t// Fit to size of the container, apply padding\n\t\tthis.manager.resizeView(view);\n\n\t\t// Render Chain\n\t\treturn view.section.render(this.book.request)\n\t\t\t.then(function(contents){\n\t\t\t\treturn view.load(contents);\n\t\t\t}.bind(this))\n\t\t\t.then(function(doc){\n\t\t\t\treturn this.hooks.content.trigger(view, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tthis.layout.format(view.contents);\n\t\t\t\treturn this.hooks.layout.trigger(view, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\treturn view.display();\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\treturn this.hooks.render.trigger(view, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tif(show !== false) {\n\t\t\t\t\tthis.q.enqueue(function(view){\n\t\t\t\t\t\tview.show();\n\t\t\t\t\t}, view);\n\t\t\t\t}\n\t\t\t\t// this.map = new Map(view, this.layout);\n\t\t\t\tthis.hooks.show.trigger(view, this);\n\t\t\t\tthis.trigger(\"rendered\", view.section);\n\n\t\t\t}.bind(this))\n\t\t\t.catch(function(e){\n\t\t\t\tthis.trigger(\"loaderror\", e);\n\t\t\t}.bind(this));\n\n\t}\n\t*/\n\n\t/**\n\t * Report what section has been displayed\n\t * @private\n\t * @param {*} view\n\t */\n\tafterDisplayed(view: any): void {\n\n\t\tview.on(EVENTS.VIEWS.MARK_CLICKED, (cfiRange: string, data: object) => this.triggerMarkEvent(cfiRange, data, view.contents));\n\n\t\tthis.hooks.render.trigger(view, this)\n\t\t\t.then(() => {\n\t\t\t\tif (view.contents) {\n\t\t\t\t\tthis.hooks.content.trigger(view.contents, this).then(() => {\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Emit that a section has been rendered\n\t\t\t\t\t\t * @event rendered\n\t\t\t\t\t\t * @param {Section} section\n\t\t\t\t\t\t * @param {View} view\n\t\t\t\t\t\t * @memberof Rendition\n\t\t\t\t\t\t */\n\t\t\t\t\t\tthis.emit(EVENTS.RENDITION.RENDERED, view.section, view);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit(EVENTS.RENDITION.RENDERED, view.section, view);\n\t\t\t\t}\n\t\t\t});\n\n\t}\n\n\t/**\n\t * Report what has been removed\n\t * @private\n\t * @param {*} view\n\t */\n\tafterRemoved(view: any): void {\n\t\tthis.hooks.unloaded.trigger(view, this).then(() => {\n\t\t\t/**\n\t\t\t * Emit that a section has been removed\n\t\t\t * @event removed\n\t\t\t * @param {Section} section\n\t\t\t * @param {View} view\n\t\t\t * @memberof Rendition\n\t\t\t */\n\t\t\tthis.emit(EVENTS.RENDITION.REMOVED, view.section, view);\n\t\t});\n\t}\n\n\t/**\n\t * Report resize events and display the last seen location\n\t * @private\n\t */\n\tonResized(size: SizeObject, epubcfi?: string): void {\n\n\t\t/**\n\t\t * Emit that the rendition has been resized\n\t\t * @event resized\n\t\t * @param {number} width\n\t\t * @param {height} height\n\t\t * @param {string} epubcfi (optional)\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.RESIZED, {\n\t\t\twidth: size.width,\n\t\t\theight: size.height\n\t\t}, epubcfi);\n\n\t\tif (this.location && this.location.start) {\n\t\t\tthis.display(epubcfi || this.location.start.cfi);\n\t\t}\n\n\t}\n\n\t/**\n\t * Report orientation events and display the last seen location\n\t * @private\n\t */\n\tonOrientationChange(orientation: string): void {\n\t\t/**\n\t\t * Emit that the rendition has been rotated\n\t\t * @event orientationchange\n\t\t * @param {string} orientation\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.ORIENTATION_CHANGE, orientation);\n\t}\n\n\t/**\n\t * Move the Rendition to a specific offset\n\t * Usually you would be better off calling display()\n\t * @param {object} offset\n\t */\n\tmoveTo(offset: { left: number; top: number }): void {\n\t\tthis.manager!.moveTo(offset);\n\t}\n\n\t/**\n\t * Trigger a resize of the views\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t * @param {string} [epubcfi] (optional)\n\t */\n\tresize(width?: number, height?: number, epubcfi?: string): void {\n\t\tif (width) {\n\t\t\tthis.settings.width = width;\n\t\t}\n\t\tif (height) {\n\t\t\tthis.settings.height = height;\n\t\t}\n\t\tthis.manager!.resize(width, height, epubcfi);\n\t}\n\n\t/**\n\t * Clear all rendered views\n\t */\n\tclear(): void {\n\t\tthis.manager!.clear();\n\t}\n\n\t/**\n\t * Go to the next \"page\" in the rendition\n\t * @return {Promise}\n\t */\n\tnext(): Promise<any> {\n\t\treturn this.q.enqueue(this.manager!.next.bind(this.manager))\n\t\t\t.then(this.reportLocation.bind(this));\n\t}\n\n\t/**\n\t * Go to the previous \"page\" in the rendition\n\t * @return {Promise}\n\t */\n\tprev(): Promise<any> {\n\t\treturn this.q.enqueue(this.manager!.prev.bind(this.manager))\n\t\t\t.then(this.reportLocation.bind(this));\n\t}\n\n\t//-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering\n\t/**\n\t * Determine the Layout properties from metadata and settings\n\t * @private\n\t * @param {object} metadata\n\t * @return {object} properties\n\t */\n\tdetermineLayoutProperties(metadata: PackagingMetadataObject & Record<string, any>): GlobalLayout {\n\t\tconst layout = this.settings.layout || metadata.layout || \"reflowable\";\n\t\tconst spread = this.settings.spread || metadata.spread || \"auto\";\n\t\tconst orientation = this.settings.orientation || metadata.orientation || \"auto\";\n\t\tconst flow = this.settings.flow || metadata.flow || \"auto\";\n\t\tconst viewport = metadata.viewport || \"\";\n\t\tconst minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800;\n\t\tconst direction = this.settings.direction || metadata.direction || \"ltr\";\n\n\t\tif ((this.settings.width === 0 || (this.settings.width as number) > 0) &&\n\t\t\t\t(this.settings.height === 0 || (this.settings.height as number) > 0)) {\n\t\t\t// viewport = \"width=\"+this.settings.width+\", height=\"+this.settings.height+\"\";\n\t\t}\n\n\t\tconst properties = {\n\t\t\tlayout : layout,\n\t\t\tspread : spread as string,\n\t\t\torientation : orientation,\n\t\t\tflow : flow,\n\t\t\tviewport : viewport,\n\t\t\tminSpreadWidth : minSpreadWidth as number,\n\t\t\tdirection: direction\n\t\t};\n\n\t\treturn properties;\n\t}\n\n\t/**\n\t * Adjust the flow of the rendition to paginated or scrolled\n\t * (scrolled-continuous vs scrolled-doc are handled by different view managers)\n\t * @param {string} flow\n\t */\n\tflow(flow: string): void {\n\t\tlet _flow = flow;\n\t\tif (flow === \"scrolled\" ||\n\t\t\t\tflow === \"scrolled-doc\" ||\n\t\t\t\tflow === \"scrolled-continuous\") {\n\t\t\t_flow = \"scrolled\";\n\t\t}\n\n\t\tif (flow === \"auto\" || flow === \"paginated\") {\n\t\t\t_flow = \"paginated\";\n\t\t}\n\n\t\tthis.settings.flow = flow;\n\n\t\tif (this._layout) {\n\t\t\tthis._layout.flow(_flow);\n\t\t}\n\n\t\tif (this.manager && this._layout) {\n\t\t\tthis.manager.applyLayout(this._layout);\n\t\t}\n\n\t\tif (this.manager) {\n\t\t\tthis.manager.updateFlow(_flow);\n\t\t}\n\n\t\tif (this.manager && this.manager.isRendered() && this.location) {\n\t\t\tthis.manager.clear();\n\t\t\tthis.display(this.location.start.cfi);\n\t\t}\n\t}\n\n\t/**\n\t * Adjust the layout of the rendition to reflowable or pre-paginated\n\t * @param {object} settings\n\t */\n\tlayout(settings?: GlobalLayout): Layout | undefined {\n\t\tif (settings) {\n\t\t\tthis._layout = new Layout(settings);\n\t\t\tthis._layout.spread(settings.spread, this.settings.minSpreadWidth);\n\n\t\t\t// this.mapping = new Mapping(this._layout.props);\n\n\t\t\tthis._layout.on(EVENTS.LAYOUT.UPDATED, (props: Record<string, any>, changed: Record<string, any>) => {\n\t\t\t\tthis.emit(EVENTS.RENDITION.LAYOUT, props, changed);\n\t\t\t})\n\t\t}\n\n\t\tif (this.manager && this._layout) {\n\t\t\tthis.manager.applyLayout(this._layout);\n\t\t}\n\n\t\treturn this._layout;\n\t}\n\n\t/**\n\t * Adjust if the rendition uses spreads\n\t * @param {string} spread none | auto (TODO: implement landscape, portrait, both)\n\t * @param {int} [min] min width to use spreads at\n\t */\n\tspread(spread: string, min?: number): void {\n\n\t\tthis.settings.spread = spread;\n\n\t\tif (min) {\n\t\t\tthis.settings.minSpreadWidth = min;\n\t\t}\n\n\t\tif (this._layout) {\n\t\t\tthis._layout.spread(spread, min);\n\t\t}\n\n\t\tif (this.manager && this.manager.isRendered()) {\n\t\t\tthis.manager.updateLayout();\n\t\t}\n\t}\n\n\t/**\n\t * Adjust the direction of the rendition\n\t * @param {string} dir\n\t */\n\tdirection(dir?: string): void {\n\n\t\tthis.settings.direction = dir || \"ltr\";\n\n\t\tif (this.manager) {\n\t\t\tthis.manager.direction(this.settings.direction);\n\t\t}\n\n\t\tif (this.manager && this.manager.isRendered() && this.location) {\n\t\t\tthis.manager.clear();\n\t\t\tthis.display(this.location.start.cfi);\n\t\t}\n\t}\n\n\t/**\n\t * Report the current location\n\t * @fires relocated\n\t * @fires locationChanged\n\t */\n\treportLocation(): Promise<void> {\n\t\treturn this.q.enqueue(function reportedLocation(){\n\t\t\trequestAnimationFrame(function reportedLocationAfterRAF() {\n\t\t\t\tconst location = this.manager.currentLocation();\n\t\t\t\tif (location && location.then && typeof location.then === \"function\") {\n\t\t\t\t\tlocation.then(function(result: ViewLocation[]) {\n\t\t\t\t\t\tconst located = this.located(result);\n\n\t\t\t\t\t\tif (!located || !located.start || !located.end) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.location = located;\n\n\t\t\t\t\t\tthis.emit(EVENTS.RENDITION.LOCATION_CHANGED, {\n\t\t\t\t\t\t\tindex: this.location.start.index,\n\t\t\t\t\t\t\thref: this.location.start.href,\n\t\t\t\t\t\t\tstart: this.location.start.cfi,\n\t\t\t\t\t\t\tend: this.location.end.cfi,\n\t\t\t\t\t\t\tpercentage: this.location.start.percentage\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis.emit(EVENTS.RENDITION.RELOCATED, this.location);\n\t\t\t\t\t}.bind(this));\n\t\t\t\t} else if (location) {\n\t\t\t\t\tconst located = this.located(location);\n\n\t\t\t\t\tif (!located || !located.start || !located.end) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.location = located;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @event locationChanged\n\t\t\t\t\t * @deprecated\n\t\t\t\t\t * @type {object}\n\t\t\t\t\t * @property {number} index\n\t\t\t\t\t * @property {string} href\n\t\t\t\t\t * @property {EpubCFI} start\n\t\t\t\t\t * @property {EpubCFI} end\n\t\t\t\t\t * @property {number} percentage\n\t\t\t\t\t * @memberof Rendition\n\t\t\t\t\t */\n\t\t\t\t\tthis.emit(EVENTS.RENDITION.LOCATION_CHANGED, {\n\t\t\t\t\t\tindex: this.location.start.index,\n\t\t\t\t\t\thref: this.location.start.href,\n\t\t\t\t\t\tstart: this.location.start.cfi,\n\t\t\t\t\t\tend: this.location.end.cfi,\n\t\t\t\t\t\tpercentage: this.location.start.percentage\n\t\t\t\t\t});\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @event relocated\n\t\t\t\t\t * @type {displayedLocation}\n\t\t\t\t\t * @memberof Rendition\n\t\t\t\t\t */\n\t\t\t\t\tthis.emit(EVENTS.RENDITION.RELOCATED, this.location);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\t}\n\n\t/**\n\t * Get the Current Location object\n\t * @return {displayedLocation | promise} location (may be a promise)\n\t */\n\tcurrentLocation(): Location | undefined {\n\t\tconst location = this.manager!.currentLocation() as any;\n\t\tif (location && location.then && typeof location.then === \"function\") {\n\t\t\tlocation.then(function(result: ViewLocation[]) {\n\t\t\t\tconst located = this.located(result);\n\t\t\t\treturn located;\n\t\t\t}.bind(this));\n\t\t} else if (location) {\n\t\t\tconst located = this.located(location);\n\t\t\treturn located;\n\t\t}\n\t}\n\n\t/**\n\t * Creates a Rendition#locationRange from location\n\t * passed by the Manager\n\t * @returns {displayedLocation}\n\t * @private\n\t */\n\tlocated(location: ViewLocation[]): Location | undefined {\n\t\tif (!location.length) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst start = location[0];\n\t\tconst end = location[location.length-1];\n\n\t\tconst located: Location = {\n\t\t\tstart: {\n\t\t\t\tindex: start.index,\n\t\t\t\thref: start.href,\n\t\t\t\tcfi: start.mapping.start,\n\t\t\t\tdisplayed: {\n\t\t\t\t\tpage: start.pages[0] || 1,\n\t\t\t\t\ttotal: start.totalPages\n\t\t\t\t}\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tindex: end.index,\n\t\t\t\thref: end.href,\n\t\t\t\tcfi: end.mapping.end,\n\t\t\t\tdisplayed: {\n\t\t\t\t\tpage: end.pages[end.pages.length-1] || 1,\n\t\t\t\t\ttotal: end.totalPages\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst locationStart = this.book!.locations!.locationFromCfi(start.mapping.start);\n\t\tconst locationEnd = this.book!.locations!.locationFromCfi(end.mapping.end);\n\n\t\tif (locationStart != null) {\n\t\t\tlocated.start.location = locationStart;\n\t\t\tlocated.start.percentage = this.book!.locations!.percentageFromLocation(locationStart);\n\t\t}\n\t\tif (locationEnd != null) {\n\t\t\tlocated.end.location = locationEnd;\n\t\t\tlocated.end.percentage = this.book!.locations!.percentageFromLocation(locationEnd);\n\t\t}\n\n\t\tconst pageStart = this.book!.pageList!.pageFromCfi(start.mapping.start);\n\t\tconst pageEnd = this.book!.pageList!.pageFromCfi(end.mapping.end);\n\n\t\tif (pageStart != -1) {\n\t\t\tlocated.start.page = pageStart;\n\t\t}\n\t\tif (pageEnd != -1) {\n\t\t\tlocated.end.page = pageEnd;\n\t\t}\n\n\t\tif (end.index === this.book!.spine!.last()!.index &&\n\t\t\t\tlocated.end.displayed.page >= located.end.displayed.total) {\n\t\t\tlocated.atEnd = true;\n\t\t}\n\n\t\tif (start.index === this.book!.spine!.first()!.index &&\n\t\t\t\tlocated.start.displayed.page === 1) {\n\t\t\tlocated.atStart = true;\n\t\t}\n\n\t\treturn located;\n\t}\n\n\t/**\n\t * Remove and Clean Up the Rendition\n\t */\n\tdestroy(): void {\n\t\t// Clear the queue\n\t\t// this.q.clear();\n\t\t// this.q = undefined;\n\n\t\tthis.manager && this.manager.destroy();\n\n\t\tthis.book = undefined;\n\n\t\t// this.views = null;\n\n\t\t// this.hooks.display.clear();\n\t\t// this.hooks.serialize.clear();\n\t\t// this.hooks.content.clear();\n\t\t// this.hooks.layout.clear();\n\t\t// this.hooks.render.clear();\n\t\t// this.hooks.show.clear();\n\t\t// this.hooks = {};\n\n\t\t// this.themes.destroy();\n\t\t// this.themes = undefined;\n\n\t\t// this.epubcfi = undefined;\n\n\t\t// this.starting = undefined;\n\t\t// this.started = undefined;\n\n\n\t}\n\n\t/**\n\t * Pass the events from a view's Contents\n\t * @private\n\t * @param {Contents} view contents\n\t */\n\tpassEvents(contents: Contents): void {\n\t\tDOM_EVENTS.forEach((e) => {\n\t\t\tcontents.on(e, (ev: Event) => this.triggerViewEvent(ev, contents));\n\t\t});\n\n\t\tcontents.on(EVENTS.CONTENTS.SELECTED, (e: string) => this.triggerSelectedEvent(e, contents));\n\t}\n\n\t/**\n\t * Emit events passed by a view\n\t * @private\n\t * @param {event} e\n\t */\n\ttriggerViewEvent(e: Event, contents: Contents): void {\n\t\tthis.emit(e.type, e, contents);\n\t}\n\n\t/**\n\t * Emit a selection event's CFI Range passed from a a view\n\t * @private\n\t * @param {string} cfirange\n\t */\n\ttriggerSelectedEvent(cfirange: string, contents: Contents): void {\n\t\t/**\n\t\t * Emit that a text selection has occurred\n\t\t * @event selected\n\t\t * @param {string} cfirange\n\t\t * @param {Contents} contents\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.SELECTED, cfirange, contents);\n\t}\n\n\t/**\n\t * Emit a markClicked event with the cfiRange and data from a mark\n\t * @private\n\t * @param {EpubCFI} cfirange\n\t */\n\ttriggerMarkEvent(cfiRange: string, data: object, contents: Contents): void {\n\t\t/**\n\t\t * Emit that a mark was clicked\n\t\t * @event markClicked\n\t\t * @param {EpubCFI} cfirange\n\t\t * @param {object} data\n\t\t * @param {Contents} contents\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.MARK_CLICKED, cfiRange, data, contents);\n\t}\n\n\t/**\n\t * Get a Range from a Visible CFI\n\t * @param {string} cfi EpubCfi String\n\t * @param {string} ignoreClass\n\t * @return {range}\n\t */\n\tgetRange(cfi: string, ignoreClass?: string): Range | undefined {\n\t\tconst _cfi = new EpubCFI(cfi);\n\t\tconst found = this.manager!.visible().filter(function (view: any) {\n\t\t\tif(_cfi.spinePos === view.index) return true;\n\t\t});\n\n\t\t// Should only every return 1 item\n\t\tif (found.length) {\n\t\t\treturn found[0].contents!.range(_cfi as any, ignoreClass);\n\t\t}\n\t}\n\n\t/**\n\t * Hook to adjust images to fit in columns\n\t * @param {Contents} contents\n\t * @private\n\t */\n\tadjustImages(contents: Contents): Promise<void> {\n\n\t\tif (this._layout!.name === \"pre-paginated\") {\n\t\t\treturn new Promise<void>(function(resolve){\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\n\t\tconst computed = contents.window.getComputedStyle(contents.content, null);\n\t\tconst height = (contents.content.offsetHeight - (parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom))) * .95;\n\t\tconst horizontalPadding = parseFloat(computed.paddingLeft) + parseFloat(computed.paddingRight);\n\n\t\tcontents.addStylesheetRules({\n\t\t\t\"img\" : {\n\t\t\t\t\"max-width\": (this._layout!.columnWidth ? (this._layout!.columnWidth - horizontalPadding) + \"px\" : \"100%\") + \"!important\",\n\t\t\t\t\"max-height\": height + \"px\" + \"!important\",\n\t\t\t\t\"object-fit\": \"contain\",\n\t\t\t\t\"page-break-inside\": \"avoid\",\n\t\t\t\t\"break-inside\": \"avoid\",\n\t\t\t\t\"box-sizing\": \"border-box\"\n\t\t\t},\n\t\t\t\"svg\" : {\n\t\t\t\t\"max-width\": (this._layout!.columnWidth ? (this._layout!.columnWidth - horizontalPadding) + \"px\" : \"100%\") + \"!important\",\n\t\t\t\t\"max-height\": height + \"px\" + \"!important\",\n\t\t\t\t\"page-break-inside\": \"avoid\",\n\t\t\t\t\"break-inside\": \"avoid\"\n\t\t\t}\n\t\t});\n\n\t\treturn new Promise<void>(function(resolve, _reject){\n\t\t\t// Wait to apply\n\t\t\tsetTimeout(function() {\n\t\t\t\tresolve();\n\t\t\t}, 1);\n\t\t});\n\t}\n\n\t/**\n\t * Get the Contents object of each rendered view\n\t * @returns {Contents[]}\n\t */\n\tgetContents (): Contents[] {\n\t\treturn this.manager ? this.manager.getContents() : [];\n\t}\n\n\t/**\n\t * Get the views member from the manager\n\t * @returns {Views}\n\t */\n\tviews (): any {\n\t\tconst views = this.manager ? this.manager.views : undefined;\n\t\treturn views || [];\n\t}\n\n\t/**\n\t * Hook to handle link clicks in rendered content\n\t * @param {Contents} contents\n\t * @private\n\t */\n\thandleLinks(contents: Contents): void {\n\t\tif (contents) {\n\t\t\tcontents.on(EVENTS.CONTENTS.LINK_CLICKED, (href: string) => {\n\t\t\t\tconst relative = this.book!.path!.relative(href);\n\t\t\t\tthis.display(relative);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Hook to handle injecting stylesheet before\n\t * a Section is serialized\n\t * @param {document} doc\n\t * @param {Section} section\n\t * @private\n\t */\n\tinjectStylesheet(doc: Document, _section: Section): void {\n\t\tconst style = doc.createElement(\"link\");\n\t\tstyle.setAttribute(\"type\", \"text/css\");\n\t\tstyle.setAttribute(\"rel\", \"stylesheet\");\n\t\tstyle.setAttribute(\"href\", this.settings.stylesheet!);\n\t\tdoc.getElementsByTagName(\"head\")[0].appendChild(style);\n\t}\n\n\t/**\n\t * Hook to handle injecting scripts before\n\t * a Section is serialized\n\t * @param {document} doc\n\t * @param {Section} section\n\t * @private\n\t */\n\tinjectScript(doc: Document, _section: Section): void {\n\t\tconst script = doc.createElement(\"script\");\n\t\tscript.setAttribute(\"type\", \"text/javascript\");\n\t\tscript.setAttribute(\"src\", this.settings.script!);\n\t\tscript.textContent = \" \"; // Needed to prevent self closing tag\n\t\tdoc.getElementsByTagName(\"head\")[0].appendChild(script);\n\t}\n\n\t/**\n\t * Hook to handle the document identifier before\n\t * a Section is serialized\n\t * @param {document} doc\n\t * @param {Section} section\n\t * @private\n\t */\n\tinjectIdentifier(doc: Document, _section: Section): void {\n\t\tconst ident = this.book!.packaging!.metadata.identifier;\n\t\tconst meta = doc.createElement(\"meta\");\n\t\tmeta.setAttribute(\"name\", \"dc.relation.ispartof\");\n\t\tif (ident) {\n\t\t\tmeta.setAttribute(\"content\", ident);\n\t\t}\n\t\tdoc.getElementsByTagName(\"head\")[0].appendChild(meta);\n\t}\n\n}\n\n//-- Enable binding events to Renderer\nEventEmitter(Rendition.prototype);\n\nexport default Rendition;\n","import {defer, isXml, parse} from \"./utils/core\";\nimport request from \"./utils/request\";\nimport mime from \"./utils/mime\";\nimport Path from \"./utils/path\";\nimport JSZip from \"jszip\";\n\n/**\n * Handles Unzipping a requesting files from an Epub Archive\n * @class\n */\nclass Archive {\n\tzip: JSZip;\n\turlCache: Record<string, string>;\n\n\tconstructor() {\n\t\tthis.zip = undefined!;\n\t\tthis.urlCache = {};\n\n\t\tthis.checkRequirements();\n\n\t}\n\n\t/**\n\t * Checks to see if JSZip exists in global namspace,\n\t * Requires JSZip if it isn't there\n\t * @private\n\t */\n\tcheckRequirements(): void {\n\t\ttry {\n\t\t\tthis.zip = new JSZip();\n\t\t} catch (_e) {\n\t\t\tthrow new Error(\"JSZip lib not loaded\");\n\t\t}\n\t}\n\n\t/**\n\t * Open an archive\n\t * @param {binary} input\n\t * @param {boolean} [isBase64] tells JSZip if the input data is base64 encoded\n\t * @return {Promise} zipfile\n\t */\n\topen(input: ArrayBuffer | string | Blob, isBase64?: boolean): Promise<JSZip> {\n\t\treturn this.zip.loadAsync(input, {\"base64\": isBase64});\n\t}\n\n\t/**\n\t * Load and Open an archive\n\t * @param {string} zipUrl\n\t * @param {boolean} [isBase64] tells JSZip if the input data is base64 encoded\n\t * @return {Promise} zipfile\n\t */\n\topenUrl(zipUrl: string, isBase64?: boolean): Promise<JSZip> {\n\t\treturn request(zipUrl, \"binary\")\n\t\t\t.then(function(data: ArrayBuffer){\n\t\t\t\treturn this.zip.loadAsync(data, {\"base64\": isBase64});\n\t\t\t}.bind(this));\n\t}\n\n\t/**\n\t * Request a url from the archive\n\t * @param {string} url a url to request from the archive\n\t * @param {string} [type] specify the type of the returned result\n\t * @return {Promise<Blob | string | JSON | Document | XMLDocument>}\n\t */\n\trequest(url: string, type?: string): Promise<any> {\n\t\tconst deferred = new defer();\n\t\tlet response;\n\t\tconst path = new Path(url);\n\n\t\t// If type isn't set, determine it from the file extension\n\t\tif(!type) {\n\t\t\ttype = path.extension;\n\t\t}\n\n\t\tif(type == \"blob\"){\n\t\t\tresponse = this.getBlob(url);\n\t\t} else {\n\t\t\tresponse = this.getText(url);\n\t\t}\n\n\t\tif (response) {\n\t\t\tresponse.then(function (r: string | Blob) {\n\t\t\t\tconst result = this.handleResponse(r, type);\n\t\t\t\tdeferred.resolve(result);\n\t\t\t}.bind(this));\n\t\t} else {\n\t\t\tdeferred.reject({\n\t\t\t\tmessage : \"File not found in the epub: \" + url,\n\t\t\t\tstack : new Error().stack\n\t\t\t});\n\t\t}\n\t\treturn deferred.promise;\n\t}\n\n\t/**\n\t * Handle the response from request\n\t * @private\n\t * @param {any} response\n\t * @param {string} [type]\n\t * @return {any} the parsed result\n\t */\n\thandleResponse(response: any, type?: string): any {\n\t\tlet r;\n\n\t\tif(type == \"json\") {\n\t\t\tr = JSON.parse(response);\n\t\t}\n\t\telse\n\t\tif(isXml(type!)) {\n\t\t\tr = parse(response, \"text/xml\");\n\t\t}\n\t\telse\n\t\tif(type == \"xhtml\") {\n\t\t\tr = parse(response, \"application/xhtml+xml\");\n\t\t}\n\t\telse\n\t\tif(type == \"html\" || type == \"htm\") {\n\t\t\tr = parse(response, \"text/html\");\n\t\t } else {\n\t\t\t r = response;\n\t\t }\n\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get a Blob from Archive by Url\n\t * @param {string} url\n\t * @param {string} [mimeType]\n\t * @return {Blob}\n\t */\n\tgetBlob(url: string, mimeType?: string): Promise<Blob> | undefined {\n\t\tconst decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\t\tconst entry = this.zip.file(decodededUrl);\n\n\t\tif(entry) {\n\t\t\tmimeType = mimeType || mime.lookup(entry.name);\n\t\t\treturn entry.async(\"uint8array\").then(function(uint8array: Uint8Array) {\n\t\t\t\treturn new Blob([uint8array as BlobPart], {type : mimeType});\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Get Text from Archive by Url\n\t * @param {string} url\n\t * @param {string} [encoding]\n\t * @return {string}\n\t */\n\tgetText(url: string, _encoding?: string): Promise<string> | undefined {\n\t\tconst decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\t\tconst entry = this.zip.file(decodededUrl);\n\n\t\tif(entry) {\n\t\t\treturn entry.async(\"string\").then(function(text: string) {\n\t\t\t\treturn text;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Get a base64 encoded result from Archive by Url\n\t * @param {string} url\n\t * @param {string} [mimeType]\n\t * @return {string} base64 encoded\n\t */\n\tgetBase64(url: string, mimeType?: string): Promise<string> | undefined {\n\t\tconst decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\t\tconst entry = this.zip.file(decodededUrl);\n\n\t\tif(entry) {\n\t\t\tmimeType = mimeType || mime.lookup(entry.name);\n\t\t\treturn entry.async(\"base64\").then(function(data: string) {\n\t\t\t\treturn \"data:\" + mimeType + \";base64,\" + data;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Create a Url from an unarchived item\n\t * @param {string} url\n\t * @param {object} [options.base64] use base64 encoding or blob url\n\t * @return {Promise} url promise with Url string\n\t */\n\tcreateUrl(url: string, options?: { base64?: boolean }): Promise<string> {\n\t\tconst deferred = new defer();\n\t\tconst _URL = window.URL || (window as any).webkitURL || (window as any).mozURL;\n\t\tlet tempUrl;\n\t\tlet response;\n\t\tconst useBase64 = options && options.base64;\n\n\t\tif(url in this.urlCache) {\n\t\t\tdeferred.resolve(this.urlCache[url]);\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\tif (useBase64) {\n\t\t\tresponse = this.getBase64(url);\n\n\t\t\tif (response) {\n\t\t\t\tresponse.then(function(tempUrl: string) {\n\n\t\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t\t}.bind(this));\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tresponse = this.getBlob(url);\n\n\t\t\tif (response) {\n\t\t\t\tresponse.then(function(blob: Blob) {\n\n\t\t\t\t\ttempUrl = _URL.createObjectURL(blob);\n\t\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t\t}.bind(this));\n\n\t\t\t}\n\t\t}\n\n\n\t\tif (!response) {\n\t\t\tdeferred.reject({\n\t\t\t\tmessage : \"File not found in the epub: \" + url,\n\t\t\t\tstack : new Error().stack\n\t\t\t});\n\t\t}\n\n\t\treturn deferred.promise;\n\t}\n\n\t/**\n\t * Revoke Temp Url for a archive item\n\t * @param {string} url url of the item in the archive\n\t */\n\trevokeUrl(url: string): void {\n\t\tconst _URL = window.URL || (window as any).webkitURL || (window as any).mozURL;\n\t\tconst fromCache = this.urlCache[url];\n\t\tif(fromCache) _URL.revokeObjectURL(fromCache);\n\t}\n\n\tdestroy(): void {\n\t\tconst _URL = window.URL || (window as any).webkitURL || (window as any).mozURL;\n\t\tfor (const fromCache in this.urlCache) {\n\t\t\t_URL.revokeObjectURL(fromCache);\n\t\t}\n\t\t(this as any).zip = undefined;\n\t\tthis.urlCache = {};\n\t}\n}\n\nexport default Archive;\n","/*!\n localForage -- Offline Storage, Improved\n Version 1.10.0\n https://localforage.github.io/localForage\n (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nvar Mutation = global.MutationObserver || global.WebKitMutationObserver;\n\nvar scheduleDrain;\n\n{\n if (Mutation) {\n var called = 0;\n var observer = new Mutation(nextTick);\n var element = global.document.createTextNode('');\n observer.observe(element, {\n characterData: true\n });\n scheduleDrain = function () {\n element.data = (called = ++called % 2);\n };\n } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {\n var channel = new global.MessageChannel();\n channel.port1.onmessage = nextTick;\n scheduleDrain = function () {\n channel.port2.postMessage(0);\n };\n } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n scheduleDrain = function () {\n\n // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n try {\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n } catch (e) {\n return;\n }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb || !idb.open) {\n return false;\n }\n // We mimic PouchDB here;\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n // Safari <10.1 does not meet our requirements for IDB support\n // (see: https://github.com/pouchdb/pouchdb/issues/5572).\n // Safari 10.1 shipped with fetch, we can use that to detect it.\n // Note: this creates issues with `window.fetch` polyfills and\n // overrides; see:\n // https://github.com/localForage/localForage/issues/856\n return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n // See: https://github.com/mozilla/localForage/issues/128\n // See: https://github.com/mozilla/localForage/issues/272\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n // In the \"nopromises\" build this will just throw if you don't have\n // a global promise object, but it would throw anyway later.\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\nfunction normalizeKey(key) {\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n return key;\n}\n\nfunction getCallback() {\n if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n return arguments[arguments.length - 1];\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n return new Promise$1(function (resolve) {\n var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve, reject) {\n deferredOperation.resolve = resolve;\n deferredOperation.reject = reject;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n return deferredOperation.promise;\n }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Reject its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.reject(err);\n return deferredOperation.promise;\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function (e) {\n e.preventDefault();\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n var db = openreq.result;\n db.onversionchange = function (e) {\n // Triggered when the database is modified (e.g. adding an objectStore) or\n // deleted (even when initiated by other sessions in different tabs).\n // Closing the connection here prevents those operations from being blocked.\n // If the database is accessed again later by this instance, the connection\n // will be reopened or the database recreated as needed.\n e.target.close();\n };\n resolve(db);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n _deferReadiness(dbInfo);\n\n var dbContext = dbContexts[dbInfo.name];\n var forages = dbContext.forages;\n\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n if (forage._dbInfo.db) {\n forage._dbInfo.db.close();\n forage._dbInfo.db = null;\n }\n }\n dbInfo.db = null;\n\n return _getOriginalConnection(dbInfo).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n // store the latest db reference\n // in case the db was upgraded\n dbInfo.db = dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n })[\"catch\"](function (err) {\n _rejectReadiness(dbInfo, err);\n throw err;\n });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n if (retries === undefined) {\n retries = 1;\n }\n\n try {\n var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n callback(null, tx);\n } catch (err) {\n if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n return Promise$1.resolve().then(function () {\n if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n // increase the db version, to create the new ObjectStore\n if (dbInfo.db) {\n dbInfo.version = dbInfo.db.version + 1;\n }\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n }).then(function () {\n return _tryReconnect(dbInfo).then(function () {\n createTransaction(dbInfo, mode, callback, retries - 1);\n });\n })[\"catch\"](callback);\n }\n\n callback(err);\n }\n}\n\nfunction createDbContext() {\n return {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = createDbContext();\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.get(key);\n\n req.onsuccess = function () {\n var value = req.result;\n if (value === undefined) {\n value = null;\n }\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n // when the iterator callback returns any\n // (non-`undefined`) value, then we stop\n // the iteration immediately\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (toString.call(value) === '[object Blob]') {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\n if (value === null) {\n value = undefined;\n }\n\n var req = store.put(value, key);\n\n transaction.oncomplete = function () {\n // Cast to undefined so the value passed to\n // callback/promise is the same as what one would get out\n // of `getItem()` later. This leads to some weirdness\n // (setItem('foo', undefined) will return `null`), but\n // it's not my fault localStorage is our baseline and that\n // it's weird.\n if (value === undefined) {\n value = null;\n }\n\n resolve(value);\n };\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.count();\n\n req.onsuccess = function () {\n resolve(req.result);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var advanced = false;\n var req = store.openKeyCursor();\n\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\n // records.\n advanced = true;\n cursor.advance(n);\n } else {\n // When we get here, we've got the nth key.\n resolve(cursor.key);\n }\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openKeyCursor();\n var keys = [];\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (!cursor) {\n resolve(keys);\n return;\n }\n\n keys.push(cursor.key);\n cursor[\"continue\"]();\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n return db;\n });\n\n if (!options.storeName) {\n promise = dbPromise.then(function (db) {\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n }\n\n var dropDBPromise = new Promise$1(function (resolve, reject) {\n var req = idb.deleteDatabase(options.name);\n\n req.onerror = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n reject(req.error);\n };\n\n req.onblocked = function () {\n // Closing all open connections in onversionchange handler should prevent this situation, but if\n // we do get here, it just means the request remains pending - eventually it will succeed or error\n console.warn('dropInstance blocked for database \"' + options.name + '\" until all open connections are closed');\n };\n\n req.onsuccess = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n resolve(db);\n };\n });\n\n return dropDBPromise.then(function (db) {\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n var _forage = forages[i];\n _advanceReadiness(_forage._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n } else {\n promise = dbPromise.then(function (db) {\n if (!db.objectStoreNames.contains(options.storeName)) {\n return;\n }\n\n var newVersion = db.version + 1;\n\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n forage._dbInfo.version = newVersion;\n }\n\n var dropObjectPromise = new Promise$1(function (resolve, reject) {\n var req = idb.open(options.name, newVersion);\n\n req.onerror = function (err) {\n var db = req.result;\n db.close();\n reject(err);\n };\n\n req.onupgradeneeded = function () {\n var db = req.result;\n db.deleteObjectStore(options.storeName);\n };\n\n req.onsuccess = function () {\n var db = req.result;\n db.close();\n resolve(db);\n };\n });\n\n return dropObjectPromise.then(function (db) {\n dbContext.db = db;\n for (var j = 0; j < forages.length; j++) {\n var _forage2 = forages[j];\n _forage2._dbInfo.db = db;\n _advanceReadiness(_forage2._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n }\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n _support: isIndexedDBValid(),\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys,\n dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueType = '';\n if (value) {\n valueType = toString$1.call(value);\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueType === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueType === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueType === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueType === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueType === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueType === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueType === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueType === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueType === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueType === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n createDbTable(t, dbInfo, function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n }, reject);\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n t.executeSql(sqlStatement, args, callback, function (t, error) {\n if (error.code === error.SYNTAX_ERR) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n if (!results.rows.length) {\n // if the table is missing (was deleted)\n // re-create it table and retry\n createDbTable(t, dbInfo, function () {\n t.executeSql(sqlStatement, args, callback, errorCallback);\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // Try to re-run the transaction.\n if (retriesLeft > 0) {\n resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n return;\n }\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n return new Promise$1(function (resolve, reject) {\n db.transaction(function (t) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n var storeNames = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n storeNames.push(results.rows.item(i).name);\n }\n\n resolve({\n db: db,\n storeNames: storeNames\n });\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n}\n\nfunction dropInstance$1(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n var db;\n if (options.name === currentConfig.name) {\n // use the db reference of the current instance\n db = self._dbInfo.db;\n } else {\n db = openDatabase(options.name, '', '', 0);\n }\n\n if (!options.storeName) {\n // drop all database tables\n resolve(getAllStoreNames(db));\n } else {\n resolve({\n db: db,\n storeNames: [options.storeName]\n });\n }\n }).then(function (operationInfo) {\n return new Promise$1(function (resolve, reject) {\n operationInfo.db.transaction(function (t) {\n function dropTable(storeName) {\n return new Promise$1(function (resolve, reject) {\n t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n }\n\n var operations = [];\n for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n operations.push(dropTable(operationInfo.storeNames[i]));\n }\n\n Promise$1.all(operations).then(function () {\n resolve();\n })[\"catch\"](function (e) {\n reject(e);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n _support: isWebSQLValid(),\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1,\n dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n // in IE8 typeof localStorage.setItem === 'object'\n !!localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n var keyPrefix = options.name + '/';\n\n if (options.storeName !== defaultConfig.storeName) {\n keyPrefix += options.storeName + '/';\n }\n return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n var localStorageTestKey = '_localforage_support_test';\n\n try {\n localStorage.setItem(localStorageTestKey, true);\n localStorage.removeItem(localStorageTestKey);\n\n return false;\n } catch (e) {\n return true;\n }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n if (!_isLocalStorageUsable()) {\n return Promise$1.reject();\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n var itemKey = localStorage.key(i);\n if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n var currentConfig = this.config();\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n if (!options.storeName) {\n resolve(options.name + '/');\n } else {\n resolve(_getKeyPrefix(options, self._defaultConfig));\n }\n }).then(function (keyPrefix) {\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n _support: isLocalStorageValid(),\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2,\n dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n var len = array.length;\n var i = 0;\n while (i < len) {\n if (sameValue(array[i], searchElement)) {\n return true;\n }\n i++;\n }\n\n return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n INDEXEDDB: asyncStorage,\n WEBSQL: webSQLStorage,\n LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var _key in arg) {\n if (arg.hasOwnProperty(_key)) {\n if (isArray(arg[_key])) {\n arguments[0][_key] = arg[_key].slice();\n } else {\n arguments[0][_key] = arg[_key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n for (var driverTypeKey in DefaultDrivers) {\n if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n var driver = DefaultDrivers[driverTypeKey];\n var driverName = driver._driver;\n this[driverTypeKey] = driverName;\n\n if (!DefinedDrivers[driverName]) {\n // we don't need to wait for the promise,\n // since the default drivers can be defined\n // in a blocking manner\n this.defineDriver(driver);\n }\n }\n }\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver)[\"catch\"](function () {});\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n if (i === 'version' && typeof options[i] !== 'number') {\n return new Error('Database version must be a number.');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n return this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n\n var driverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0, len = driverMethods.length; i < len; i++) {\n var driverMethodName = driverMethods[i];\n\n // when the property is there,\n // it should be a method even when optional\n var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var configureMissingMethods = function configureMissingMethods() {\n var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n return function () {\n var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n var promise = Promise$1.reject(error);\n executeCallback(promise, arguments[arguments.length - 1]);\n return promise;\n };\n };\n\n for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n var optionalDriverMethod = OptionalDriverMethods[_i];\n if (!driverObject[optionalDriverMethod]) {\n driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n }\n }\n };\n\n configureMissingMethods();\n\n var setDriverSupport = function setDriverSupport(support) {\n if (DefinedDrivers[driverName]) {\n console.info('Redefining LocalForage driver: ' + driverName);\n }\n DefinedDrivers[driverName] = driverObject;\n DriverSupport[driverName] = support;\n // don't use a then, so that we can define\n // drivers that have simple _support methods\n // in a blocking manner\n resolve();\n };\n\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n driverObject._support().then(setDriverSupport, reject);\n } else {\n setDriverSupport(!!driverObject._support);\n }\n } else {\n setDriverSupport(true);\n }\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function extendSelfWithDriver(driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!DriverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n","import {defer, isXml, parse} from \"./utils/core\";\nimport httpRequest from \"./utils/request\";\nimport mime from \"./utils/mime\";\nimport Path from \"./utils/path\";\nimport EventEmitter from \"./utils/event-emitter\";\nimport localforage from \"localforage\";\nimport type { IEventEmitter, RequestFunction } from \"./types\";\n\n/**\n * Handles saving and requesting files from local storage\n * @class\n * @param {string} name This should be the name of the application for modals\n * @param {function} [requester]\n * @param {function} [resolver]\n */\nclass Store implements IEventEmitter {\n\tdeclare on: (type: string, fn: (...args: any[]) => void) => this;\n\tdeclare off: (type: string, fn?: (...args: any[]) => void) => this;\n\tdeclare emit: (type: string, ...args: any[]) => void;\n\n\turlCache: Record<string, string>;\n\tstorage: any;\n\tname: string;\n\trequester: RequestFunction;\n\tresolver: (href: string) => string;\n\tonline: boolean;\n\t_status: ((event: Event) => void) | undefined;\n\n\tconstructor(name: string, requester?: RequestFunction, resolver?: (href: string) => string) {\n\t\tthis.urlCache = {};\n\n\t\tthis.storage = undefined;\n\n\t\tthis.name = name;\n\t\tthis.requester = requester || httpRequest;\n\t\tthis.resolver = resolver!;\n\n\t\tthis.online = true;\n\n\t\tthis.checkRequirements();\n\n\t\tthis.addListeners();\n\t}\n\n\t/**\n\t * Checks to see if localForage exists in global namspace,\n\t * Requires localForage if it isn't there\n\t * @private\n\t */\n\tcheckRequirements(): void {\n\t\ttry {\n\t\t\tlet store: any;\n\t\t\tif (typeof localforage === \"undefined\") {\n\t\t\t\tstore = localforage;\n\t\t\t}\n\t\t\tthis.storage = store!.createInstance({\n\t\t\t\t\tname: this.name\n\t\t\t});\n\t\t} catch (_e) {\n\t\t\tthrow new Error(\"localForage lib not loaded\");\n\t\t}\n\t}\n\n\t/**\n\t * Add online and offline event listeners\n\t * @private\n\t */\n\taddListeners(): void {\n\t\tthis._status = this.status.bind(this);\n\t\twindow.addEventListener(\"online\", this._status as EventListener);\n\t window.addEventListener(\"offline\", this._status as EventListener);\n\t}\n\n\t/**\n\t * Remove online and offline event listeners\n\t * @private\n\t */\n\tremoveListeners(): void {\n\t\twindow.removeEventListener(\"online\", this._status as EventListener);\n\t window.removeEventListener(\"offline\", this._status as EventListener);\n\t\tthis._status = undefined;\n\t}\n\n\t/**\n\t * Update the online / offline status\n\t * @private\n\t */\n\tstatus(_event: Event): void {\n\t\tconst online = navigator.onLine;\n\t\tthis.online = online;\n\t\tif (online) {\n\t\t\tthis.emit(\"online\", this);\n\t\t} else {\n\t\t\tthis.emit(\"offline\", this);\n\t\t}\n\t}\n\n\t/**\n\t * Add all of a book resources to the store\n\t * @param {Resources} resources book resources\n\t * @param {boolean} [force] force resaving resources\n\t * @return {Promise<object>} store objects\n\t */\n\tadd(resources: { resources: Array<{ href: string }> }, force?: boolean): Promise<any[]> {\n\t\tconst mapped = resources.resources.map((item: { href: string }) => {\n\t\t\tconst { href } = item;\n\t\t\tconst url = this.resolver(href);\n\t\t\tconst encodedUrl = window.encodeURIComponent(url);\n\n\t\t\treturn this.storage.getItem(encodedUrl).then((item: any) => {\n\t\t\t\tif (!item || force) {\n\t\t\t\t\treturn this.requester(url, \"binary\")\n\t\t\t\t\t\t.then((data: any) => {\n\t\t\t\t\t\t\treturn this.storage.setItem(encodedUrl, data);\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn item;\n\t\t\t\t}\n\t\t\t});\n\n\t\t});\n\t\treturn Promise.all(mapped);\n\t}\n\n\t/**\n\t * Put binary data from a url to storage\n\t * @param {string} url a url to request from storage\n\t * @param {boolean} [withCredentials]\n\t * @param {object} [headers]\n\t * @return {Promise<Blob>}\n\t */\n\tput(url: string, withCredentials?: boolean, headers?: Record<string, string>): Promise<any> {\n\t\tconst encodedUrl = window.encodeURIComponent(url);\n\n\t\treturn this.storage.getItem(encodedUrl).then((result: any) => {\n\t\t\tif (!result) {\n\t\t\t\treturn this.requester(url, \"binary\", withCredentials, headers).then((data: any) => {\n\t\t\t\t\treturn this.storage.setItem(encodedUrl, data);\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\t}\n\n\t/**\n\t * Request a url\n\t * @param {string} url a url to request from storage\n\t * @param {string} [type] specify the type of the returned result\n\t * @param {boolean} [withCredentials]\n\t * @param {object} [headers]\n\t * @return {Promise<Blob | string | JSON | Document | XMLDocument>}\n\t */\n\trequest(url: string, type?: string, withCredentials?: boolean, headers?: Record<string, string>): Promise<any> {\n\t\tif (this.online) {\n\t\t\t// From network\n\t\t\treturn this.requester(url, type, withCredentials, headers).then((data: any) => {\n\t\t\t\t// save to store if not present\n\t\t\t\tthis.put(url);\n\t\t\t\treturn data;\n\t\t\t})\n\t\t} else {\n\t\t\t// From store\n\t\t\treturn this.retrieve(url, type);\n\t\t}\n\n\t}\n\n\t/**\n\t * Request a url from storage\n\t * @param {string} url a url to request from storage\n\t * @param {string} [type] specify the type of the returned result\n\t * @return {Promise<Blob | string | JSON | Document | XMLDocument>}\n\t */\n\tretrieve(url: string, type?: string): Promise<any> {\n\t\tlet response;\n\t\tconst path = new Path(url);\n\n\t\t// If type isn't set, determine it from the file extension\n\t\tif(!type) {\n\t\t\ttype = path.extension;\n\t\t}\n\n\t\tif(type == \"blob\"){\n\t\t\tresponse = this.getBlob(url);\n\t\t} else {\n\t\t\tresponse = this.getText(url);\n\t\t}\n\n\n\t\treturn response.then((r) => {\n\t\t\tconst deferred = new defer();\n\t\t\tlet result;\n\t\t\tif (r) {\n\t\t\t\tresult = this.handleResponse(r, type);\n\t\t\t\tdeferred.resolve(result);\n\t\t\t} else {\n\t\t\t\tdeferred.reject({\n\t\t\t\t\tmessage : \"File not found in storage: \" + url,\n\t\t\t\t\tstack : new Error().stack\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn deferred.promise;\n\t\t});\n\t}\n\n\t/**\n\t * Handle the response from request\n\t * @private\n\t * @param {any} response\n\t * @param {string} [type]\n\t * @return {any} the parsed result\n\t */\n\thandleResponse(response: any, type?: string): any {\n\t\tlet r;\n\n\t\tif(type == \"json\") {\n\t\t\tr = JSON.parse(response);\n\t\t}\n\t\telse\n\t\tif(isXml(type!)) {\n\t\t\tr = parse(response, \"text/xml\");\n\t\t}\n\t\telse\n\t\tif(type == \"xhtml\") {\n\t\t\tr = parse(response, \"application/xhtml+xml\");\n\t\t}\n\t\telse\n\t\tif(type == \"html\" || type == \"htm\") {\n\t\t\tr = parse(response, \"text/html\");\n\t\t } else {\n\t\t\t r = response;\n\t\t }\n\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get a Blob from Storage by Url\n\t * @param {string} url\n\t * @param {string} [mimeType]\n\t * @return {Blob}\n\t */\n\tgetBlob(url: string, mimeType?: string): Promise<Blob | undefined> {\n\t\tconst encodedUrl = window.encodeURIComponent(url);\n\n\t\treturn this.storage.getItem(encodedUrl).then(function(uint8array: any) {\n\t\t\tif(!uint8array) return;\n\n\t\t\tmimeType = mimeType || mime.lookup(url);\n\n\t\t\treturn new Blob([uint8array], {type : mimeType});\n\t\t});\n\n\t}\n\n\t/**\n\t * Get Text from Storage by Url\n\t * @param {string} url\n\t * @param {string} [mimeType]\n\t * @return {string}\n\t */\n\tgetText(url: string, mimeType?: string): Promise<any> {\n\t\tconst encodedUrl = window.encodeURIComponent(url);\n\n\t\tmimeType = mimeType || mime.lookup(url);\n\n\t\treturn this.storage.getItem(encodedUrl).then(function(uint8array: any) {\n\t\t\tconst deferred = new defer();\n\t\t\tconst reader = new FileReader();\n\n\t\t\tif(!uint8array) return;\n\n\t\t\tconst blob = new Blob([uint8array], {type : mimeType});\n\n\t\t\treader.addEventListener(\"loadend\", () => {\n\t\t\t\tdeferred.resolve(reader.result);\n\t\t\t});\n\n\t\t\treader.readAsText(blob, mimeType);\n\n\t\t\treturn deferred.promise;\n\t\t});\n\t}\n\n\t/**\n\t * Get a base64 encoded result from Storage by Url\n\t * @param {string} url\n\t * @param {string} [mimeType]\n\t * @return {string} base64 encoded\n\t */\n\tgetBase64(url: string, mimeType?: string): Promise<any> {\n\t\tconst encodedUrl = window.encodeURIComponent(url);\n\n\t\tmimeType = mimeType || mime.lookup(url);\n\n\t\treturn this.storage.getItem(encodedUrl).then((uint8array: any) => {\n\t\t\tconst deferred = new defer();\n\t\t\tconst reader = new FileReader();\n\n\t\t\tif(!uint8array) return;\n\n\t\t\tconst blob = new Blob([uint8array], {type : mimeType});\n\n\t\t\treader.addEventListener(\"loadend\", () => {\n\t\t\t\tdeferred.resolve(reader.result);\n\t\t\t});\n\t\t\treader.readAsDataURL(blob);\n\n\t\t\treturn deferred.promise;\n\t\t});\n\t}\n\n\t/**\n\t * Create a Url from a stored item\n\t * @param {string} url\n\t * @param {object} [options.base64] use base64 encoding or blob url\n\t * @return {Promise} url promise with Url string\n\t */\n\tcreateUrl(url: string, options?: { base64?: boolean }): Promise<string> {\n\t\tconst deferred = new defer();\n\t\tconst _URL = window.URL || (window as any).webkitURL || (window as any).mozURL;\n\t\tlet tempUrl;\n\t\tlet response;\n\t\tconst useBase64 = options && options.base64;\n\n\t\tif(url in this.urlCache) {\n\t\t\tdeferred.resolve(this.urlCache[url]);\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\tif (useBase64) {\n\t\t\tresponse = this.getBase64(url);\n\n\t\t\tif (response) {\n\t\t\t\tresponse.then(function(tempUrl: string) {\n\n\t\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t\t}.bind(this));\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tresponse = this.getBlob(url);\n\n\t\t\tif (response) {\n\t\t\t\tresponse.then(function(blob: Blob) {\n\n\t\t\t\t\ttempUrl = _URL.createObjectURL(blob);\n\t\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t\t}.bind(this));\n\n\t\t\t}\n\t\t}\n\n\n\t\tif (!response) {\n\t\t\tdeferred.reject({\n\t\t\t\tmessage : \"File not found in storage: \" + url,\n\t\t\t\tstack : new Error().stack\n\t\t\t});\n\t\t}\n\n\t\treturn deferred.promise;\n\t}\n\n\t/**\n\t * Revoke Temp Url for a archive item\n\t * @param {string} url url of the item in the store\n\t */\n\trevokeUrl(url: string): void {\n\t\tconst _URL = window.URL || (window as any).webkitURL || (window as any).mozURL;\n\t\tconst fromCache = this.urlCache[url];\n\t\tif(fromCache) _URL.revokeObjectURL(fromCache);\n\t}\n\n\tdestroy(): void {\n\t\tconst _URL = window.URL || (window as any).webkitURL || (window as any).mozURL;\n\t\tfor (const fromCache in this.urlCache) {\n\t\t\t_URL.revokeObjectURL(fromCache);\n\t\t}\n\t\tthis.urlCache = {};\n\t\tthis.removeListeners();\n\t}\n}\n\nEventEmitter(Store.prototype);\n\nexport default Store;\n","import {qs, qsa } from \"./utils/core\";\n\n/**\n * Open DisplayOptions Format Parser\n * @class\n * @param {document} displayOptionsDocument XML\n */\nclass DisplayOptions {\n\tinteractive: string;\n\tfixedLayout: string;\n\topenToSpread: string;\n\torientationLock: string;\n\n\tconstructor(displayOptionsDocument?: Document) {\n\t\tthis.interactive = \"\";\n\t\tthis.fixedLayout = \"\";\n\t\tthis.openToSpread = \"\";\n\t\tthis.orientationLock = \"\";\n\n\t\tif (displayOptionsDocument) {\n\t\t\tthis.parse(displayOptionsDocument);\n\t\t}\n\t}\n\n\t/**\n\t * Parse XML\n\t * @param {document} displayOptionsDocument XML\n\t * @return {DisplayOptions} self\n\t */\n\tparse(displayOptionsDocument: Document): this {\n\t\tif(!displayOptionsDocument) {\n\t\t\treturn this;\n\t\t}\n\n\t\tconst displayOptionsNode = qs(displayOptionsDocument, \"display_options\");\n\t\tif(!displayOptionsNode) {\n\t\t\treturn this;\n\t\t} \n\n\t\tconst options = qsa(displayOptionsNode, \"option\") as NodeListOf<Element>;\n\t\toptions.forEach((el) => {\n\t\t\tlet value = \"\";\n\n\t\t\tif (el.childNodes.length) {\n\t\t\t\tvalue = el.childNodes[0].nodeValue ?? \"\";\n\t\t\t}\n\n\t\t\tswitch ((el.attributes as any).name.value) {\n\t\t\t case \"interactive\":\n\t\t\t this.interactive = value;\n\t\t\t break;\n\t\t\t case \"fixed-layout\":\n\t\t\t this.fixedLayout = value;\n\t\t\t break;\n\t\t\t case \"open-to-spread\":\n\t\t\t this.openToSpread = value;\n\t\t\t break;\n\t\t\t case \"orientation-lock\":\n\t\t\t this.orientationLock = value;\n\t\t\t break;\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tdestroy(): void {\n\t\t(this as any).interactive = undefined;\n\t\t(this as any).fixedLayout = undefined;\n\t\t(this as any).openToSpread = undefined;\n\t\t(this as any).orientationLock = undefined;\n\t}\n}\n\nexport default DisplayOptions;\n","import EventEmitter from \"./utils/event-emitter\";\nimport {extend, defer} from \"./utils/core\";\nimport Url from \"./utils/url\";\nimport Path from \"./utils/path\";\nimport Spine from \"./spine\";\nimport Locations from \"./locations\";\nimport Container from \"./container\";\nimport Packaging from \"./packaging\";\nimport Navigation from \"./navigation\";\nimport Resources from \"./resources\";\nimport PageList from \"./pagelist\";\nimport Rendition from \"./rendition\";\nimport Archive from \"./archive\";\nimport request from \"./utils/request\";\nimport EpubCFI from \"./epubcfi\";\nimport Store from \"./store\";\nimport DisplayOptions from \"./displayoptions\";\nimport { EPUBJS_VERSION, EVENTS } from \"./utils/constants\";\nimport type { IEventEmitter, BookOptions, RenditionOptions, RequestFunction } from \"./types\";\nimport type Section from \"./section\";\n\ninterface BookLoadingState {\n\tmanifest: defer;\n\tspine: defer;\n\tmetadata: defer;\n\tcover: defer;\n\tnavigation: defer;\n\tpageList: defer;\n\tresources: defer;\n\tdisplayOptions: defer;\n}\n\ninterface BookLoadedState {\n\tmanifest: Promise<any>;\n\tspine: Promise<any>;\n\tmetadata: Promise<any>;\n\tcover: Promise<any>;\n\tnavigation: Promise<any>;\n\tpageList: Promise<any>;\n\tresources: Promise<any>;\n\tdisplayOptions: Promise<any>;\n}\n\nconst CONTAINER_PATH = \"META-INF/container.xml\";\nconst IBOOKS_DISPLAY_OPTIONS_PATH = \"META-INF/com.apple.ibooks.display-options.xml\";\n\nconst INPUT_TYPE = {\n\tBINARY: \"binary\",\n\tBASE64: \"base64\",\n\tEPUB: \"epub\",\n\tOPF: \"opf\",\n\tMANIFEST: \"json\",\n\tDIRECTORY: \"directory\"\n};\n\n/**\n * An Epub representation with methods for the loading, parsing and manipulation\n * of its contents.\n * @class\n * @param {string} [url]\n * @param {object} [options]\n * @param {method} [options.requestMethod] a request function to use instead of the default\n * @param {boolean} [options.requestCredentials=undefined] send the xhr request withCredentials\n * @param {object} [options.requestHeaders=undefined] send the xhr request headers\n * @param {string} [options.encoding=binary] optional to pass 'binary' or base64' for archived Epubs\n * @param {string} [options.replacements=none] use base64, blobUrl, or none for replacing assets in archived Epubs\n * @param {method} [options.canonical] optional function to determine canonical urls for a path\n * @param {string} [options.openAs] optional string to determine the input type\n * @param {string} [options.store=false] cache the contents in local storage, value should be the name of the reader\n * @returns {Book}\n * @example new Book(\"/path/to/book.epub\", {})\n * @example new Book({ replacements: \"blobUrl\" })\n */\nclass Book implements IEventEmitter {\n\tsettings: BookOptions & Record<string, any>;\n\topening: defer;\n\topened: Promise<Book> | undefined;\n\tisOpen: boolean;\n\tloading: BookLoadingState | undefined;\n\tloaded: BookLoadedState | undefined;\n\tready: Promise<any[]> | undefined;\n\tisRendered: boolean;\n\trequest: RequestFunction;\n\tspine: Spine | undefined;\n\tlocations: Locations | undefined;\n\tnavigation: Navigation | undefined;\n\tpageList: PageList | undefined;\n\turl: Url | undefined;\n\tpath: Path | undefined;\n\tarchived: boolean;\n\tarchive: Archive | undefined;\n\tstorage: Store | undefined;\n\tresources: Resources | undefined;\n\trendition: Rendition | undefined;\n\tcontainer: Container | undefined;\n\tpackaging: Packaging | undefined;\n\tdisplayOptions: DisplayOptions | undefined;\n\tpackage: Packaging | undefined;\n\tcover: string;\n\n\tdeclare on: IEventEmitter[\"on\"];\n\tdeclare off: IEventEmitter[\"off\"];\n\tdeclare emit: IEventEmitter[\"emit\"];\n\n\tconstructor(url?: string | ArrayBuffer | Blob | BookOptions, options?: BookOptions) {\n\t\t// Allow passing just options to the Book\n\t\tif (typeof(options) === \"undefined\" &&\n\t\t\t typeof(url) !== \"string\" &&\n\t\t url instanceof Blob === false &&\n\t\t url instanceof ArrayBuffer === false) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\tthis.settings = extend(this.settings || {}, {\n\t\t\trequestMethod: undefined,\n\t\t\trequestCredentials: undefined,\n\t\t\trequestHeaders: undefined,\n\t\t\tencoding: undefined,\n\t\t\treplacements: undefined,\n\t\t\tcanonical: undefined,\n\t\t\topenAs: undefined,\n\t\t\tstore: undefined\n\t\t});\n\n\t\textend(this.settings, options);\n\n\n\t\t// Promises\n\t\tthis.opening = new defer();\n\t\t/**\n\t\t * @member {promise} opened returns after the book is loaded\n\t\t * @memberof Book\n\t\t */\n\t\tthis.opened = this.opening.promise;\n\t\tthis.isOpen = false;\n\n\t\tthis.loading = {\n\t\t\tmanifest: new defer(),\n\t\t\tspine: new defer(),\n\t\t\tmetadata: new defer(),\n\t\t\tcover: new defer(),\n\t\t\tnavigation: new defer(),\n\t\t\tpageList: new defer(),\n\t\t\tresources: new defer(),\n\t\t\tdisplayOptions: new defer()\n\t\t};\n\n\t\tthis.loaded = {\n\t\t\tmanifest: this.loading.manifest.promise,\n\t\t\tspine: this.loading.spine.promise,\n\t\t\tmetadata: this.loading.metadata.promise,\n\t\t\tcover: this.loading.cover.promise,\n\t\t\tnavigation: this.loading.navigation.promise,\n\t\t\tpageList: this.loading.pageList.promise,\n\t\t\tresources: this.loading.resources.promise,\n\t\t\tdisplayOptions: this.loading.displayOptions.promise\n\t\t};\n\n\t\t/**\n\t\t * @member {promise} ready returns after the book is loaded and parsed\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.ready = Promise.all([\n\t\t\tthis.loaded.manifest,\n\t\t\tthis.loaded.spine,\n\t\t\tthis.loaded.metadata,\n\t\t\tthis.loaded.cover,\n\t\t\tthis.loaded.navigation,\n\t\t\tthis.loaded.resources,\n\t\t\tthis.loaded.displayOptions\n\t\t]);\n\n\n\t\t// Queue for methods used before opening\n\t\tthis.isRendered = false;\n\t\t// this._q = queue(this);\n\n\t\t/**\n\t\t * @member {method} request\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.request = this.settings.requestMethod || request;\n\n\t\t/**\n\t\t * @member {Spine} spine\n\t\t * @memberof Book\n\t\t */\n\t\tthis.spine = new Spine();\n\n\t\t/**\n\t\t * @member {Locations} locations\n\t\t * @memberof Book\n\t\t */\n\t\tthis.locations = new Locations(this.spine, this.load.bind(this));\n\n\t\t/**\n\t\t * @member {Navigation} navigation\n\t\t * @memberof Book\n\t\t */\n\t\tthis.navigation = undefined;\n\n\t\t/**\n\t\t * @member {PageList} pagelist\n\t\t * @memberof Book\n\t\t */\n\t\tthis.pageList = undefined;\n\n\t\t/**\n\t\t * @member {Url} url\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.url = undefined;\n\n\t\t/**\n\t\t * @member {Path} path\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.path = undefined;\n\n\t\t/**\n\t\t * @member {boolean} archived\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.archived = false;\n\n\t\t/**\n\t\t * @member {Archive} archive\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.archive = undefined;\n\n\t\t/**\n\t\t * @member {Store} storage\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.storage = undefined;\n\n\t\t/**\n\t\t * @member {Resources} resources\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.resources = undefined;\n\n\t\t/**\n\t\t * @member {Rendition} rendition\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.rendition = undefined;\n\n\t\t/**\n\t\t * @member {Container} container\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.container = undefined;\n\n\t\t/**\n\t\t * @member {Packaging} packaging\n\t\t * @memberof Book\n\t\t * @private\n\t\t */\n\t\tthis.packaging = undefined;\n\n\t\t/**\n\t\t * @member {DisplayOptions} displayOptions\n\t\t * @memberof DisplayOptions\n\t\t * @private\n\t\t */\n\t\tthis.displayOptions = undefined;\n\n\t\t// this.toc = undefined;\n\t\tif (this.settings.store) {\n\t\t\tthis.store(this.settings.store);\n\t\t}\n\n\t\tif(url) {\n\t\t\tthis.open(url as string | ArrayBuffer | Blob, this.settings.openAs).catch((_error) => {\n\t\t\t\tconst err = new Error(\"Cannot load book at \"+ url );\n\t\t\t\tthis.emit(EVENTS.BOOK.OPEN_FAILED, err);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Open a epub or url\n\t * @param {string | ArrayBuffer} input Url, Path or ArrayBuffer\n\t * @param {string} [what=\"binary\", \"base64\", \"epub\", \"opf\", \"json\", \"directory\"] force opening as a certain type\n\t * @returns {Promise} of when the book has been loaded\n\t * @example book.open(\"/path/to/book.epub\")\n\t */\n\topen(input: string | ArrayBuffer | Blob, what?: string): Promise<void> {\n\t\tlet opening;\n\t\tconst type = what || this.determineType(input);\n\n\t\tif (type === INPUT_TYPE.BINARY) {\n\t\t\tthis.archived = true;\n\t\t\tthis.url = new Url(\"/\", \"\");\n\t\t\topening = this.openEpub(input);\n\t\t} else if (type === INPUT_TYPE.BASE64) {\n\t\t\tthis.archived = true;\n\t\t\tthis.url = new Url(\"/\", \"\");\n\t\t\topening = this.openEpub(input, type);\n\t\t} else if (type === INPUT_TYPE.EPUB) {\n\t\t\tthis.archived = true;\n\t\t\tthis.url = new Url(\"/\", \"\");\n\t\t\topening = this.request(input as string, \"binary\", this.settings.requestCredentials, this.settings.requestHeaders)\n\t\t\t\t.then(this.openEpub.bind(this));\n\t\t} else if(type == INPUT_TYPE.OPF) {\n\t\t\tthis.url = new Url(input as string);\n\t\t\topening = this.openPackaging(this.url.Path.toString());\n\t\t} else if(type == INPUT_TYPE.MANIFEST) {\n\t\t\tthis.url = new Url(input as string);\n\t\t\topening = this.openManifest(this.url.Path.toString());\n\t\t} else {\n\t\t\tthis.url = new Url(input as string);\n\t\t\topening = this.openContainer(CONTAINER_PATH)\n\t\t\t\t.then(this.openPackaging.bind(this));\n\t\t}\n\n\t\treturn opening;\n\t}\n\n\t/**\n\t * Open an archived epub\n\t * @private\n\t * @param {binary} data\n\t * @param {string} [encoding]\n\t * @return {Promise}\n\t */\n\topenEpub(data: string | ArrayBuffer | Blob, encoding?: string): Promise<void> {\n\t\treturn this.unarchive(data, encoding || this.settings.encoding)\n\t\t\t.then(() => {\n\t\t\t\treturn this.openContainer(CONTAINER_PATH);\n\t\t\t})\n\t\t\t.then((packagePath) => {\n\t\t\t\treturn this.openPackaging(packagePath);\n\t\t\t});\n\t}\n\n\t/**\n\t * Open the epub container\n\t * @private\n\t * @param {string} url\n\t * @return {string} packagePath\n\t */\n\topenContainer(url: string): Promise<string> {\n\t\treturn this.load(url)\n\t\t\t.then((xml) => {\n\t\t\t\tthis.container = new Container(xml);\n\t\t\t\treturn this.resolve(this.container.packagePath);\n\t\t\t});\n\t}\n\n\t/**\n\t * Open the Open Packaging Format Xml\n\t * @private\n\t * @param {string} url\n\t * @return {Promise}\n\t */\n\topenPackaging(url: string): Promise<void> {\n\t\tthis.path = new Path(url);\n\t\treturn this.load(url)\n\t\t\t.then((xml) => {\n\t\t\t\tthis.packaging = new Packaging(xml);\n\t\t\t\treturn this.unpack(this.packaging);\n\t\t\t});\n\t}\n\n\t/**\n\t * Open the manifest JSON\n\t * @private\n\t * @param {string} url\n\t * @return {Promise}\n\t */\n\topenManifest(url: string): Promise<void> {\n\t\tthis.path = new Path(url);\n\t\treturn this.load(url)\n\t\t\t.then((json) => {\n\t\t\t\tthis.packaging = new Packaging();\n\t\t\t\tthis.packaging.load(json);\n\t\t\t\treturn this.unpack(this.packaging);\n\t\t\t});\n\t}\n\n\t/**\n\t * Load a resource from the Book\n\t * @param {string} path path to the resource to load\n\t * @return {Promise} returns a promise with the requested resource\n\t */\n\tload(path: string, _type?: string): Promise<any> {\n\t\tconst resolved = this.resolve(path);\n\t\tif(this.archived) {\n\t\t\treturn this.archive!.request(resolved);\n\t\t} else {\n\t\t\treturn this.request(resolved, undefined, this.settings.requestCredentials, this.settings.requestHeaders);\n\t\t}\n\t}\n\n\t/**\n\t * Resolve a path to it's absolute position in the Book\n\t * @param {string} path\n\t * @param {boolean} [absolute] force resolving the full URL\n\t * @return {string} the resolved path string\n\t */\n\tresolve(path: string, absolute?: boolean): string {\n\t\tif (!path) {\n\t\t\treturn \"\";\n\t\t}\n\t\tlet resolved = path;\n\t\tconst isAbsolute = (path.indexOf(\"://\") > -1);\n\n\t\tif (isAbsolute) {\n\t\t\treturn path;\n\t\t}\n\n\t\tif (this.path) {\n\t\t\tresolved = this.path.resolve(path);\n\t\t}\n\n\t\tif(absolute != false && this.url) {\n\t\t\tresolved = this.url.resolve(resolved);\n\t\t}\n\n\t\treturn resolved;\n\t}\n\n\t/**\n\t * Get a canonical link to a path\n\t * @param {string} path\n\t * @return {string} the canonical path string\n\t */\n\tcanonical(path: string): string {\n\t\tlet url = path;\n\n\t\tif (!path) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (this.settings.canonical) {\n\t\t\turl = this.settings.canonical(path);\n\t\t} else {\n\t\t\turl = this.resolve(path, true);\n\t\t}\n\n\t\treturn url;\n\t}\n\n\t/**\n\t * Determine the type of they input passed to open\n\t * @private\n\t * @param {string} input\n\t * @return {string} binary | directory | epub | opf\n\t */\n\tdetermineType(input: string | ArrayBuffer | Blob): string {\n\t\tlet extension;\n\n\t\tif (this.settings.encoding === \"base64\") {\n\t\t\treturn INPUT_TYPE.BASE64;\n\t\t}\n\n\t\tif(typeof(input) != \"string\") {\n\t\t\treturn INPUT_TYPE.BINARY;\n\t\t}\n\n\t\tconst url = new Url(input);\n\t\tconst path = url.path();\n\t\textension = path.extension;\n\n\t\t// If there's a search string, remove it before determining type\n\t\tif (extension) {\n\t\t\textension = extension.replace(/\\?.*$/, \"\");\n\t\t}\n\n\t\tif (!extension) {\n\t\t\treturn INPUT_TYPE.DIRECTORY;\n\t\t}\n\n\t\tif(extension === \"epub\"){\n\t\t\treturn INPUT_TYPE.EPUB;\n\t\t}\n\n\t\tif(extension === \"opf\"){\n\t\t\treturn INPUT_TYPE.OPF;\n\t\t}\n\n\t\tif(extension === \"json\"){\n\t\t\treturn INPUT_TYPE.MANIFEST;\n\t\t}\n\n\t\treturn INPUT_TYPE.BINARY;\n\t}\n\n\n\t/**\n\t * unpack the contents of the Books packaging\n\t * @private\n\t * @param {Packaging} packaging object\n\t */\n\tunpack(packaging: Packaging): void {\n\t\tthis.package = packaging; //TODO: deprecated this\n\n\t\tif (this.packaging!.metadata.layout === \"\") {\n\t\t\t// rendition:layout not set - check display options if book is pre-paginated\n\t\t\tthis.load(this.url!.resolve(IBOOKS_DISPLAY_OPTIONS_PATH)).then((xml) => {\n\t\t\t\tthis.displayOptions = new DisplayOptions(xml);\n\t\t\t\tthis.loading!.displayOptions.resolve(this.displayOptions);\n\t\t\t}).catch((_err) => {\n\t\t\t\tthis.displayOptions = new DisplayOptions();\n\t\t\t\tthis.loading!.displayOptions.resolve(this.displayOptions);\n\t\t\t});\n\t\t} else {\n\t\t\tthis.displayOptions = new DisplayOptions();\n\t\t\tthis.loading!.displayOptions.resolve(this.displayOptions);\n\t\t}\n\n\t\tthis.spine!.unpack(this.packaging!, this.resolve.bind(this), this.canonical.bind(this));\n\n\t\tthis.resources = new Resources(this.packaging!.manifest, {\n\t\t\tarchive: this.archive,\n\t\t\tresolver: this.resolve.bind(this),\n\t\t\trequest: this.request.bind(this),\n\t\t\treplacements: this.settings.replacements || (this.archived ? \"blobUrl\" : \"base64\")\n\t\t});\n\n\t\tthis.loadNavigation(this.packaging!).then(() => {\n\t\t\t// this.toc = this.navigation.toc;\n\t\t\tthis.loading!.navigation.resolve(this.navigation);\n\t\t});\n\n\t\tif (this.packaging!.coverPath) {\n\t\t\tthis.cover = this.resolve(this.packaging!.coverPath);\n\t\t}\n\t\t// Resolve promises\n\t\tthis.loading!.manifest.resolve(this.packaging!.manifest);\n\t\tthis.loading!.metadata.resolve(this.packaging!.metadata);\n\t\tthis.loading!.spine.resolve(this.spine);\n\t\tthis.loading!.cover.resolve(this.cover);\n\t\tthis.loading!.resources.resolve(this.resources);\n\t\tthis.loading!.pageList.resolve(this.pageList);\n\n\t\tthis.isOpen = true;\n\n\t\tif(this.archived || this.settings.replacements && this.settings.replacements != \"none\") {\n\t\t\tthis.replacements().then(() => {\n\t\t\t\tthis.loaded!.displayOptions.then(() => {\n\t\t\t\t\tthis.opening.resolve(this);\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(err);\n\t\t\t});\n\t\t} else {\n\t\t\t// Resolve book opened promise\n\t\t\tthis.loaded!.displayOptions.then(() => {\n\t\t\t\tthis.opening.resolve(this);\n\t\t\t});\n\t\t}\n\n\t}\n\n\t/**\n\t * Load Navigation and PageList from package\n\t * @private\n\t * @param {Packaging} packaging\n\t */\n\tloadNavigation(packaging: Packaging): Promise<Navigation> {\n\t\tconst navPath = packaging.navPath || packaging.ncxPath;\n\t\tconst toc = packaging.toc;\n\n\t\t// From json manifest\n\t\tif (toc) {\n\t\t\treturn new Promise((resolve, _reject) => {\n\t\t\t\tthis.navigation = new Navigation(toc);\n\n\t\t\t\tif ((packaging as any).pageList) {\n\t\t\t\t\tthis.pageList = new PageList((packaging as any).pageList); // TODO: handle page lists from Manifest\n\t\t\t\t}\n\n\t\t\t\tresolve(this.navigation);\n\t\t\t});\n\t\t}\n\n\t\tif (!navPath) {\n\t\t\treturn new Promise((resolve, _reject) => {\n\t\t\t\tthis.navigation = new Navigation();\n\t\t\t\tthis.pageList = new PageList();\n\n\t\t\t\tresolve(this.navigation);\n\t\t\t});\n\t\t}\n\n\t\treturn this.load(navPath, \"xml\")\n\t\t\t.then((xml) => {\n\t\t\t\tthis.navigation = new Navigation(xml);\n\t\t\t\tthis.pageList = new PageList(xml);\n\t\t\t\treturn this.navigation;\n\t\t\t});\n\t}\n\n\t/**\n\t * Gets a Section of the Book from the Spine\n\t * Alias for `book.spine.get`\n\t * @param {string} target\n\t * @return {Section}\n\t */\n\tsection(target: string | number): Section | null {\n\t\treturn this.spine!.get(target);\n\t}\n\n\t/**\n\t * Sugar to render a book to an element\n\t * @param {element | string} element element or string to add a rendition to\n\t * @param {object} [options]\n\t * @return {Rendition}\n\t */\n\trenderTo(element: HTMLElement | string, options?: RenditionOptions): Rendition {\n\t\tthis.rendition = new Rendition(this, options);\n\t\tthis.rendition.attachTo(element);\n\n\t\treturn this.rendition;\n\t}\n\n\t/**\n\t * Set if request should use withCredentials\n\t * @param {boolean} credentials\n\t */\n\tsetRequestCredentials(credentials: boolean): void {\n\t\tthis.settings.requestCredentials = credentials;\n\t}\n\n\t/**\n\t * Set headers request should use\n\t * @param {object} headers\n\t */\n\tsetRequestHeaders(headers: Record<string, string>): void {\n\t\tthis.settings.requestHeaders = headers;\n\t}\n\n\t/**\n\t * Unarchive a zipped epub\n\t * @private\n\t * @param {binary} input epub data\n\t * @param {string} [encoding]\n\t * @return {Archive}\n\t */\n\tunarchive(input: string | ArrayBuffer | Blob, encoding?: string): Promise<any> {\n\t\tthis.archive = new Archive();\n\t\treturn this.archive.open(input, encoding === \"base64\");\n\t}\n\n\t/**\n\t * Store the epubs contents\n\t * @private\n\t * @param {binary} input epub data\n\t * @param {string} [encoding]\n\t * @return {Store}\n\t */\n\tstore(name: string | boolean): Store {\n\t\t// Use \"blobUrl\" or \"base64\" for replacements\n\t\tconst replacementsSetting = this.settings.replacements && this.settings.replacements !== \"none\";\n\t\t// Save original url\n\t\tconst originalUrl = this.url;\n\t\t// Save original request method\n\t\tconst requester = this.settings.requestMethod || request.bind(this);\n\t\t// Create new Store\n\t\tthis.storage = new Store(name as string, requester, this.resolve.bind(this));\n\t\t// Replace request method to go through store\n\t\tthis.request = this.storage.request.bind(this.storage);\n\n\t\tthis.opened!.then(() => {\n\t\t\tif (this.archived) {\n\t\t\t\tthis.storage!.requester = this.archive!.request.bind(this.archive!);\n\t\t\t}\n\t\t\t// Substitute hook\n\t\t\tconst substituteResources = (output: string, section: Section) => {\n\t\t\t\tsection.output = this.resources!.substitute(output, section.url);\n\t\t\t};\n\n\t\t\t// Set to use replacements\n\t\t\t(this.resources!.settings as any).replacements = replacementsSetting || \"blobUrl\";\n\t\t\t// Create replacement urls\n\t\t\tthis.resources!.replacements().\n\t\t\t\tthen(() => {\n\t\t\t\t\treturn this.resources!.replaceCss();\n\t\t\t\t});\n\n\t\t\tthis.storage!.on(\"offline\", () => {\n\t\t\t\t// Remove url to use relative resolving for hrefs\n\t\t\t\tthis.url = new Url(\"/\", \"\");\n\t\t\t\t// Add hook to replace resources in contents\n\t\t\t\tthis.spine!.hooks.serialize.register(substituteResources);\n\t\t\t});\n\n\t\t\tthis.storage!.on(\"online\", () => {\n\t\t\t\t// Restore original url\n\t\t\t\tthis.url = originalUrl;\n\t\t\t\t// Remove hook\n\t\t\t\tthis.spine!.hooks.serialize.deregister(substituteResources);\n\t\t\t});\n\n\t\t});\n\n\t\treturn this.storage;\n\t}\n\n\t/**\n\t * Get the cover url\n\t * @return {Promise<?string>} coverUrl\n\t */\n\tcoverUrl(): Promise<string | null> {\n\t\treturn this.loaded!.cover.then(() => {\n\t\t\tif (!this.cover) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (this.archived) {\n\t\t\t\treturn this.archive!.createUrl(this.cover);\n\t\t\t} else {\n\t\t\t\treturn this.cover;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Load replacement urls\n\t * @private\n\t * @return {Promise} completed loading urls\n\t */\n\treplacements(): Promise<void> {\n\t\tthis.spine!.hooks.serialize.register((output: string, section: Section) => {\n\t\t\tsection.output = this.resources!.substitute(output, section.url);\n\t\t});\n\n\t\treturn this.resources!.replacements().\n\t\t\tthen(() => {\n\t\t\t\treturn this.resources!.replaceCss();\n\t\t\t}).then(() => {});\n\t}\n\n\t/**\n\t * Find a DOM Range for a given CFI Range\n\t * @param {EpubCFI} cfiRange a epub cfi range\n\t * @return {Promise}\n\t */\n\tgetRange(cfiRange: string): Promise<Range> {\n\t\tconst cfi = new EpubCFI(cfiRange);\n\t\tconst item = this.spine!.get(cfi.spinePos);\n\t\tconst _request = this.load.bind(this);\n\t\tif (!item) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\treject(\"CFI could not be found\");\n\t\t\t});\n\t\t}\n\t\treturn item.load(_request).then(function (_contents: Element): Range {\n\t\t\tconst range = cfi.toRange(item!.document);\n\t\t\treturn range!;\n\t\t});\n\t}\n\n\t/**\n\t * Generates the Book Key using the identifier in the manifest or other string provided\n\t * @param {string} [identifier] to use instead of metadata identifier\n\t * @return {string} key\n\t */\n\tkey(identifier?: string): string {\n\t\tconst ident = identifier || this.packaging!.metadata.identifier || this.url!.filename;\n\t\treturn `epubjs:${EPUBJS_VERSION}:${ident}`;\n\t}\n\n\t/**\n\t * Destroy the Book and all associated objects\n\t */\n\tdestroy(): void {\n\t\tthis.opened = undefined;\n\t\tthis.loading = undefined;\n\t\tthis.loaded = undefined;\n\t\tthis.ready = undefined;\n\n\t\tthis.isOpen = false;\n\t\tthis.isRendered = false;\n\n\t\tthis.spine && this.spine.destroy();\n\t\tthis.locations && this.locations.destroy();\n\t\tthis.pageList && this.pageList.destroy();\n\t\tthis.archive && this.archive.destroy();\n\t\tthis.resources && this.resources.destroy();\n\t\tthis.container && this.container.destroy();\n\t\tthis.packaging && this.packaging.destroy();\n\t\tthis.rendition && this.rendition.destroy();\n\t\tthis.displayOptions && this.displayOptions.destroy();\n\n\t\tthis.spine = undefined;\n\t\tthis.locations = undefined;\n\t\tthis.pageList = undefined;\n\t\tthis.archive = undefined;\n\t\tthis.resources = undefined;\n\t\tthis.container = undefined;\n\t\tthis.packaging = undefined;\n\t\tthis.rendition = undefined;\n\n\t\tthis.navigation = undefined;\n\t\tthis.url = undefined;\n\t\tthis.path = undefined;\n\t\tthis.archived = false;\n\t}\n\n}\n\n//-- Enable binding events to book\nEventEmitter(Book.prototype);\n\nexport default Book;\n","import Book from \"./book\";\nimport Rendition from \"./rendition\";\nimport CFI from \"./epubcfi\";\nimport Contents from \"./contents\";\nimport * as utils from \"./utils/core\";\nimport { EPUBJS_VERSION } from \"./utils/constants\";\n\n\n/**\n * Creates a new Book\n * @param {string|ArrayBuffer} url URL, Path or ArrayBuffer\n * @param {object} options to pass to the book\n * @returns {Book} a new Book object\n * @example ePub(\"/path/to/book.epub\", {})\n */\nfunction ePub(url?: any, options?: any): any {\n\treturn new Book(url, options);\n}\n\nePub.VERSION = EPUBJS_VERSION;\n\nif (typeof(global) !== \"undefined\") {\n\t(globalThis as any).EPUBJS_VERSION = EPUBJS_VERSION;\n}\n\nePub.Book = Book;\nePub.Rendition = Rendition;\nePub.Contents = Contents;\nePub.CFI = CFI;\nePub.utils = utils;\n\nexport default ePub;\n"],"names":["EventEmitter","target","proto","type","fn","f","args","listeners","i","freeze","object","oc","MIME_TYPE","value","NAMESPACE","uri","conventions","require$$0","notEmptyString","input","splitOnASCIIWhitespace","orderedSetReducer","current","element","toOrderedSet","list","arrayIncludes","copy","src","dest","p","_extends","Class","Super","pt","t","NodeType","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE","ExceptionCode","ExceptionMessage","HIERARCHY_REQUEST_ERR","NOT_FOUND_ERR","INUSE_ATTRIBUTE_ERR","DOMException","code","message","error","NodeList","index","isHTML","nodeFilter","buf","serializeToString","LiveNodeList","node","refresh","_updateLiveList","inc","ls","__set__","NamedNodeMap","_findNodeIndex","_addNamedNode","el","newAttr","oldAttr","doc","_onRemoveAttribute","_onAddAttribute","_removeNamedNode","attr","lastIndex","key","namespaceURI","localName","DOMImplementation","feature","version","qualifiedName","doctype","Document","root","publicId","systemId","DocumentType","Node","newChild","refChild","_insertBefore","oldChild","_removeChild","deep","cloneNode","child","next","map","n","prefix","_xmlEncoder","_visitNode","callback","ns","remove","_onUpdateChild","cs","parentNode","previous","nextChild","cp","newFirst","newLast","pre","_appendSingleChild","importedNode","importNode","id","rtv","classNames","classNamesSet","base","nodeClassNames","matches","nodeClassNamesSet","tagName","Element","attrs","DocumentFragment","data","Text","Comment","CDATASection","ProcessingInstruction","name","Attr","EntityReference","pl","old","CharacterData","offset","count","text","start","end","newText","newNode","Notation","Entity","XMLSerializer","isHtml","nodeSerializeToString","refNode","visibleNamespaces","needNamespaceDefine","addSerializedAttribute","len","nodeName","prefixedNodeName","defaultNS","ai","nsi","namespace","pubid","sysid","sub","node2","v","attrs2","getTextContent","dom","exports","nameStartChar","nameChar","tagNamePattern","S_TAG","S_ATTR","S_ATTR_SPACE","S_EQ","S_ATTR_NOQUOT_VALUE","S_ATTR_END","S_TAG_SPACE","S_TAG_CLOSE","ParseError","locator","XMLReader","source","defaultNSMap","entityMap","domBuilder","_copy","parse","defaultNSMapCopy","errorHandler","fixedFromCharCode","surrogate1","surrogate2","entityReplacer","a","k","appendText","xt","position","m","lineEnd","linePattern","lineStart","parseStack","closeMap","tagStart","config","localNSMap","endMatch","endIgnoreCaseMach","parseInstruction","parseDCC","ElementAttributes","currentNSMap","parseElementStartPart","fixSelfClosed","locator2","copyLocator","appendElement","parseHtmlSpecialContent","e","addAttribute","qname","startIndex","attrName","s","c","qName","nsp","nsPrefix","elStartEnd","elEndStart","pos","matchs","split","lastMatch","match","reg","sax","require$$1","entities","require$$2","require$$3","DOMParser","options","mimeType","DOMHandler","buildErrorHandler","errorImpl","isCallback","build","msg","_locator","ins","ch","length","chars","_toString","charNode","comm","impl","dt","l","hander","domParser","lib","requestAnimationFrame","_URL","uuid","d","r","documentHeight","isElement","obj","isNumber","isFloat","prefixed","unprefixed","vendors","prefixes","lower","defaults","_sources","prop","extend","_args","propName","insert","item","array","compareFunction","location","locationOf","_start","_end","pivot","b","compared","indexOfSorted","bounds","style","widthProps","heightProps","width","height","borders","nodeBounds","elPos","elRange","windowBounds","indexOfNode","typeId","children","sib","indexOfTextNode","textNode","indexOfElementNode","elementNode","isXml","ext","createBlob","content","mime","createBlobUrl","blob","revokeBlobUrl","url","createBase64Url","markup","forceXMLDom","Parser","XMLDOMParser","qs","sel","elements","qsa","qsp","props","q","filtered","sprint","func","treeWalker","walk","filter","_unused","blob2base64","resolve","_reject","reader","defer","reject","querySelectorByType","html","query","findChildren","result","childNodes","parents","nodes","filterChildren","single","getParentByTagName","tagname","parent","RangeObject","startNode","startOffset","endNode","endOffset","toStart","_a","_b","referenceNode","endIndex","startContainer","endContainer","startParents","endParents","assertPath","path","normalizeStringPosix","allowAboveRoot","res","lastSlash","dots","j","resolvedPath","resolvedAbsolute","relative","from","to","fromStart","fromEnd","fromLen","toLen","lastCommonSep","fromCode","toCode","out","dirname","hasRoot","matchedSlash","isAbsolute","ret","isAbs","startDot","startPart","preDotState","pathUtils","Path","pathString","parsed","what","filename","Url","urlString","baseString","absolute","pathname","basePath","fullpath","EpubCFI","cfiFrom","ignoreClass","cfi","cfiStr","baseComponent","pathComponent","range","componentStr","component","parts","steps","terminal","step","stepStr","has_brackets","num","termialStr","characterOffset","textLocationAssertion","assertion","indirection","ranges","part","segment","segmentString","cfiString","cfiOne","cfiTwo","stepsA","stepsB","terminalA","terminalB","nodeType","filteredNode","currentNode","stepA","stepB","needsIgnoring","anchor","sibling","previousSibling","nextSibling","isText","curr","totalOffset","output","prevIndex","currNodeType","prevNodeType","xpath","container","_doc","lastStepIndex","childIndex","startSteps","endSteps","missed","str","_spineNodeIndex","_pos","Hook","context","hook","promises","task","executing","_err","replaceBase","section","head","replaceCanonical","link","replaceMeta","meta","replaceLinks","contents","links","replaceLink","href","linkUrl","substitute","urls","replacements","request","withCredentials","headers","supportsURL","BLOB_RESPONSE","deferred","xhr","xhrPrototype","header","handler","err","responseXML","Section","hooks","_request","Request","loading","loaded","xml","rendering","rendered","isIE","Serializer","XMLDOMSerializer","serializer","_query","find","last","excerpt","limit","maxSeqEle","excerptLimit","search","nodeList","acc","endPos","endNodeIndex","beforeEndLengthCount","globalLayout","settings","rendition","property","_range","Spine","_package","resolver","canonical","manifestItem","prev","nextIndex","spineItem","Queue","promise","queued","inwait","EPUBJS_VERSION","DOM_EVENTS","EVENTS","Locations","spine","pause","completed","locations","cfiBase","body","counter","_break","dist","startCfi","wordCount","remainingCount","foundStartNode","loc","percentage","Container","containerDocument","rootfile","Packaging","packageDocument","metadataNode","manifestNode","spineNode","metadata","manifestXml","manifest","selected","overlay","properties","spineXml","_manifest","idref","propArray","itemref","packageXml","uniqueIdentifierId","identifier","tocId","pkg","metaCover","coverId","cover","tag","found","json","Navigation","ncx","toc","navItems","navHtml","navElement","navList","navListHtml","subitems","nested","tocXml","navPoints","navLabel","table","mimeTypes","subtype","val","defaultValue","lookup","Resources","parsedUrl","base64","replacementUrls","archive","replaced","replacement","replacementUrl","indexInUrls","newUrl","textResponse","relUrls","assetHref","resolved","PageList","navXml","pageList","pageTargets","pageText","page","isCfi","packageUrl","pg","percent","Layout","flow","spread","min","_width","_height","_gap","divisor","gap","columnWidth","pageWidth","spreadWidth","delta","axis","formating","totalLength","pageLength","spreads","pages","propsRecord","thisRecord","newProps","Themes","theme","themes","css","rules","priority","overrides","rule","size","Annotations","cfiRange","cb","className","styles","hash","sectionIndex","annotation","Annotation","view","h","_mark","Mapping","layout","direction","dev","startRange","endRange","selection","safeFilter","columns","scrollWidth","stack","$el","$prev","left","right","top","bottom","_splitter","splitter","rangePair","endCfi","cifPair","hasNavigator","isChrome","isWebkit","Contents","w","frame","border","overflow","$viewport","newContent","_scale","_minimum","_maximum","_scalable","sheets","mediaChangeHandler","_e","_mutations","images","img","targetPos","newRange","$stylesheet","ready","styleEl","serializedCss","styleSheet","rl","propStr","selector","definition","$script","eventName","cfirange","_cfi","viewport","dir","COLUMN_AXIS","COLUMN_GAP","COLUMN_WIDTH","COLUMN_FILL","scale","offsetX","offsetY","scaleStr","translateStr","viewportWidth","viewportHeight","widthScale","heightScale","marginLeft","mode","WRITING_MODE","svgCreate","proxyMouse","tracked","dispatch","x","y","hitTest","cloneEvent","eventTarget","ev","opts","rectContains","rect","rects","coords","setCoords","containsRect","rect1","rect2","Pane","mark","g","idx","Mark","box","Highlight","attributes","docFrag","Underline","line","IframeView","_show","writingMode","elBorders","iframeBorders","_force","widthDelta","heightDelta","event","outerThis","_layoutFunc","displayed","_view","force","emitter","scrollType","definer","createDefiner","innerDiv","spanA","spanB","throttle","wait","timeout","now","remaining","Stage","_options","wrapper","_element","_windowBounds","bodyStyles","bodyPadding","rulesArray","scope","set","Views","callbackfn","DefaultViewManager","scroller","orientation","epubcfi","stageSize","forceRight","action","displaying","visible","distX","distY","pageHeight","vertical","used","startPos","stopPos","totalPages","currPage","endPage","tempStartPage","mapping","startPage","offsetPrev","offsetNext","_container","views","viewsLength","isVisible","silent","scrollTop","scrollLeft","forceUpdate","defaultScrolledOverflow","isPaginated","viewContents","EASING_EQUATIONS","Snap","manager","screenX","screenY","deltaY","swipped","snapWidth","distance","time","velocity","minVelocity","howMany","snapTo","destination","startTime","duration","easing","tick","debounce","ContinuousViewManager","_full","full","_bounds","_offset","updating","_offsetLeft","_offsetTop","checking","newViews","horizontal","visibleLength","contentLength","rtlScrollType","rtl","prepend","first","append","firstIndex","above","below","prevTop","prevLeft","_stage","Rendition","book","viewManager","View","minSpreadWidth","_flow","changed","located","locationStart","locationEnd","pageStart","pageEnd","computed","horizontalPadding","_section","script","ident","Archive","JSZip","isBase64","zipUrl","response","decodededUrl","entry","uint8array","_encoding","tempUrl","useBase64","fromCache","module","o","u","require","_dereq_","global","Mutation","scheduleDrain","called","observer","nextTick","channel","scriptEl","draining","queue","oldQueue","immediate","INTERNAL","handlers","REJECTED","FULFILLED","PENDING","Promise","safelyResolveThenable","onRejected","onFulfilled","unwrap","QueueItem","returnValue","self","tryCatch","getThen","thenable","then","onError","onSuccess","tryToUnwrap","reason","all","iterable","values","allResolver","resolveFromAll","outValue","race","_typeof","_classCallCheck","instance","Constructor","getIDB","idb","isIndexedDBValid","isSafari","hasFetch","Builder","builder","Promise$1","executeCallback","executeTwoCallbacks","errorCallback","normalizeKey","getCallback","DETECT_BLOB_SUPPORT_STORE","supportsBlobs","dbContexts","toString","READ_ONLY","READ_WRITE","_binStringToArrayBuffer","bin","arr","_checkBlobSupportWithoutCaching","txn","matchedChrome","matchedEdge","_checkBlobSupport","_deferReadiness","dbInfo","dbContext","deferredOperation","_advanceReadiness","_rejectReadiness","_getConnection","upgradeNeeded","createDbContext","dbArgs","openreq","db","ex","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","isNewStore","isDowngrade","isUpgrade","incVersion","_encodeBlob","_decodeBlob","encodedBlob","arrayBuff","_isEncodedBlob","_fullyReady","_tryReconnect","forages","forage","createTransaction","retries","tx","_initStorage","initPromises","ignoreErrors","getItem","transaction","store","req","iterate","iterator","iterationNumber","cursor","setItem","blobSupport","removeItem","clear","advanced","keys","dropInstance","currentConfig","isCurrentDb","dbPromise","newVersion","dropObjectPromise","_forage2","dropDBPromise","_forage","asyncStorage","isWebSQLValid","BASE_CHARS","BLOB_TYPE_PREFIX","BLOB_TYPE_PREFIX_REGEX","SERIALIZED_MARKER","SERIALIZED_MARKER_LENGTH","TYPE_ARRAYBUFFER","TYPE_BLOB","TYPE_INT8ARRAY","TYPE_UINT8ARRAY","TYPE_UINT8CLAMPEDARRAY","TYPE_INT16ARRAY","TYPE_INT32ARRAY","TYPE_UINT16ARRAY","TYPE_UINT32ARRAY","TYPE_FLOAT32ARRAY","TYPE_FLOAT64ARRAY","TYPE_SERIALIZED_MARKER_LENGTH","toString$1","stringToBuffer","serializedString","bufferLength","encoded1","encoded2","encoded3","encoded4","buffer","bytes","bufferToString","base64String","serialize","valueType","marker","fileReader","deserialize","blobType","matcher","localforageSerializer","createDbTable","_initStorage$1","dbInfoPromise","tryExecuteSql","sqlStatement","results","getItem$1","iterate$1","rows","_setItem","retriesLeft","originalValue","sqlError","setItem$1","removeItem$1","clear$1","length$1","key$1","keys$1","getAllStoreNames","storeNames","dropInstance$1","operationInfo","dropTable","storeName","operations","webSQLStorage","isLocalStorageValid","_getKeyPrefix","defaultConfig","keyPrefix","checkIfLocalStorageThrows","localStorageTestKey","_isLocalStorageUsable","_initStorage$2","clear$2","getItem$2","iterate$2","keyPrefixLength","key$2","keys$2","itemKey","length$2","removeItem$2","setItem$2","dropInstance$2","localStorageWrapper","sameValue","includes","searchElement","isArray","arg","DefinedDrivers","DriverSupport","DefaultDrivers","DefaultDriverOrder","OptionalDriverMethods","LibraryMethods","DefaultConfig","callWhenReady","localForageInstance","libraryMethod","_key","LocalForage","driverTypeKey","driver","driverName","driverObject","complianceError","driverMethods","driverMethodName","isRequired","configureMissingMethods","methodNotImplementedFactory","methodName","_i","_len","optionalDriverMethod","setDriverSupport","support","getDriverPromise","serializerPromise","drivers","supportedDrivers","setDriverToConfig","extendSelfWithDriver","initDriver","currentDriverIndex","driverPromiseLoop","oldDriverSetDone","libraryMethodsAndProperties","localforage_js","Store","requester","httpRequest","localforage","_event","online","resources","mapped","encodedUrl","DisplayOptions","displayOptionsDocument","displayOptionsNode","CONTAINER_PATH","IBOOKS_DISPLAY_OPTIONS_PATH","INPUT_TYPE","Book","_error","opening","encoding","packagePath","_type","extension","packaging","navPath","credentials","replacementsSetting","originalUrl","substituteResources","_contents","ePub","CFI","utils"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,41]}
|