@likecoin/epub-ts 0.4.0 → 0.4.2

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/dist/epub.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"epub.cjs","sources":["../src/utils/event-emitter.ts","../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","../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): any {\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): any {\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, ...args: any[]): void {\n\t\tif (!this.__listeners || !this.__listeners[type]) return;\n\t\tconst listeners = this.__listeners[type].slice();\n\t\tfor (let i = 0; i < listeners.length; i++) {\n\t\t\tlisteners[i](...args);\n\t\t}\n\t};\n\n\treturn target;\n}\n","/**\n * Core Utilities and Helpers\n * @module Core\n*/\n\n/**\n * @returns {function} requestAnimationFrame\n * @memberof Core\n */\nexport const requestAnimationFrame = (typeof window != \"undefined\") ? window.requestAnimationFrame : false;\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst _COMMENT_NODE = 8;\nconst _DOCUMENT_NODE = 9;\nconst _URL = typeof URL != \"undefined\" ? URL : window.URL;\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 = 0; i < sources.length; i++) {\n\t\tconst source = sources[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, ...sources: any[]): any {\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): number {\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): number {\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 * @returns {document} document\n * @memberof Core\n */\nexport function parse(markup: string, mime: string): Document {\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\treturn new DOMParser().parseFromString(markup, mime as DOMParserSupportedType);\n}\n\n/**\n * querySelector wrapper\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\tif (!el) {\n\t\tthrow new Error(\"No Element Provided\");\n\t}\n\treturn el.querySelector(sel) ?? undefined;\n}\n\n/**\n * querySelectorAll wrapper\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> {\n\treturn el.querySelectorAll(sel);\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\tsel += \"[\";\n\tfor (const prop in props) {\n\t\tsel += prop + \"~='\" + props[prop] + \"'\";\n\t}\n\tsel += \"]\";\n\treturn el.querySelector(sel) ?? undefined;\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\ttreeWalker(root, func, NodeFilter.SHOW_TEXT);\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\treturn undefined;\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(): void {\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 */\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\tconst query = html.querySelector(`${element}[*|type=\"${type}\"]`);\n\tif (query) {\n\t\treturn query;\n\t}\n\t// Fallback: walk elements and check epub:type via namespace or attribute\n\tconst elements = html.querySelectorAll(element);\n\tfor (let i = 0; i < elements.length; i++) {\n\t\tif(elements[i]!.getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") === type ||\n\t\t\t elements[i]!.getAttribute(\"epub:type\") === type) {\n\t\t\treturn elements[i]!;\n\t\t}\n\t}\n\treturn undefined;\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\treturn undefined;\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 undefined;\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\treturn undefined;\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.from(parent.childNodes as ArrayLike<Node>).indexOf(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\treturn undefined;\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 = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n\t\tconst path = i >= 0 ? args[i]! : \"/\";\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;\n\tspinePos: number;\n\trange: boolean;\n\tpath: EpubCFIComponent;\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 = {} as EpubCFIComponent;\n\t\tthis.spinePos = 0; // For compatibility\n\n\t\tthis.range = false; // true || false;\n\n\t\tthis.path = {} as EpubCFIComponent;\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): Partial<Pick<EpubCFI, \"spinePos\" | \"range\" | \"base\" | \"path\" | \"start\" | \"end\">> {\n\t\tconst cfi = {\n\t\t\tspinePos: -1,\n\t\t\trange: false,\n\t\t\tbase: {} as EpubCFIComponent,\n\t\t\tpath: {} as EpubCFIComponent,\n\t\t\tstart: null as EpubCFIComponent | null,\n\t\t\tend: null as EpubCFIComponent | 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// Chapter segment is always the second step\n\t\tif (cfi.base.steps.length < 2) {\n\t\t\treturn {spinePos: -1};\n\t\t}\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((step: string) => {\n\t\t\treturn this.parseStep(step);\n\t\t}).filter((step): step is EpubCFIStep => step !== undefined);\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\t\treturn undefined;\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);\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 != null && terminalB.offset != null) {\n\t\t\tif(terminalA.offset > terminalB.offset) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif(terminalA.offset < terminalB.offset) {\n\t\t\t\treturn -1;\n\t\t\t}\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.length > 0 && 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<Pick<EpubCFI, \"spinePos\" | \"range\" | \"base\" | \"path\" | \"start\" | \"end\">> {\n\t\tconst cfi = {\n\t\t\trange: false,\n\t\t\tbase: {} as EpubCFIComponent,\n\t\t\tpath: {} as EpubCFIComponent,\n\t\t\tstart: null as EpubCFIComponent | null,\n\t\t\tend: null as EpubCFIComponent | null,\n\t\t\tspinePos: 0\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: { offset: null, assertion: 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<Pick<EpubCFI, \"spinePos\" | \"range\" | \"base\" | \"path\" | \"start\" | \"end\">> {\n\t\tconst cfi = {\n\t\t\trange: false,\n\t\t\tbase: {} as EpubCFIComponent,\n\t\t\tpath: {} as EpubCFIComponent,\n\t\t\tstart: null as EpubCFIComponent | null,\n\t\t\tend: null as EpubCFIComponent | null,\n\t\t\tspinePos: 0\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.from(children as ArrayLike<Node>).indexOf(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\t// anchor is always a child of its parentNode, so indexOf is guaranteed to find it\n\t\tconst index = Array.from(children as ArrayLike<Node>).indexOf(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.from(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] as Element;\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] as Node;\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\tif (!container) {\n\t\t\treturn { container: (_doc ?? document).documentElement, offset: 0 };\n\t\t}\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] ?? child;\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 < args.length; ++i) {\n\t\t\tif (typeof args[i] === \"function\") {\n\t\t\t\tthis.hooks.push(args[i]);\n\t\t\t} else {\n\t\t\t\t// unpack array\n\t\t\t\tfor(let j = 0; j < args[i].length; ++j) {\n\t\t\t\t\tthis.hooks.push(args[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 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.call(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): void {\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(): boolean {\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};\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\tlet header;\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): void {\n\t\tdeferred.reject(e);\n\t}\n\n\tfunction handler(): Promise<any> | undefined {\n\t\tif (xhr.readyState === XMLHttpRequest.DONE) {\n\t\t\tlet responseXML: Document | null | false = false;\n\n\t\t\tif(xhr.responseType === \"\" || xhr.responseType === \"document\") {\n\t\t\t\tresponseXML = xhr.responseXML;\n\t\t\t}\n\n\t\t\tif (xhr.status === 200 || xhr.status === 0 || responseXML) { //-- Firefox is reporting 0 for blob urls\n\t\t\t\tlet r;\n\n\t\t\t\tif (!xhr.response && !responseXML) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: xhr.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 (xhr.status === 403) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: xhr.status,\n\t\t\t\t\t\tresponse: xhr.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 = xhr.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 xhr.responseXML wasn't set, try to parse using a DOMParser from text\n\t\t\t\t\tr = parse(xhr.response, \"text/xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == \"xhtml\"){\n\t\t\t\t\tr = parse(xhr.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(xhr.response, \"text/html\");\n\t\t\t\t}else\n\t\t\t\tif(type == \"json\"){\n\t\t\t\t\tr = JSON.parse(xhr.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 = xhr.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([xhr.response]);\n\t\t\t\t\t}\n\n\t\t\t\t}else{\n\t\t\t\t\tr = xhr.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: xhr.status,\n\t\t\t\t\tmessage : xhr.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\treturn undefined;\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 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: () => Section | undefined;\n\tprev: () => Section | 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((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})\n\t\t\t\t.then(() => {\n\t\t\t\t\tloading.resolve(this.contents);\n\t\t\t\t})\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.load(_request).\n\t\t\tthen((contents: Element) => {\n\t\t\t\tconst serializer = new XMLSerializer();\n\t\t\t\tthis.output = serializer.serializeToString(contents);\n\t\t\t\treturn this.output;\n\t\t\t}).\n\t\t\tthen(() => {\n\t\t\t\treturn this.hooks.serialize.trigger(this.output, this);\n\t\t\t}).\n\t\t\tthen(() => {\n\t\t\t\trendering.resolve(this.output);\n\t\t\t})\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): void {\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.\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\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[]): void {\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(...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 = (): Section | undefined => {\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};\n\t\t\t\titem.next = (): Section | undefined => {\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};\n\t\t\t} else {\n\t\t\t\titem.prev = function(): Section | undefined {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\titem.next = function(): Section | 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)] ?? -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)] ?? -1;\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\treturn undefined;\n\t}\n\n\t/**\n\t * Loop over the Sections in the Spine\n\t * @return {method} forEach\n\t */\n\teach(fn: (section: Section, index: number, array: Section[]) => void): void {\n\t\treturn this.spineItems.forEach(fn);\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\treturn undefined;\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\treturn undefined;\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, ...args] = _args;\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.call(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((...args: any[]) => {\n\t\t\t\t\t\tinwait.deferred.resolve(...args);\n\t\t\t\t\t}, (...args: any[]) => {\n\t\t\t\t\t\tinwait.deferred.reject(...args);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Task resolves immediately\n\t\t\t\t\tinwait.deferred.resolve(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(() => {\n\n\t\t\tif(this._q.length) {\n\n\t\t\t\tthis.dequeue()\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tthis.run();\n\t\t\t\t\t});\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(() => {\n\t\t\t\t\tthis.running = undefined;\n\t\t\t\t\treturn this.flush();\n\t\t\t\t});\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(this: unknown, ...toApply: any[]): Promise<any> {\n\n\t\t\treturn new Promise( (resolve, reject) => {\n\t\t\t\tconst callback = function(value: any, err: any): void {\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.call(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\", \"keypress\", \"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((section: Section) => {\n\t\t\tif (section.linear) {\n\t\t\t\tthis.q.enqueue((s: Section) => this.process(s), section);\n\t\t\t}\n\t\t});\n\n\t\treturn this.q.run().then(() => {\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});\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((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});\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 = (node: Node): boolean => {\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\treturn false;\n\t\t};\n\n\t\tsprint(body!, parser);\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<{ cfi: string; wordCount: number }[]> {\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((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((s: Section, wc: number, st: any, c: number) => this.processWords(s, wc, st, c), section, wordCount, start, count);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.q.enqueue((s: Section, wc: number, st: any, c: number) => this.processWords(s, wc, st, c), section, wordCount, start, count);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this.q.run().then(() => {\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});\n\n\t}\n\n\tprocessWords(section: Section, wordCount: number, startCfi?: EpubCFI, count?: number): Promise<{ cfi: string; wordCount: number }[]> {\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((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});\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 = (node: Node): boolean => {\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\treturn false;\n\t\t};\n\n\t\tsprint(body!, parser);\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 loc - location index\n\t * @return percentage\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 */\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.from(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.from(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 json - JSON manifest data\n\t * @return 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 index !== undefined ? this.landmarks[index] : undefined;\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\tif (parent) {\n\t\t\t\t\tparent.subitems!.push(item);\n\t\t\t\t} else {\n\t\t\t\t\tlist.push(item);\n\t\t\t\t}\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(): Record<string, string> {\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\treturn false;\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\treturn false;\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\treturn false;\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((item: PackagingManifestItem): string => {\n\t\t\t\treturn item.href;\n\t\t\t});\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 | ArrayBuffer) => {\n\t\t\t\t\t\treturn createBase64Url(base64 as string, 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((resolve: (value: string[]) => void) => {\n\t\t\t\tresolve(this.urls);\n\t\t\t});\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\tthis.cssUrls.forEach((href: string) => {\n\t\t\tconst replacement = this.createCssFile(href)\n\t\t\t\t.then((replacementUrl) => {\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 (replacementUrl && indexInUrls > -1) {\n\t\t\t\t\t\tthis.replacementUrls[indexInUrls] = replacementUrl;\n\t\t\t\t\t}\n\t\t\t\t})\n\n\n\t\t\treplaced.push(replacement);\n\t\t});\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((href: string): 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});\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((resolve: (value: string) => void, _reject: (reason?: any) => void) => {\n\t\t\t\tresolve(this.replacementUrls[indexInUrls]!);\n\t\t\t});\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((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});\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 && index < this.locations.length) {\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((contents: any) => this.inject(contents));\n\t\tthis.rendition.hooks.content.register((contents: any) => this.overrides(contents));\n\n\t}\n\n\t/**\n\t * Add themes to be used by a rendition\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 (args.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (args.length === 1 && typeof(args[0]) === \"object\") {\n\t\t\treturn this.registerThemes(args[0]);\n\t\t}\n\t\tif (args.length === 1 && typeof(args[0]) === \"string\") {\n\t\t\treturn this.default(args[0]);\n\t\t}\n\t\tif (args.length === 2 && typeof(args[1]) === \"string\") {\n\t\t\treturn this.registerUrl(args[0], args[1]);\n\t\t}\n\t\tif (args.length === 2 && typeof(args[1]) === \"object\") {\n\t\t\treturn this.registerRules(args[0], args[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 contents - contents to apply overrides to\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((view: any) => this.inject(view));\n\t\tthis.rendition.hooks.unloaded.register((section: any) => this.clear(section));\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 (fn: (annotation: Annotation, key: string) => void): void {\n\t\tObject.keys(this._annotations).forEach((key) => {\n\t\t\tfn(this._annotations[key]!, key);\n\t\t});\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\tif (!annotation) return;\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\tif (!annotation) return;\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\";\nimport type IframeView from \"./managers/views/iframe\";\nimport type Contents from \"./contents\";\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: IframeView): 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: Contents, 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\tconst filter: NodeFilter = {\n\t\t\tacceptNode(node: Node): number {\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\n\t\tconst treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, filter);\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: IframeView): RangePair[] {\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\t\t\t\treturn undefined;\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\t\t\t\treturn undefined;\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\t_onVisibilityChange: (() => void) | undefined;\n\t_mediaQueryHandlers: { mql: MediaQueryList; handler: (e: MediaQueryListEvent) => void }[];\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._mediaQueryHandlers = [];\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(): typeof DOM_EVENTS {\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._onVisibilityChange) {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", this._onVisibilityChange);\n\t\t\tthis._onVisibilityChange = undefined;\n\t\t}\n\n\t\tif (this._resizeCheck) {\n\t\t\tthis.document.removeEventListener(\"transitionend\", this._resizeCheck);\n\t\t\tthis._resizeCheck = undefined;\n\t\t}\n\n\t\tfor (const { mql, handler } of this._mediaQueryHandlers) {\n\t\t\tmql.removeEventListener(\"change\", handler);\n\t\t}\n\t\tthis._mediaQueryHandlers = [];\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\tthis._onVisibilityChange = (): void => {\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\tdocument.addEventListener(\"visibilitychange\", this._onVisibilityChange);\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 = (m: MediaQueryListEvent): void => {\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};\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\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.addEventListener(\"change\", mediaChangeHandler);\n\t\t\t\t\tthis._mediaQueryHandlers.push({ mql, handler: 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(() => {\n\t\t\tthis.resizeCheck();\n\t\t});\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 instanceof Error ? e.stack : undefined);\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((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 as any).onreadystatechange = function(this: any): void {\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});\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: Record<string, Record<string, string> | Array<Record<string, string>>> | Array<Array<string | string[]>>, key?: string): void {\n\t\tif(!this.document || !rules || (Array.isArray(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 (Array.isArray(rules)) {\n\t\t\t// Array format: [selector, [prop, val], ...] or [selector, [[prop, val], ...]]\n\t\t\tfor (let i = 0, rl = rules.length; i < rl; i++) {\n\t\t\t\tlet j = 1, rule: Array<string | string[]> = rules[i]!, propStr = \"\";\n\t\t\t\tconst selector = rules[i]![0] as string;\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 (Array.isArray(rule[1]?.[0])) {\n\t\t\t\t\trule = rule[1] as string[];\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((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 as any).onreadystatechange = function(this: any): void {\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});\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 className - class name to remove\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((eventName) => {\n\t\t\tthis.document.addEventListener(eventName, this._triggerEvent!, { passive: true });\n\t\t});\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((eventName) => {\n\t\t\tthis.document.removeEventListener(eventName, this._triggerEvent!);\n\t\t});\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(() => {\n\t\t\tconst selection = this.window.getSelection();\n\t\t\tif (selection) {\n\t\t\t\tthis.triggerSelectedEvent(selection);\n\t\t\t}\n\t\t}, 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/**\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// Fixes Safari column cut offs, but causes RTL issues.\n\t\t// Required on iOS: block-level body in CSS columns triggers a\n\t\t// WKWebView content-size expansion feedback loop where scrollWidth\n\t\t// grows toward infinity. inline-block shrink-wraps the body to\n\t\t// its explicit width, breaking the cycle.\n\t\tthis.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): boolean {\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\tthis.removeListeners();\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 } from \"../../marks-pane\";\nimport type { 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((contents: string) => {\n\t\t\t\treturn this.load(contents);\n\t\t\t})\n\t\t\t.then(() => {\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}, (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})\n\t\t\t.then(() => {\n\t\t\t\tthis.emit(EVENTS.VIEWS.RENDERED, this.section);\n\t\t\t});\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 = (event: Event): void => {\n\n\t\t\tthis.onLoad(event, loading);\n\n\t\t};\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(() => {\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}, (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 = (): void => {\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 = (): void => {\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): void => {\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): (...args: any[]) => void {\n\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\tlet previous = 0;\n\treturn function(this: unknown, ...args: any[]) {\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.call(this, ...args);\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.call(this, ...args);\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(...args);\n\t}\n\n\tget(i: number): IframeView | undefined {\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\t\treturn undefined;\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> | undefined;\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({}, {\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());\n\n\t\tthis.stage.onOrientationChange((e: Event) => this.onOrientationChange(e));\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\", (_e: Event) => {\n\t\t\tthis.destroy();\n\t\t});\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(() => {\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}, 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): Promise<IframeView> | undefined {\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 undefined;\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\treturn undefined;\n\t}\n\n\tdisplay(section: Section, target?: string): Promise<void> {\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((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}, (err) => {\n\t\t\t\tdisplaying.reject(err);\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\treturn this.handleNextPrePaginated(forceRight, section, this.add);\n\t\t\t})\n\t\t\t.then(() => {\n\n\t\t\t\tthis.views.show();\n\n\t\t\t\tdisplaying.resolve();\n\n\t\t\t});\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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(): Promise<void> | undefined {\n\t\tlet next: Section | undefined;\n\t\tlet left;\n\n\t\tconst dir = this.settings.direction;\n\n\t\tif(!this.views.length) return undefined;\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(() => {\n\t\t\t\t\treturn this.handleNextPrePaginated(forceRight, next, this.append);\n\t\t\t\t}, (err) => {\n\t\t\t\t\treturn err;\n\t\t\t\t})\n\t\t\t\t.then(() => {\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\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});\n\t\t}\n\t\treturn undefined;\n\n\t}\n\n\tprev(): Promise<void> | undefined {\n\t\tlet prev: Section | undefined;\n\t\tlet left;\n\t\tconst dir = this.settings.direction;\n\n\t\tif(!this.views.length) return undefined;\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(() => {\n\t\t\t\t\tif (this.layout.name === \"pre-paginated\" && this.layout.divisor > 1) {\n\t\t\t\t\t\tconst left = 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\treturn undefined;\n\t\t\t\t}, (err) => {\n\t\t\t\t\treturn err;\n\t\t\t\t})\n\t\t\t\t.then(() => {\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});\n\t\t}\n\t\treturn undefined;\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(() => {\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}, 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((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((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): number {\n\t\t\t\treturn Math.sin(pos * PI_D2);\n\t\t},\n\t\teaseInOutSine: function (pos: number): number {\n\t\t\t\treturn (-0.5 * (Math.cos(Math.PI * pos) - 1));\n\t\t},\n\t\teaseInOutQuint: function (pos: number): 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): 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\tconst tick = (): void => {\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);\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();\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): (...args: any[]) => void {\n\tlet timeout: ReturnType<typeof setTimeout>;\n\treturn function(this: unknown, ...args: any[]) {\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => {\n\t\t\tfunc.call(this, ...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({}, {\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(() => {\n\t\t\t\treturn this.fill();\n\t\t\t});\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(): void {};\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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 = (view): void => this.afterDisplayed(view);\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 = (view): void => this.afterDisplayed(view);\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());\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(() => {\n\t\t\t\t\tthis.q.enqueue(() => this.trim());\n\t\t\t\t}, 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 = (): void => {\n\t\t\tconst first = this.views.first();\n\t\t\tconst prev = 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 = (): void => {\n\t\t\tconst last = this.views.last();\n\t\t\tconst next = 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(() => {\n\t\t\t\tthis.update();\n\t\t\t});\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\tif (!displayed.length) {\n\t\t\ttask.resolve();\n\t\t\treturn task.promise;\n\t\t}\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\", (_e: Event) => {\n\t\t\tthis.ignore = true;\n\t\t\t// this.scrollTo(0,0);\n\t\t\tthis.destroy();\n\t\t});\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(), 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(() => {\n\t\t\tthis.scrollDeltaVert = 0;\n\t\t\tthis.scrollDeltaHorz = 0;\n\t\t}, 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(() => {\n\t\t\treturn this.check();\n\t\t});\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(() => {\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}, this.settings.afterScrolledTimeout);\n\t}\n\n\tnext(): Promise<void> | undefined {\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 undefined;\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(() => {\n\t\t\treturn this.check();\n\t\t});\n\t\treturn undefined;\n\t}\n\n\tprev(): Promise<void> | undefined {\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 undefined;\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(() => {\n\t\t\treturn this.check();\n\t\t});\n\t\treturn undefined;\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 type 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\";\nimport type Views from \"./managers/helpers/views\";\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({}, {\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((contents: any) => this.handleLinks(contents));\n\t\tthis.hooks.content.register((contents: any) => this.passEvents(contents));\n\t\tthis.hooks.content.register((contents: any) => this.adjustImages(contents));\n\n\t\tthis.book!.spine!.hooks.content.register((doc: any, section: any) => this.injectIdentifier(doc, section));\n\n\t\tif (this.settings.stylesheet) {\n\t\t\tthis.book!.spine!.hooks.content.register((doc: any, section: any) => this.injectStylesheet(doc, section));\n\t\t}\n\n\t\tif (this.settings.script) {\n\t\t\tthis.book!.spine!.hooks.content.register((doc: any, section: any) => this.injectScript(doc, section));\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, (view: any) => this.afterDisplayed(view));\n\t\tthis.manager.on(EVENTS.MANAGERS.REMOVED, (view: any) => this.afterRemoved(view));\n\n\t\t// Listen for resizing\n\t\tthis.manager.on(EVENTS.MANAGERS.RESIZED, (size: any, epubcfi?: string) => this.onResized(size, epubcfi));\n\n\t\t// Listen for rotation\n\t\tthis.manager.on(EVENTS.MANAGERS.ORIENTATION_CHANGE, (orientation: any) => this.onOrientationChange(orientation));\n\n\t\t// Listen for scroll changes\n\t\tthis.manager.on(EVENTS.MANAGERS.SCROLLED, () => this.reportLocation());\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(() => {\n\n\t\t\t// Start rendering\n\t\t\tthis.manager!.render(element as HTMLElement, {\n\t\t\t\t\"width\" : this.settings.width as number,\n\t\t\t\t\"height\" : this.settings.height as number\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});\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: IframeView): void {\n\n\t\tview.on(EVENTS.VIEWS.MARK_CLICKED, (cfiRange: string, data: object) => {\n\t\t\tif (view.contents) {\n\t\t\t\tthis.triggerMarkEvent(cfiRange, data, view.contents);\n\t\t\t}\n\t\t});\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: IframeView): 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<void> {\n\t\treturn this.q.enqueue(() => this.manager!.next())\n\t\t\t.then(() => this.reportLocation());\n\t}\n\n\t/**\n\t * Go to the previous \"page\" in the rendition\n\t * @return {Promise}\n\t */\n\tprev(): Promise<void> {\n\t\treturn this.q.enqueue(() => this.manager!.prev())\n\t\t\t.then(() => this.reportLocation());\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 * Emits \"relocated\" and \"locationChanged\" events.\n\t */\n\treportLocation(): Promise<void> {\n\t\treturn this.q.enqueue(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst location = this.manager!.currentLocation() as any;\n\t\t\t\tif (location && location.then && typeof location.then === \"function\") {\n\t\t\t\t\tlocation.then((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});\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});\n\t\t});\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((result: ViewLocation[]) => {\n\t\t\t\tconst located = this.located(result);\n\t\t\t\treturn located;\n\t\t\t});\n\t\t} else if (location) {\n\t\t\tconst located = this.located(location);\n\t\t\treturn located;\n\t\t}\n\t\treturn undefined;\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\tthis.q.clear();\n\n\t\tif (this.manager) {\n\t\t\tthis.manager.destroy();\n\t\t\tthis.manager = undefined;\n\t\t}\n\n\t\tthis.book = undefined;\n\n\t\tthis.hooks.display.clear();\n\t\tthis.hooks.serialize.clear();\n\t\tthis.hooks.content.clear();\n\t\tthis.hooks.unloaded.clear();\n\t\tthis.hooks.layout.clear();\n\t\tthis.hooks.render.clear();\n\t\tthis.hooks.show.clear();\n\n\t\tthis.themes.destroy();\n\n\t\tthis._layout = undefined;\n\t\tthis.location = undefined;\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: IframeView) {\n\t\t\tif(_cfi.spinePos === view.index) return true;\n\t\t\treturn false;\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\treturn undefined;\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 (): Views | IframeView[] {\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((data: ArrayBuffer) => {\n\t\t\t\treturn this.zip.loadAsync(data, {\"base64\": isBase64});\n\t\t\t});\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((r: string | Blob) => {\n\t\t\t\tconst result = this.handleResponse(r, type);\n\t\t\t\tdeferred.resolve(result);\n\t\t\t});\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\treturn undefined;\n\t}\n\n\t/**\n\t * Get Text from Archive by Url\n\t * @param url\n\t * @param _encoding\n\t * @return text content\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\treturn undefined;\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\treturn undefined;\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((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});\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((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});\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","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 type { IEventEmitter, RequestFunction } from \"./types\";\n\ninterface SimpleStorage {\n\tgetItem(key: string): Promise<any>;\n\tsetItem(key: string, value: any): Promise<any>;\n}\n\nfunction openIDB(name: string): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(name, 1);\n\t\treq.onupgradeneeded = (): void => {\n\t\t\treq.result.createObjectStore(\"data\");\n\t\t};\n\t\treq.onsuccess = (): void => resolve(req.result);\n\t\treq.onerror = (): void => reject(req.error);\n\t});\n}\n\nfunction createStorage(name: string): SimpleStorage {\n\tconst dbPromise = openIDB(name);\n\n\treturn {\n\t\tgetItem(key: string): Promise<any> {\n\t\t\treturn dbPromise.then((db) => new Promise((resolve, reject) => {\n\t\t\t\tconst tx = db.transaction(\"data\", \"readonly\");\n\t\t\t\tconst req = tx.objectStore(\"data\").get(key);\n\t\t\t\treq.onsuccess = (): void => resolve(req.result ?? null);\n\t\t\t\treq.onerror = (): void => reject(req.error);\n\t\t\t}));\n\t\t},\n\t\tsetItem(key: string, value: any): Promise<any> {\n\t\t\treturn dbPromise.then((db) => new Promise((resolve, reject) => {\n\t\t\t\tconst tx = db.transaction(\"data\", \"readwrite\");\n\t\t\t\tconst req = tx.objectStore(\"data\").put(value, key);\n\t\t\t\treq.onsuccess = (): void => resolve(value);\n\t\t\t\treq.onerror = (): void => reject(req.error);\n\t\t\t}));\n\t\t}\n\t};\n}\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!: SimpleStorage;\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.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 that IndexedDB is available and creates the storage instance\n\t * @private\n\t */\n\tcheckRequirements(): void {\n\t\ttry {\n\t\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\t\tthrow new Error(\"IndexedDB not available\");\n\t\t\t}\n\t\t\tthis.storage = createStorage(this.name);\n\t\t} catch (_e) {\n\t\t\tthrow new Error(\"IndexedDB not available\");\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<string | undefined> {\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<string | undefined> {\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((tempUrl: string | undefined) => {\n\n\t\t\t\t\tif (!tempUrl) return;\n\t\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t\t});\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((blob: Blob | undefined) => {\n\n\t\t\t\t\tif (!blob) return;\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});\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 type JSZip from \"jszip\";\nimport { EPUBJS_VERSION, EVENTS } from \"./utils/constants\";\nimport type { IEventEmitter, BookOptions, RenditionOptions, RequestFunction, PackagingManifestObject, PackagingMetadataObject } 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<PackagingManifestObject>;\n\tspine: Promise<Spine>;\n\tmetadata: Promise<PackagingMetadataObject>;\n\tcover: Promise<string>;\n\tnavigation: Promise<Navigation>;\n\tpageList: Promise<PageList>;\n\tresources: Promise<Resources>;\n\tdisplayOptions: Promise<DisplayOptions>;\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<[PackagingManifestObject, Spine, PackagingMetadataObject, string, Navigation, Resources, DisplayOptions]> | 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({}, {\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, (section) => this.load(section));\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((result) => this.openEpub(result));\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((result) => this.openPackaging(result));\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!, (path: string, absolute?: boolean): string => this.resolve(path, absolute), (path: string): string => this.canonical(path));\n\n\t\tthis.resources = new Resources(this.packaging!.manifest, {\n\t\t\tarchive: this.archive,\n\t\t\tresolver: (path: string, absolute?: boolean): string => this.resolve(path, absolute),\n\t\t\trequest: (path: string, type?: string): Promise<any> => this.request(path, type),\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<JSZip> {\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 || ((url: string, type?: string): Promise<any> => request(url, type));\n\t\t// Create new Store\n\t\tthis.storage = new Store(name as string, requester, (path: string, absolute?: boolean): string => this.resolve(path, absolute));\n\t\t// Replace request method to go through store\n\t\tthis.request = (path: string, type?: string): Promise<any> => this.storage!.request(path, type);\n\n\t\tthis.opened!.then(() => {\n\t\t\tif (this.archived) {\n\t\t\t\tthis.storage!.requester = (path: string, type?: string): Promise<any> => this.archive!.request(path, type);\n\t\t\t}\n\t\t\t// Substitute hook\n\t\t\tconst substituteResources = (output: string, section: Section): void => {\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 = (section: any): Promise<any> => this.load(section);\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\";\nimport type { BookOptions } from \"./types\";\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?: string | ArrayBuffer | Blob | BookOptions, options?: BookOptions): Book {\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","requestAnimationFrame","ELEMENT_NODE","TEXT_NODE","_URL","uuid","d","c","r","documentHeight","isElement","obj","isNumber","n","isFloat","prefixed","unprefixed","vendors","prefixes","lower","length","defaults","sources","source","prop","extend","propName","insert","item","array","compareFunction","location","locationOf","_start","_end","start","end","pivot","b","compared","indexOfSorted","bounds","el","style","widthProps","heightProps","width","height","borders","nodeBounds","node","elPos","doc","elRange","windowBounds","indexOfNode","typeId","children","sib","index","indexOfTextNode","textNode","indexOfElementNode","elementNode","isXml","ext","createBlob","content","mime","createBlobUrl","blob","revokeBlobUrl","url","createBase64Url","data","parse","markup","qs","sel","qsa","qsp","props","sprint","root","func","treeWalker","filter","walk","callback","_unused","child","blob2base64","resolve","_reject","reader","defer","reject","querySelectorByType","html","element","query","elements","findChildren","result","childNodes","parents","nodes","current","filterChildren","nodeName","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","code","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","DOCUMENT_NODE","EpubCFI","cfiFrom","base","ignoreClass","cfi","cfiStr","baseComponent","pathComponent","range","componentStr","component","parts","steps","terminal","step","stepStr","id","has_brackets","num","termialStr","characterOffset","textLocationAssertion","assertion","indirection","ranges","part","segment","segmentString","cfiString","cfiOne","cfiTwo","stepsA","stepsB","terminalA","terminalB","nodeType","filteredNode","offset","currentNode","stepA","stepB","needsIgnoring","len","anchor","sibling","previousSibling","nextSibling","isText","curr","totalOffset","output","prevIndex","currNodeType","prevNodeType","map","xpath","position","container","_doc","lastStepIndex","childIndex","startSteps","endSteps","missed","str","_spineNodeIndex","_pos","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","header","handler","err","e","responseXML","Section","hooks","_request","Request","loading","loaded","xml","error","rendering","rendered","serializer","_query","matches","find","text","last","excerpt","limit","maxSeqEle","search","nodeList","acc","endPos","endNodeIndex","l","beforeEndLengthCount","globalLayout","settings","rendition","split","property","value","_range","Spine","_package","resolver","canonical","manifestItem","prev","nextIndex","next","spineItem","Queue","_args","promise","queued","inwait","EPUBJS_VERSION","DOM_EVENTS","EVENTS","Locations","spine","pause","chars","s","completed","locations","cfiBase","body","counter","_break","dist","startCfi","wordCount","count","wc","st","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","list","navList","navListHtml","src","subitems","nested","tocXml","navPoints","navLabel","parentNode","table","mimeTypes","subtype","val","defaultValue","lookup","Resources","options","key","parsedUrl","mimeType","base64","replacementUrls","_archive","_resolver","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","name","css","input","rules","priority","overrides","rule","size","Annotations","view","cfiRange","cb","className","styles","hash","sectionIndex","annotation","Annotation","h","_mark","Mapping","layout","direction","dev","startRange","endRange","selection","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","mql","sheets","mediaChangeHandler","m","_e","_mutations","config","images","img","targetPos","newRange","$stylesheet","ready","styleEl","serializedCss","styleSheet","rl","propStr","selector","pl","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","version","feature","svgCreate","proxyMouse","tracked","dispatch","t","x","y","hitTest","cloneEvent","eventTarget","ev","opts","copy","rectContains","rect","rects","coords","setCoords","containsRect","rect1","rect2","Pane","mark","g","idx","Mark","box","Highlight","attributes","attr","docFrag","filtered","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","previous","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","lastIndex","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","openIDB","req","createStorage","dbPromise","db","Store","requester","httpRequest","_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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"}
1
+ {"version":3,"file":"epub.cjs","sources":["../src/utils/event-emitter.ts","../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","../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): any {\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): any {\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, ...args: any[]): void {\n\t\tif (!this.__listeners || !this.__listeners[type]) return;\n\t\tconst listeners = this.__listeners[type].slice();\n\t\tfor (let i = 0; i < listeners.length; i++) {\n\t\t\tlisteners[i](...args);\n\t\t}\n\t};\n\n\treturn target;\n}\n","/**\n * Core Utilities and Helpers\n * @module Core\n*/\n\n/**\n * @returns {function} requestAnimationFrame\n * @memberof Core\n */\nexport const requestAnimationFrame = (typeof window != \"undefined\") ? window.requestAnimationFrame.bind(window) : false;\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst _COMMENT_NODE = 8;\nconst _DOCUMENT_NODE = 9;\nconst _URL = typeof URL != \"undefined\" ? URL : window.URL;\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 = 0; i < sources.length; i++) {\n\t\tconst source = sources[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, ...sources: any[]): any {\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): number {\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): number {\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 * @returns {document} document\n * @memberof Core\n */\nexport function parse(markup: string, mime: string): Document {\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\treturn new DOMParser().parseFromString(markup, mime as DOMParserSupportedType);\n}\n\n/**\n * querySelector wrapper\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\tif (!el) {\n\t\tthrow new Error(\"No Element Provided\");\n\t}\n\treturn el.querySelector(sel) ?? undefined;\n}\n\n/**\n * querySelectorAll wrapper\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> {\n\treturn el.querySelectorAll(sel);\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\tsel += \"[\";\n\tfor (const prop in props) {\n\t\tsel += prop + \"~='\" + props[prop] + \"'\";\n\t}\n\tsel += \"]\";\n\treturn el.querySelector(sel) ?? undefined;\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\ttreeWalker(root, func, NodeFilter.SHOW_TEXT);\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\treturn undefined;\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(): void {\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 */\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\tconst query = html.querySelector(`${element}[*|type=\"${type}\"]`);\n\tif (query) {\n\t\treturn query;\n\t}\n\t// Fallback: walk elements and check epub:type via namespace or attribute\n\tconst elements = html.querySelectorAll(element);\n\tfor (let i = 0; i < elements.length; i++) {\n\t\tif(elements[i]!.getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") === type ||\n\t\t\t elements[i]!.getAttribute(\"epub:type\") === type) {\n\t\t\treturn elements[i]!;\n\t\t}\n\t}\n\treturn undefined;\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\treturn undefined;\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 undefined;\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\treturn undefined;\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.from(parent.childNodes as ArrayLike<Node>).indexOf(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\treturn undefined;\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 = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n\t\tconst path = i >= 0 ? args[i]! : \"/\";\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;\n\tspinePos: number;\n\trange: boolean;\n\tpath: EpubCFIComponent;\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 = {} as EpubCFIComponent;\n\t\tthis.spinePos = 0; // For compatibility\n\n\t\tthis.range = false; // true || false;\n\n\t\tthis.path = {} as EpubCFIComponent;\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): Partial<Pick<EpubCFI, \"spinePos\" | \"range\" | \"base\" | \"path\" | \"start\" | \"end\">> {\n\t\tconst cfi = {\n\t\t\tspinePos: -1,\n\t\t\trange: false,\n\t\t\tbase: {} as EpubCFIComponent,\n\t\t\tpath: {} as EpubCFIComponent,\n\t\t\tstart: null as EpubCFIComponent | null,\n\t\t\tend: null as EpubCFIComponent | 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// Chapter segment is always the second step\n\t\tif (cfi.base.steps.length < 2) {\n\t\t\treturn {spinePos: -1};\n\t\t}\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((step: string) => {\n\t\t\treturn this.parseStep(step);\n\t\t}).filter((step): step is EpubCFIStep => step !== undefined);\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\t\treturn undefined;\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);\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 != null && terminalB.offset != null) {\n\t\t\tif(terminalA.offset > terminalB.offset) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif(terminalA.offset < terminalB.offset) {\n\t\t\t\treturn -1;\n\t\t\t}\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.length > 0 && 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<Pick<EpubCFI, \"spinePos\" | \"range\" | \"base\" | \"path\" | \"start\" | \"end\">> {\n\t\tconst cfi = {\n\t\t\trange: false,\n\t\t\tbase: {} as EpubCFIComponent,\n\t\t\tpath: {} as EpubCFIComponent,\n\t\t\tstart: null as EpubCFIComponent | null,\n\t\t\tend: null as EpubCFIComponent | null,\n\t\t\tspinePos: 0\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: { offset: null, assertion: 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<Pick<EpubCFI, \"spinePos\" | \"range\" | \"base\" | \"path\" | \"start\" | \"end\">> {\n\t\tconst cfi = {\n\t\t\trange: false,\n\t\t\tbase: {} as EpubCFIComponent,\n\t\t\tpath: {} as EpubCFIComponent,\n\t\t\tstart: null as EpubCFIComponent | null,\n\t\t\tend: null as EpubCFIComponent | null,\n\t\t\tspinePos: 0\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.from(children as ArrayLike<Node>).indexOf(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\t// anchor is always a child of its parentNode, so indexOf is guaranteed to find it\n\t\tconst index = Array.from(children as ArrayLike<Node>).indexOf(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.from(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] as Element;\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] as Node;\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\tif (!container) {\n\t\t\treturn { container: (_doc ?? document).documentElement, offset: 0 };\n\t\t}\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] ?? child;\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 < args.length; ++i) {\n\t\t\tif (typeof args[i] === \"function\") {\n\t\t\t\tthis.hooks.push(args[i]);\n\t\t\t} else {\n\t\t\t\t// unpack array\n\t\t\t\tfor(let j = 0; j < args[i].length; ++j) {\n\t\t\t\t\tthis.hooks.push(args[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 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.call(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): void {\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(): boolean {\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};\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// Also try decoded form for URLs with percent-encoded characters (e.g. CJK filenames)\n\t\t\ttry {\n\t\t\t\tconst decoded = decodeURIComponent(url);\n\t\t\t\tif (decoded !== url) {\n\t\t\t\t\tconst escapedDecoded = decoded.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n\t\t\t\t\tcontent = content.replace(new RegExp(escapedDecoded, \"g\"), replacements[i]);\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\t// Invalid URI encoding, skip decoded replacement\n\t\t\t}\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\tlet header;\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): void {\n\t\tdeferred.reject(e);\n\t}\n\n\tfunction handler(): Promise<any> | undefined {\n\t\tif (xhr.readyState === XMLHttpRequest.DONE) {\n\t\t\tlet responseXML: Document | null | false = false;\n\n\t\t\tif(xhr.responseType === \"\" || xhr.responseType === \"document\") {\n\t\t\t\tresponseXML = xhr.responseXML;\n\t\t\t}\n\n\t\t\tif (xhr.status === 200 || xhr.status === 0 || responseXML) { //-- Firefox is reporting 0 for blob urls\n\t\t\t\tlet r;\n\n\t\t\t\tif (!xhr.response && !responseXML) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: xhr.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 (xhr.status === 403) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: xhr.status,\n\t\t\t\t\t\tresponse: xhr.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 = xhr.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 xhr.responseXML wasn't set, try to parse using a DOMParser from text\n\t\t\t\t\tr = parse(xhr.response, \"text/xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == \"xhtml\"){\n\t\t\t\t\tr = parse(xhr.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(xhr.response, \"text/html\");\n\t\t\t\t}else\n\t\t\t\tif(type == \"json\"){\n\t\t\t\t\tr = JSON.parse(xhr.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 = xhr.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([xhr.response]);\n\t\t\t\t\t}\n\n\t\t\t\t}else{\n\t\t\t\t\tr = xhr.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: xhr.status,\n\t\t\t\t\tmessage : xhr.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\treturn undefined;\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 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: () => Section | undefined;\n\tprev: () => Section | 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((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})\n\t\t\t\t.then(() => {\n\t\t\t\t\tloading.resolve(this.contents);\n\t\t\t\t})\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.load(_request).\n\t\t\tthen((contents: Element) => {\n\t\t\t\tconst serializer = new XMLSerializer();\n\t\t\t\tthis.output = serializer.serializeToString(contents);\n\t\t\t\treturn this.output;\n\t\t\t}).\n\t\t\tthen(() => {\n\t\t\t\treturn this.hooks.serialize.trigger(this.output, this);\n\t\t\t}).\n\t\t\tthen(() => {\n\t\t\t\trendering.resolve(this.output);\n\t\t\t})\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): void {\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.\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\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[]): void {\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(...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 = (): Section | undefined => {\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};\n\t\t\t\titem.next = (): Section | undefined => {\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};\n\t\t\t} else {\n\t\t\t\titem.prev = function(): Section | undefined {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\titem.next = function(): Section | 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)] ?? -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)] ?? -1;\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\treturn undefined;\n\t}\n\n\t/**\n\t * Loop over the Sections in the Spine\n\t * @return {method} forEach\n\t */\n\teach(fn: (section: Section, index: number, array: Section[]) => void): void {\n\t\treturn this.spineItems.forEach(fn);\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\treturn undefined;\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\treturn undefined;\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, ...args] = _args;\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.call(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((...args: any[]) => {\n\t\t\t\t\t\tinwait.deferred.resolve(...args);\n\t\t\t\t\t}, (...args: any[]) => {\n\t\t\t\t\t\tinwait.deferred.reject(...args);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Task resolves immediately\n\t\t\t\t\tinwait.deferred.resolve(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(() => {\n\n\t\t\tif(this._q.length) {\n\n\t\t\t\tthis.dequeue()\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tthis.run();\n\t\t\t\t\t});\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(() => {\n\t\t\t\t\tthis.running = undefined;\n\t\t\t\t\treturn this.flush();\n\t\t\t\t});\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(this: unknown, ...toApply: any[]): Promise<any> {\n\n\t\t\treturn new Promise( (resolve, reject) => {\n\t\t\t\tconst callback = function(value: any, err: any): void {\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.call(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\", \"keypress\", \"mouseup\", \"mousedown\", \"mousemove\", \"click\", \"dblclick\", \"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((section: Section) => {\n\t\t\tif (section.linear) {\n\t\t\t\tthis.q.enqueue((s: Section) => this.process(s), section);\n\t\t\t}\n\t\t});\n\n\t\treturn this.q.run().then(() => {\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});\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((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});\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 = (node: Node): boolean => {\n\t\t\tconst len = (node as Text).length;\n\t\t\tlet dist;\n\t\t\tlet pos = 0;\n\n\t\t\t// Start range\n\t\t\tif (counter === 0 && range === undefined) {\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\tif ((node.textContent ?? \"\").trim().length === 0) {\n\t\t\t\tprev = node;\n\t\t\t\treturn false; // continue\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\treturn false;\n\t\t};\n\n\t\tsprint(body!, parser);\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<{ cfi: string; wordCount: number }[]> {\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((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((s: Section, wc: number, st: any, c: number) => this.processWords(s, wc, st, c), section, wordCount, start, count);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.q.enqueue((s: Section, wc: number, st: any, c: number) => this.processWords(s, wc, st, c), section, wordCount, start, count);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this.q.run().then(() => {\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});\n\n\t}\n\n\tprocessWords(section: Section, wordCount: number, startCfi?: EpubCFI, count?: number): Promise<{ cfi: string; wordCount: number }[]> {\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((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});\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 = (node: Node): boolean => {\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\treturn false;\n\t\t};\n\n\t\tsprint(body!, parser);\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 loc - location index\n\t * @return percentage\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 */\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.from(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\t\t\t\t\tfallback = item.getAttribute(\"fallback\") || \"\";\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\t\"fallback\" : fallback,\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.from(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 json - JSON manifest data\n\t * @return 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\ttarget = target.substring(1);\n\t\t\tindex = this.tocById[target];\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 index !== undefined ? this.landmarks[index] : undefined;\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\tif (parent) {\n\t\t\t\t\tparent.subitems!.push(item);\n\t\t\t\t} else {\n\t\t\t\t\tlist.push(item);\n\t\t\t\t}\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(): Record<string, string> {\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\treturn false;\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\treturn false;\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\treturn false;\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((item: PackagingManifestItem): string => {\n\t\t\t\treturn item.href;\n\t\t\t});\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 | ArrayBuffer) => {\n\t\t\t\t\t\treturn createBase64Url(base64 as string, 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((resolve: (value: string[]) => void) => {\n\t\t\t\tresolve(this.urls);\n\t\t\t});\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\tthis.cssUrls.forEach((href: string) => {\n\t\t\tconst replacement = this.createCssFile(href)\n\t\t\t\t.then((replacementUrl) => {\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 (replacementUrl && indexInUrls > -1) {\n\t\t\t\t\t\tthis.replacementUrls[indexInUrls] = replacementUrl;\n\t\t\t\t\t}\n\t\t\t\t})\n\n\n\t\t\treplaced.push(replacement);\n\t\t});\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((href: string): 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});\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((resolve: (value: string) => void, _reject: (reason?: any) => void) => {\n\t\t\t\tresolve(this.replacementUrls[indexInUrls]!);\n\t\t\t});\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((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});\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 && index < this.locations.length) {\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((contents: any) => this.inject(contents));\n\t\tthis.rendition.hooks.content.register((contents: any) => this.overrides(contents));\n\n\t}\n\n\t/**\n\t * Add themes to be used by a rendition\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 (args.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (args.length === 1 && typeof(args[0]) === \"object\") {\n\t\t\treturn this.registerThemes(args[0]);\n\t\t}\n\t\tif (args.length === 1 && typeof(args[0]) === \"string\") {\n\t\t\treturn this.default(args[0]);\n\t\t}\n\t\tif (args.length === 2 && typeof(args[1]) === \"string\") {\n\t\t\treturn this.registerUrl(args[0], args[1]);\n\t\t}\n\t\tif (args.length === 2 && typeof(args[1]) === \"object\") {\n\t\t\treturn this.registerRules(args[0], args[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) || (theme.serialized)) {\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 contents - contents to apply overrides to\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((view: any) => this.inject(view));\n\t\tthis.rendition.hooks.unloaded.register((section: any) => this.clear(section));\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 (fn: (annotation: Annotation, key: string) => void): void {\n\t\tObject.keys(this._annotations).forEach((key) => {\n\t\t\tfn(this._annotations[key]!, key);\n\t\t});\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\tif (!annotation) return;\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\tif (!annotation) return;\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\";\nimport type IframeView from \"./managers/views/iframe\";\nimport type Contents from \"./contents\";\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: IframeView): 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: Contents, 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\tconst filter: NodeFilter = {\n\t\t\tacceptNode(node: Node): number {\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\n\t\tconst treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, filter);\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: IframeView): RangePair[] {\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\t\t\t\treturn undefined;\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\t\t\t\treturn undefined;\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\t_onVisibilityChange: (() => void) | undefined;\n\t_mediaQueryHandlers: { mql: MediaQueryList; handler: (e: MediaQueryListEvent) => void }[];\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._mediaQueryHandlers = [];\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(): typeof DOM_EVENTS {\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._onVisibilityChange) {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", this._onVisibilityChange);\n\t\t\tthis._onVisibilityChange = undefined;\n\t\t}\n\n\t\tif (this._resizeCheck) {\n\t\t\tthis.document.removeEventListener(\"transitionend\", this._resizeCheck);\n\t\t\tthis._resizeCheck = undefined;\n\t\t}\n\n\t\tfor (const { mql, handler } of this._mediaQueryHandlers) {\n\t\t\tmql.removeEventListener(\"change\", handler);\n\t\t}\n\t\tthis._mediaQueryHandlers = [];\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\tthis._onVisibilityChange = (): void => {\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\tdocument.addEventListener(\"visibilitychange\", this._onVisibilityChange);\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 = (m: MediaQueryListEvent): void => {\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};\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\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.addEventListener(\"change\", mediaChangeHandler);\n\t\t\t\t\tthis._mediaQueryHandlers.push({ mql, handler: 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(() => {\n\t\t\tthis.resizeCheck();\n\t\t});\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 instanceof Error ? e.stack : undefined);\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((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 as any).onreadystatechange = function(this: any): void {\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});\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: Record<string, Record<string, string> | Array<Record<string, string>>> | Array<Array<string | string[]>>, key?: string): void {\n\t\tif(!this.document || !rules || (Array.isArray(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 (Array.isArray(rules)) {\n\t\t\t// Array format: [selector, [prop, val], ...] or [selector, [[prop, val], ...]]\n\t\t\tfor (let i = 0, rl = rules.length; i < rl; i++) {\n\t\t\t\tlet j = 1, rule: Array<string | string[]> = rules[i]!, propStr = \"\";\n\t\t\t\tconst selector = rules[i]![0] as string;\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 (Array.isArray(rule[1]?.[0])) {\n\t\t\t\t\trule = rule[1] as string[];\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((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 as any).onreadystatechange = function(this: any): void {\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});\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 className - class name to remove\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((eventName) => {\n\t\t\tthis.document.addEventListener(eventName, this._triggerEvent!, { passive: true });\n\t\t});\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((eventName) => {\n\t\t\tthis.document.removeEventListener(eventName, this._triggerEvent!);\n\t\t});\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(() => {\n\t\t\tconst selection = this.window.getSelection();\n\t\t\tif (selection) {\n\t\t\t\tthis.triggerSelectedEvent(selection);\n\t\t\t}\n\t\t}, 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/**\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// Fixes Safari column cut offs, but causes RTL issues.\n\t\t// Required on iOS: block-level body in CSS columns triggers a\n\t\t// WKWebView content-size expansion feedback loop where scrollWidth\n\t\t// grows toward infinity. inline-block shrink-wraps the body to\n\t\t// its explicit width, breaking the cycle.\n\t\tthis.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\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): boolean {\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\tthis.removeListeners();\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 } from \"../../marks-pane\";\nimport type { 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((contents: string) => {\n\t\t\t\treturn this.load(contents);\n\t\t\t})\n\t\t\t.then(() => {\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}, (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})\n\t\t\t.then(() => {\n\t\t\t\tthis.emit(EVENTS.VIEWS.RENDERED, this.section);\n\t\t\t});\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 = (event: Event): void => {\n\n\t\t\tthis.onLoad(event, loading);\n\n\t\t};\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(() => {\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}, (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 = (): void => {\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\tlet h: Mark;\n\t\ttry {\n\t\t\th = this.pane.addMark(m);\n\t\t} catch (e) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\"Failed to add highlight for\", cfiRange, e);\n\t\t\treturn;\n\t\t}\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 = (): void => {\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\tlet h: Mark;\n\t\ttry {\n\t\t\th = this.pane.addMark(m);\n\t\t} catch (e) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\"Failed to add underline for\", cfiRange, e);\n\t\t\treturn;\n\t\t}\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): void => {\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): (...args: any[]) => void {\n\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\tlet previous = 0;\n\treturn function(this: unknown, ...args: any[]) {\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.call(this, ...args);\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.call(this, ...args);\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\t\tcontainer.style.overflowAnchor = \"none\";\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(...args);\n\t}\n\n\tget(i: number): IframeView | undefined {\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\t\treturn undefined;\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\t_onUnload!: (e: Event) => void;\n\torientationTimeout: ReturnType<typeof setTimeout> | undefined;\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({}, {\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());\n\n\t\tthis.stage.onOrientationChange((e: Event) => this.onOrientationChange(e));\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\tthis._onUnload = (_e: Event): void => {\n\t\t\tthis.destroy();\n\t\t};\n\t\twindow.addEventListener(\"unload\", this._onUnload);\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\n\t\twindow.removeEventListener(\"unload\", this._onUnload);\n\t\t(this as any)._onUnload = 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(() => {\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}, 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): Promise<IframeView> | undefined {\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 undefined;\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\treturn undefined;\n\t}\n\n\tdisplay(section: Section, target?: string): Promise<void> {\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((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}, (err) => {\n\t\t\t\tdisplaying.reject(err);\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\treturn this.handleNextPrePaginated(forceRight, section, this.add);\n\t\t\t})\n\t\t\t.then(() => {\n\n\t\t\t\tthis.views.show();\n\n\t\t\t\tdisplaying.resolve();\n\n\t\t\t});\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.height) * this.layout.height;\n\n\t\t\tif (distY + this.layout.height > this.container.scrollHeight) {\n\t\t\t\tdistY = this.container.scrollHeight - this.layout.height;\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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(): Promise<void> | undefined {\n\t\tlet next: Section | undefined;\n\t\tlet left;\n\n\t\tconst dir = this.settings.direction;\n\n\t\tif(!this.views.length) return undefined;\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 reachedBottom = Math.abs(this.container.scrollHeight - this.container.clientHeight - this.container.scrollTop) < 1;\n\n\t\t\tif(!reachedBottom) {\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(() => {\n\t\t\t\t\treturn this.handleNextPrePaginated(forceRight, next, this.append);\n\t\t\t\t}, (err) => {\n\t\t\t\t\treturn err;\n\t\t\t\t})\n\t\t\t\t.then(() => {\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\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});\n\t\t}\n\t\treturn undefined;\n\n\t}\n\n\tprev(): Promise<void> | undefined {\n\t\tlet prev: Section | undefined;\n\t\tlet left;\n\t\tconst dir = this.settings.direction;\n\n\t\tif(!this.views.length) return undefined;\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(() => {\n\t\t\t\t\tif (this.layout.name === \"pre-paginated\" && this.layout.divisor > 1) {\n\t\t\t\t\t\tconst left = 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\treturn undefined;\n\t\t\t\t}, (err) => {\n\t\t\t\t\treturn err;\n\t\t\t\t})\n\t\t\t\t.then(() => {\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});\n\t\t}\n\t\treturn undefined;\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(() => {\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}, 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((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((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): number {\n\t\t\t\treturn Math.sin(pos * PI_D2);\n\t\t},\n\t\teaseInOutSine: function (pos: number): number {\n\t\t\t\treturn (-0.5 * (Math.cos(Math.PI * pos) - 1));\n\t\t},\n\t\teaseInOutQuint: function (pos: number): 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): 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\tconst tick = (): void => {\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);\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();\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): (...args: any[]) => void {\n\tlet timeout: ReturnType<typeof setTimeout>;\n\treturn function(this: unknown, ...args: any[]) {\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => {\n\t\t\tfunc.call(this, ...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({}, {\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(() => {\n\t\t\t\treturn this.fill();\n\t\t\t});\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(): void {};\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 = (view): void => this.afterDisplayed(view);\n\t\tview.onResize = (view): void => this.afterResized(view);\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 = (view): void => this.afterDisplayed(view);\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 = (view): void => this.afterDisplayed(view);\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());\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(() => {\n\t\t\t\t\tthis.q.enqueue(() => this.trim());\n\t\t\t\t}, 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 = (): void => {\n\t\t\tconst first = this.views.first();\n\t\t\tconst prev = 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 = (): void => {\n\t\t\tconst last = this.views.last();\n\t\t\tconst next = 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(() => {\n\t\t\t\tthis.update();\n\t\t\t});\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\tif (!displayed.length) {\n\t\t\ttask.resolve();\n\t\t\treturn task.promise;\n\t\t}\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\tthis._onUnload = (_e: Event): void => {\n\t\t\tthis.ignore = true;\n\t\t\t// this.scrollTo(0,0);\n\t\t\tthis.destroy();\n\t\t};\n\t\twindow.addEventListener(\"unload\", this._onUnload);\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(), 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\n\t\twindow.removeEventListener(\"unload\", this._onUnload);\n\t\t(this as any)._onUnload = 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(() => {\n\t\t\tthis.scrollDeltaVert = 0;\n\t\t\tthis.scrollDeltaHorz = 0;\n\t\t}, 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(() => {\n\t\t\treturn this.check();\n\t\t});\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(() => {\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}, this.settings.afterScrolledTimeout);\n\t}\n\n\tnext(): Promise<void> | undefined {\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 undefined;\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(() => {\n\t\t\treturn this.check();\n\t\t});\n\t\treturn undefined;\n\t}\n\n\tprev(): Promise<void> | undefined {\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 undefined;\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(() => {\n\t\t\treturn this.check();\n\t\t});\n\t\treturn undefined;\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 type 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\";\nimport type Views from \"./managers/helpers/views\";\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({}, {\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((contents: any) => this.handleLinks(contents));\n\t\tthis.hooks.content.register((contents: any) => this.passEvents(contents));\n\t\tthis.hooks.content.register((contents: any) => this.adjustImages(contents));\n\n\t\tthis.book!.spine!.hooks.content.register((doc: any, section: any) => this.injectIdentifier(doc, section));\n\n\t\tif (this.settings.stylesheet) {\n\t\t\tthis.book!.spine!.hooks.content.register((doc: any, section: any) => this.injectStylesheet(doc, section));\n\t\t}\n\n\t\tif (this.settings.script) {\n\t\t\tthis.book!.spine!.hooks.content.register((doc: any, section: any) => this.injectScript(doc, section));\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, (view: any) => this.afterDisplayed(view));\n\t\tthis.manager.on(EVENTS.MANAGERS.REMOVED, (view: any) => this.afterRemoved(view));\n\n\t\t// Listen for resizing\n\t\tthis.manager.on(EVENTS.MANAGERS.RESIZED, (size: any, epubcfi?: string) => this.onResized(size, epubcfi));\n\n\t\t// Listen for rotation\n\t\tthis.manager.on(EVENTS.MANAGERS.ORIENTATION_CHANGE, (orientation: any) => this.onOrientationChange(orientation));\n\n\t\t// Listen for scroll changes\n\t\tthis.manager.on(EVENTS.MANAGERS.SCROLLED, () => this.reportLocation());\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(() => {\n\n\t\t\t// Start rendering\n\t\t\tthis.manager!.render(element as HTMLElement, {\n\t\t\t\t\"width\" : this.settings.width as number,\n\t\t\t\t\"height\" : this.settings.height as number\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});\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: IframeView): void {\n\n\t\tview.on(EVENTS.VIEWS.MARK_CLICKED, (cfiRange: string, data: object) => {\n\t\t\tif (view.contents) {\n\t\t\t\tthis.triggerMarkEvent(cfiRange, data, view.contents);\n\t\t\t}\n\t\t});\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: IframeView): 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<void> {\n\t\treturn this.q.enqueue(() => this.manager!.next())\n\t\t\t.then(() => this.reportLocation());\n\t}\n\n\t/**\n\t * Go to the previous \"page\" in the rendition\n\t * @return {Promise}\n\t */\n\tprev(): Promise<void> {\n\t\treturn this.q.enqueue(() => this.manager!.prev())\n\t\t\t.then(() => this.reportLocation());\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 * Emits \"relocated\" and \"locationChanged\" events.\n\t */\n\treportLocation(): Promise<void> {\n\t\treturn this.q.enqueue(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst location = this.manager!.currentLocation() as any;\n\t\t\t\tif (location && location.then && typeof location.then === \"function\") {\n\t\t\t\t\tlocation.then((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});\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});\n\t\t});\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((result: ViewLocation[]) => {\n\t\t\t\tconst located = this.located(result);\n\t\t\t\treturn located;\n\t\t\t});\n\t\t} else if (location) {\n\t\t\tconst located = this.located(location);\n\t\t\treturn located;\n\t\t}\n\t\treturn undefined;\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\tthis.q.clear();\n\n\t\tif (this.manager) {\n\t\t\tthis.manager.destroy();\n\t\t\tthis.manager = undefined;\n\t\t}\n\n\t\tthis.book = undefined;\n\n\t\tthis.hooks.display.clear();\n\t\tthis.hooks.serialize.clear();\n\t\tthis.hooks.content.clear();\n\t\tthis.hooks.unloaded.clear();\n\t\tthis.hooks.layout.clear();\n\t\tthis.hooks.render.clear();\n\t\tthis.hooks.show.clear();\n\n\t\tthis.themes.destroy();\n\n\t\tthis._layout = undefined;\n\t\tthis.location = undefined;\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: IframeView) {\n\t\t\tif(_cfi.spinePos === view.index) return true;\n\t\t\treturn false;\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\treturn undefined;\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 (): Views | IframeView[] {\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((data: ArrayBuffer) => {\n\t\t\t\treturn this.zip.loadAsync(data, {\"base64\": isBase64});\n\t\t\t});\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((r: string | Blob) => {\n\t\t\t\tconst result = this.handleResponse(r, type);\n\t\t\t\tdeferred.resolve(result);\n\t\t\t});\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\treturn undefined;\n\t}\n\n\t/**\n\t * Get Text from Archive by Url\n\t * @param url\n\t * @param _encoding\n\t * @return text content\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\treturn undefined;\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\treturn undefined;\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((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});\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((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});\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","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 type { IEventEmitter, RequestFunction } from \"./types\";\n\ninterface SimpleStorage {\n\tgetItem(key: string): Promise<any>;\n\tsetItem(key: string, value: any): Promise<any>;\n}\n\nfunction openIDB(name: string): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(name, 1);\n\t\treq.onupgradeneeded = (): void => {\n\t\t\treq.result.createObjectStore(\"data\");\n\t\t};\n\t\treq.onsuccess = (): void => resolve(req.result);\n\t\treq.onerror = (): void => reject(req.error);\n\t});\n}\n\nfunction createStorage(name: string): SimpleStorage {\n\tconst dbPromise = openIDB(name);\n\n\treturn {\n\t\tgetItem(key: string): Promise<any> {\n\t\t\treturn dbPromise.then((db) => new Promise((resolve, reject) => {\n\t\t\t\tconst tx = db.transaction(\"data\", \"readonly\");\n\t\t\t\tconst req = tx.objectStore(\"data\").get(key);\n\t\t\t\treq.onsuccess = (): void => resolve(req.result ?? null);\n\t\t\t\treq.onerror = (): void => reject(req.error);\n\t\t\t}));\n\t\t},\n\t\tsetItem(key: string, value: any): Promise<any> {\n\t\t\treturn dbPromise.then((db) => new Promise((resolve, reject) => {\n\t\t\t\tconst tx = db.transaction(\"data\", \"readwrite\");\n\t\t\t\tconst req = tx.objectStore(\"data\").put(value, key);\n\t\t\t\treq.onsuccess = (): void => resolve(value);\n\t\t\t\treq.onerror = (): void => reject(req.error);\n\t\t\t}));\n\t\t}\n\t};\n}\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!: SimpleStorage;\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.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 that IndexedDB is available and creates the storage instance\n\t * @private\n\t */\n\tcheckRequirements(): void {\n\t\ttry {\n\t\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\t\tthrow new Error(\"IndexedDB not available\");\n\t\t\t}\n\t\t\tthis.storage = createStorage(this.name);\n\t\t} catch (_e) {\n\t\t\tthrow new Error(\"IndexedDB not available\");\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<string | undefined> {\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<string | undefined> {\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((tempUrl: string | undefined) => {\n\n\t\t\t\t\tif (!tempUrl) return;\n\t\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t\t});\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((blob: Blob | undefined) => {\n\n\t\t\t\t\tif (!blob) return;\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});\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 type JSZip from \"jszip\";\nimport { EPUBJS_VERSION, EVENTS } from \"./utils/constants\";\nimport type { IEventEmitter, BookOptions, RenditionOptions, RequestFunction, PackagingManifestObject, PackagingMetadataObject } 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<PackagingManifestObject>;\n\tspine: Promise<Spine>;\n\tmetadata: Promise<PackagingMetadataObject>;\n\tcover: Promise<string>;\n\tnavigation: Promise<Navigation>;\n\tpageList: Promise<PageList>;\n\tresources: Promise<Resources>;\n\tdisplayOptions: Promise<DisplayOptions>;\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<[PackagingManifestObject, Spine, PackagingMetadataObject, string, Navigation, Resources, DisplayOptions]> | 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({}, {\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, (section) => this.load(section));\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((result) => this.openEpub(result));\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((result) => this.openPackaging(result));\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!, (path: string, absolute?: boolean): string => this.resolve(path, absolute), (path: string): string => this.canonical(path));\n\n\t\tthis.resources = new Resources(this.packaging!.manifest, {\n\t\t\tarchive: this.archive,\n\t\t\tresolver: (path: string, absolute?: boolean): string => this.resolve(path, absolute),\n\t\t\trequest: (path: string, type?: string): Promise<any> => this.request(path, type),\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<JSZip> {\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 || ((url: string, type?: string): Promise<any> => request(url, type));\n\t\t// Create new Store\n\t\tthis.storage = new Store(name as string, requester, (path: string, absolute?: boolean): string => this.resolve(path, absolute));\n\t\t// Replace request method to go through store\n\t\tthis.request = (path: string, type?: string): Promise<any> => this.storage!.request(path, type);\n\n\t\tthis.opened!.then(() => {\n\t\t\tif (this.archived) {\n\t\t\t\tthis.storage!.requester = (path: string, type?: string): Promise<any> => this.archive!.request(path, type);\n\t\t\t}\n\t\t\t// Substitute hook\n\t\t\tconst substituteResources = (output: string, section: Section): void => {\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 = (section: any): Promise<any> => this.load(section);\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\";\nimport type { BookOptions } from \"./types\";\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?: string | ArrayBuffer | Blob | BookOptions, options?: BookOptions): Book {\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","requestAnimationFrame","ELEMENT_NODE","TEXT_NODE","_URL","uuid","d","c","r","documentHeight","isElement","obj","isNumber","n","isFloat","prefixed","unprefixed","vendors","prefixes","lower","length","defaults","sources","source","prop","extend","propName","insert","item","array","compareFunction","location","locationOf","_start","_end","start","end","pivot","b","compared","indexOfSorted","bounds","el","style","widthProps","heightProps","width","height","borders","nodeBounds","node","elPos","doc","elRange","windowBounds","indexOfNode","typeId","children","sib","index","indexOfTextNode","textNode","indexOfElementNode","elementNode","isXml","ext","createBlob","content","mime","createBlobUrl","blob","revokeBlobUrl","url","createBase64Url","data","parse","markup","qs","sel","qsa","qsp","props","sprint","root","func","treeWalker","filter","walk","callback","_unused","child","blob2base64","resolve","_reject","reader","defer","reject","querySelectorByType","html","element","query","elements","findChildren","result","childNodes","parents","nodes","current","filterChildren","nodeName","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","code","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","DOCUMENT_NODE","EpubCFI","cfiFrom","base","ignoreClass","cfi","cfiStr","baseComponent","pathComponent","range","componentStr","component","parts","steps","terminal","step","stepStr","id","has_brackets","num","termialStr","characterOffset","textLocationAssertion","assertion","indirection","ranges","part","segment","segmentString","cfiString","cfiOne","cfiTwo","stepsA","stepsB","terminalA","terminalB","nodeType","filteredNode","offset","currentNode","stepA","stepB","needsIgnoring","len","anchor","sibling","previousSibling","nextSibling","isText","curr","totalOffset","output","prevIndex","currNodeType","prevNodeType","map","xpath","position","container","_doc","lastStepIndex","childIndex","startSteps","endSteps","missed","str","_spineNodeIndex","_pos","pos","Hook","context","hook","promises","task","executing","_err","replaceBase","section","head","replaceCanonical","link","replaceMeta","meta","replaceLinks","contents","links","replaceLink","href","linkUrl","substitute","urls","replacements","decoded","escapedDecoded","request","withCredentials","headers","supportsURL","BLOB_RESPONSE","deferred","xhr","header","handler","err","e","responseXML","Section","hooks","_request","Request","loading","loaded","xml","error","rendering","rendered","serializer","_query","matches","find","text","last","excerpt","limit","maxSeqEle","search","nodeList","acc","endPos","endNodeIndex","l","beforeEndLengthCount","globalLayout","settings","rendition","split","property","value","_range","Spine","_package","resolver","canonical","manifestItem","prev","nextIndex","next","spineItem","Queue","_args","promise","queued","inwait","EPUBJS_VERSION","DOM_EVENTS","EVENTS","Locations","spine","pause","chars","s","completed","locations","cfiBase","body","counter","_break","dist","startCfi","wordCount","count","wc","st","remainingCount","foundStartNode","loc","percentage","Container","containerDocument","rootfile","Packaging","packageDocument","metadataNode","manifestNode","spineNode","metadata","manifestXml","manifest","selected","overlay","properties","fallback","spineXml","_manifest","idref","propArray","itemref","packageXml","uniqueIdentifierId","identifier","tocId","pkg","metaCover","coverId","cover","tag","found","json","Navigation","ncx","toc","navItems","navHtml","navElement","list","navList","navListHtml","src","subitems","nested","tocXml","navPoints","navLabel","parentNode","table","mimeTypes","subtype","val","defaultValue","lookup","Resources","options","key","parsedUrl","mimeType","base64","replacementUrls","_archive","_resolver","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","name","css","input","rules","priority","overrides","rule","size","Annotations","view","cfiRange","cb","className","styles","hash","sectionIndex","annotation","Annotation","h","_mark","Mapping","layout","direction","dev","startRange","endRange","selection","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","mql","sheets","mediaChangeHandler","m","_e","_mutations","config","images","img","targetPos","newRange","$stylesheet","ready","styleEl","serializedCss","styleSheet","rl","propStr","selector","pl","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","version","feature","svgCreate","proxyMouse","tracked","dispatch","t","x","y","hitTest","cloneEvent","eventTarget","ev","opts","copy","rectContains","rect","rects","coords","setCoords","containsRect","rect1","rect2","Pane","mark","g","idx","Mark","box","Highlight","attributes","attr","docFrag","filtered","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","previous","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","lastIndex","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","openIDB","req","createStorage","dbPromise","db","Store","requester","httpRequest","_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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"}