From 3f77693ef94d2da3566f0d80fb5b4530956a5cb4 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sat, 20 May 2023 19:31:04 +0800 Subject: [PATCH] fix bug Former-commit-id: 279a92966786748029a3d7542a9b75877a401c74 --- edge-tts.js | 291 ++++++++++++++++++ main.js | 291 +----------------- public/lib/kookit/kookit.min.js | 10 +- src/assets/locales/cn/translation.json | 1 + src/assets/locales/en/translation.json | 1 + src/components/deleteIcon/component.tsx | 12 + .../settingSwitch/component.tsx | 4 + .../settingSwitch/interface.tsx | 1 + src/components/searchBox/searchBox.css | 2 +- src/components/selectBook/component.tsx | 2 +- src/components/textToSpeech/component.tsx | 31 +- src/constants/settingList.tsx | 4 + src/containers/htmlViewer/component.tsx | 7 +- src/containers/lists/bookList/component.tsx | 6 +- src/containers/lists/navList/component.tsx | 6 +- .../panels/navigationPanel/component.tsx | 5 +- src/containers/sidebar/component.tsx | 6 +- src/pages/manager/component.tsx | 10 +- src/utils/readUtils/linkUtil.tsx | 4 +- src/utils/serviceUtils/bionicUtil.tsx | 90 ++++++ src/utils/serviceUtils/edgeUtil.tsx | 26 +- src/utils/serviceUtils/mouseEvent.tsx | 7 +- 22 files changed, 478 insertions(+), 339 deletions(-) create mode 100644 edge-tts.js create mode 100644 src/utils/serviceUtils/bionicUtil.tsx diff --git a/edge-tts.js b/edge-tts.js new file mode 100644 index 00000000..7642dfca --- /dev/null +++ b/edge-tts.js @@ -0,0 +1,291 @@ +const { randomBytes } = require("crypto"); +const { WebSocket } = require("ws"); +const FORMAT_CONTENT_TYPE = new Map([ + ["raw-16khz-16bit-mono-pcm", "audio/basic"], + ["raw-48khz-16bit-mono-pcm", "audio/basic"], + ["raw-8khz-8bit-mono-mulaw", "audio/basic"], + ["raw-8khz-8bit-mono-alaw", "audio/basic"], + + ["raw-16khz-16bit-mono-truesilk", "audio/SILK"], + ["raw-24khz-16bit-mono-truesilk", "audio/SILK"], + + ["riff-16khz-16bit-mono-pcm", "audio/x-wav"], + ["riff-24khz-16bit-mono-pcm", "audio/x-wav"], + ["riff-48khz-16bit-mono-pcm", "audio/x-wav"], + ["riff-8khz-8bit-mono-mulaw", "audio/x-wav"], + ["riff-8khz-8bit-mono-alaw", "audio/x-wav"], + + ["audio-16khz-32kbitrate-mono-mp3", "audio/mpeg"], + ["audio-16khz-64kbitrate-mono-mp3", "audio/mpeg"], + ["audio-16khz-128kbitrate-mono-mp3", "audio/mpeg"], + ["audio-24khz-48kbitrate-mono-mp3", "audio/mpeg"], + ["audio-24khz-96kbitrate-mono-mp3", "audio/mpeg"], + ["audio-24khz-160kbitrate-mono-mp3", "audio/mpeg"], + ["audio-48khz-96kbitrate-mono-mp3", "audio/mpeg"], + ["audio-48khz-192kbitrate-mono-mp3", "audio/mpeg"], + + ["webm-16khz-16bit-mono-opus", "audio/webm; codec=opus"], + ["webm-24khz-16bit-mono-opus", "audio/webm; codec=opus"], + + ["ogg-16khz-16bit-mono-opus", "audio/ogg; codecs=opus; rate=16000"], + ["ogg-24khz-16bit-mono-opus", "audio/ogg; codecs=opus; rate=24000"], + ["ogg-48khz-16bit-mono-opus", "audio/ogg; codecs=opus; rate=48000"], +]); + +class Service { + ws = null; + + executorMap; + bufferMap; + + timer = null; + + constructor() { + this.executorMap = new Map(); + this.bufferMap = new Map(); + } + + async connect() { + const connectionId = randomBytes(16).toString("hex").toLowerCase(); + let url = `wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1?TrustedClientToken=6A5AA1D4EAFF4E9FB37E23D68491D6F4&ConnectionId=${connectionId}`; + console.log(url); + let ws = new WebSocket(url, { + host: "speech.platform.bing.com", + origin: "chrome-extension://jdiccldimpdaibmpdkjnbmckianbfold", + headers: { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44", + }, + }); + console.log(ws); + return new Promise((resolve, reject) => { + ws.on("open", () => { + resolve(ws); + }); + ws.on("close", (code, reason) => { + // 服务器会自动断开空闲超过30秒的连接 + this.ws = null; + if (this.timer) { + clearTimeout(this.timer); + this.timer = null; + } + for (let [key, value] of this.executorMap) { + value.reject(`连接已关闭: ${reason} ${code}`); + } + this.executorMap.clear(); + this.bufferMap.clear(); + console.info(`连接已关闭: ${reason} ${code}`); + }); + + ws.on("message", (message, isBinary) => { + let pattern = /X-RequestId:(?[a-z|0-9]*)/; + if (!isBinary) { + console.debug("收到文本消息:%s", message); + let data = message.toString(); + if (data.includes("Path:turn.start")) { + // 开始传输 + let matches = data.match(pattern); + let requestId = matches.groups.id; + console.debug(`开始传输:${requestId}……`); + this.bufferMap.set(requestId, Buffer.from([])); + } else if (data.includes("Path:turn.end")) { + // 结束传输 + let matches = data.match(pattern); + let requestId = matches.groups.id; + + let executor = this.executorMap.get(requestId); + if (executor) { + this.executorMap.delete(matches.groups.id); + let result = this.bufferMap.get(requestId); + executor.resolve(result); + console.debug(`传输完成:${requestId}……`); + } else { + console.debug(`请求已被丢弃:${requestId}`); + } + } + } else if (isBinary) { + let separator = "Path:audio\r\n"; + let data = message; + let contentIndex = data.indexOf(separator) + separator.length; + + let headers = data.slice(2, contentIndex).toString(); + let matches = headers.match(pattern); + let requestId = matches.groups.id; + + let content = data.slice(contentIndex); + + console.debug( + `收到音频片段:${requestId} Length: ${content.length}\n${headers}` + ); + + let buffer = this.bufferMap.get(requestId); + if (buffer) { + buffer = Buffer.concat([buffer, content]); + this.bufferMap.set(requestId, buffer); + } else { + console.debug(`请求已被丢弃:${requestId}`); + } + } + }); + ws.on("error", (error) => { + console.error(`连接失败: ${error}`); + reject(`连接失败: ${error}`); + }); + ws.on("ping", (data) => { + console.debug("ping %s", data); + }); + ws.on("pong", (data) => { + console.debug("pong %s", data); + }); + }); + } + + async convert(ssml, format) { + if (this.ws == null || this.ws.readyState != WebSocket.OPEN) { + console.info("准备连接服务器……"); + let connection = await this.connect(); + this.ws = connection; + console.info("连接成功!"); + } + const requestId = randomBytes(16).toString("hex").toLowerCase(); + let result = new Promise((resolve, reject) => { + // 等待服务器返回后这个方法才会返回结果 + this.executorMap.set(requestId, { + resolve, + reject, + }); + // 发送配置消息 + let configData = { + context: { + synthesis: { + audio: { + metadataoptions: { + sentenceBoundaryEnabled: "false", + wordBoundaryEnabled: "false", + }, + outputFormat: format, + }, + }, + }, + }; + let configMessage = + `X-Timestamp:${Date()}\r\n` + + "Content-Type:application/json; charset=utf-8\r\n" + + "Path:speech.config\r\n\r\n" + + JSON.stringify(configData); + console.info(`开始转换:${requestId}……`); + console.debug(`准备发送配置请求:${requestId}\n`, configMessage); + this.ws.send(configMessage, (configError) => { + if (configError) { + console.error(`配置请求发送失败:${requestId}\n`, configError); + } + + // 发送SSML消息 + let ssmlMessage = + `X-Timestamp:${Date()}\r\n` + + `X-RequestId:${requestId}\r\n` + + `Content-Type:application/ssml+xml\r\n` + + `Path:ssml\r\n\r\n` + + ssml; + console.debug(`准备发送SSML消息:${requestId}\n`, ssmlMessage); + this.ws.send(ssmlMessage, (ssmlError) => { + if (ssmlError) { + console.error(`SSML消息发送失败:${requestId}\n`, ssmlError); + } + }); + }); + }); + + // 收到请求,清除超时定时器 + if (this.timer) { + console.debug("收到新的请求,清除超时定时器"); + clearTimeout(this.timer); + } + // 设置定时器,超过10秒没有收到请求,主动断开连接 + console.debug("创建新的超时定时器"); + this.timer = setTimeout(() => { + if (this.ws && this.ws.readyState == WebSocket.OPEN) { + console.debug("已经 10 秒没有请求,主动关闭连接"); + this.ws.close(1000); + this.timer = null; + } + }, 10000); + + let data = await Promise.race([ + result, + new Promise((resolve, reject) => { + // 如果超过 20 秒没有返回结果,则清除请求并返回超时 + setTimeout(() => { + this.executorMap.delete(requestId); + this.bufferMap.delete(requestId); + reject("转换超时"); + }, 10000); + }), + ]); + console.info(`转换完成:${requestId}`); + console.info(`剩余 ${this.executorMap.size} 个任务`); + return data; + } +} + +const service = new Service(); +const retry = async function (fn, times, errorFn, failedMessage) { + let reason = { + message: failedMessage ?? "多次尝试后失败", + errors: [], + }; + for (let i = 0; i < times; i++) { + try { + return await fn(); + } catch (error) { + if (errorFn) { + errorFn(i, error); + } + reason.errors.push(error); + } + } + throw reason; +}; +const ra = async (text) => { + console.debug(`请求正文:${text}`); + try { + let format = "webm-24khz-16bit-mono-opus"; + if (Array.isArray(format)) { + throw `无效的音频格式:${format}`; + } + if (!FORMAT_CONTENT_TYPE.has(format)) { + throw `无效的音频格式:${format}`; + } + + let ssml = text; + if (ssml == null) { + throw `转换参数无效`; + } + let result = await retry( + async () => { + let result = await service.convert(ssml, format); + return result; + }, + 3, + (index, error) => { + console.warn(`第${index}次转换失败:${error}`); + }, + "服务器多次尝试后转换失败" + ); + return result; + // response.sendDate = true; + // response + // .status(200) + // .setHeader("Content-Type", FORMAT_CONTENT_TYPE.get(format)); + // response.end(result); + } catch (error) { + console.error(`发生错误, ${error.message}`); + // response.status(503).json(error); + } +}; + +// ra( +// ` 如果喜欢这个项目的话请点个 Star 吧。 ` +// ); + +module.exports = { ra }; diff --git a/main.js b/main.js index dfbc3344..d00fa292 100644 --- a/main.js +++ b/main.js @@ -13,8 +13,7 @@ const Store = require("electron-store"); const store = new Store(); const fs = require("fs"); const configDir = app.getPath("userData"); -const { randomBytes } = require("crypto"); -const { WebSocket } = require("ws"); +const { ra } = require("./edge-tts"); const dirPath = path.join(configDir, "uploads"); let mainWin; let readerWindow; @@ -251,291 +250,3 @@ app.on("window-all-closed", () => { app.on("open-file", (e, pathToFile) => { filePath = pathToFile; }); - -const FORMAT_CONTENT_TYPE = new Map([ - ["raw-16khz-16bit-mono-pcm", "audio/basic"], - ["raw-48khz-16bit-mono-pcm", "audio/basic"], - ["raw-8khz-8bit-mono-mulaw", "audio/basic"], - ["raw-8khz-8bit-mono-alaw", "audio/basic"], - - ["raw-16khz-16bit-mono-truesilk", "audio/SILK"], - ["raw-24khz-16bit-mono-truesilk", "audio/SILK"], - - ["riff-16khz-16bit-mono-pcm", "audio/x-wav"], - ["riff-24khz-16bit-mono-pcm", "audio/x-wav"], - ["riff-48khz-16bit-mono-pcm", "audio/x-wav"], - ["riff-8khz-8bit-mono-mulaw", "audio/x-wav"], - ["riff-8khz-8bit-mono-alaw", "audio/x-wav"], - - ["audio-16khz-32kbitrate-mono-mp3", "audio/mpeg"], - ["audio-16khz-64kbitrate-mono-mp3", "audio/mpeg"], - ["audio-16khz-128kbitrate-mono-mp3", "audio/mpeg"], - ["audio-24khz-48kbitrate-mono-mp3", "audio/mpeg"], - ["audio-24khz-96kbitrate-mono-mp3", "audio/mpeg"], - ["audio-24khz-160kbitrate-mono-mp3", "audio/mpeg"], - ["audio-48khz-96kbitrate-mono-mp3", "audio/mpeg"], - ["audio-48khz-192kbitrate-mono-mp3", "audio/mpeg"], - - ["webm-16khz-16bit-mono-opus", "audio/webm; codec=opus"], - ["webm-24khz-16bit-mono-opus", "audio/webm; codec=opus"], - - ["ogg-16khz-16bit-mono-opus", "audio/ogg; codecs=opus; rate=16000"], - ["ogg-24khz-16bit-mono-opus", "audio/ogg; codecs=opus; rate=24000"], - ["ogg-48khz-16bit-mono-opus", "audio/ogg; codecs=opus; rate=48000"], -]); - -class Service { - ws = null; - - executorMap; - bufferMap; - - timer = null; - - constructor() { - this.executorMap = new Map(); - this.bufferMap = new Map(); - } - - async connect() { - const connectionId = randomBytes(16).toString("hex").toLowerCase(); - let url = `wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1?TrustedClientToken=6A5AA1D4EAFF4E9FB37E23D68491D6F4&ConnectionId=${connectionId}`; - console.log(url); - let ws = new WebSocket(url, { - host: "speech.platform.bing.com", - origin: "chrome-extension://jdiccldimpdaibmpdkjnbmckianbfold", - headers: { - "User-Agent": - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44", - }, - }); - console.log(ws); - return new Promise((resolve, reject) => { - ws.on("open", () => { - resolve(ws); - }); - ws.on("close", (code, reason) => { - // 服务器会自动断开空闲超过30秒的连接 - this.ws = null; - if (this.timer) { - clearTimeout(this.timer); - this.timer = null; - } - for (let [key, value] of this.executorMap) { - value.reject(`连接已关闭: ${reason} ${code}`); - } - this.executorMap.clear(); - this.bufferMap.clear(); - console.info(`连接已关闭: ${reason} ${code}`); - }); - - ws.on("message", (message, isBinary) => { - let pattern = /X-RequestId:(?[a-z|0-9]*)/; - if (!isBinary) { - console.debug("收到文本消息:%s", message); - let data = message.toString(); - if (data.includes("Path:turn.start")) { - // 开始传输 - let matches = data.match(pattern); - let requestId = matches.groups.id; - console.debug(`开始传输:${requestId}……`); - this.bufferMap.set(requestId, Buffer.from([])); - } else if (data.includes("Path:turn.end")) { - // 结束传输 - let matches = data.match(pattern); - let requestId = matches.groups.id; - - let executor = this.executorMap.get(requestId); - if (executor) { - this.executorMap.delete(matches.groups.id); - let result = this.bufferMap.get(requestId); - executor.resolve(result); - console.debug(`传输完成:${requestId}……`); - } else { - console.debug(`请求已被丢弃:${requestId}`); - } - } - } else if (isBinary) { - let separator = "Path:audio\r\n"; - let data = message; - let contentIndex = data.indexOf(separator) + separator.length; - - let headers = data.slice(2, contentIndex).toString(); - let matches = headers.match(pattern); - let requestId = matches.groups.id; - - let content = data.slice(contentIndex); - - console.debug( - `收到音频片段:${requestId} Length: ${content.length}\n${headers}` - ); - - let buffer = this.bufferMap.get(requestId); - if (buffer) { - buffer = Buffer.concat([buffer, content]); - this.bufferMap.set(requestId, buffer); - } else { - console.debug(`请求已被丢弃:${requestId}`); - } - } - }); - ws.on("error", (error) => { - console.error(`连接失败: ${error}`); - reject(`连接失败: ${error}`); - }); - ws.on("ping", (data) => { - console.debug("ping %s", data); - }); - ws.on("pong", (data) => { - console.debug("pong %s", data); - }); - }); - } - - async convert(ssml, format) { - if (this.ws == null || this.ws.readyState != WebSocket.OPEN) { - console.info("准备连接服务器……"); - let connection = await this.connect(); - this.ws = connection; - console.info("连接成功!"); - } - const requestId = randomBytes(16).toString("hex").toLowerCase(); - let result = new Promise((resolve, reject) => { - // 等待服务器返回后这个方法才会返回结果 - this.executorMap.set(requestId, { - resolve, - reject, - }); - // 发送配置消息 - let configData = { - context: { - synthesis: { - audio: { - metadataoptions: { - sentenceBoundaryEnabled: "false", - wordBoundaryEnabled: "false", - }, - outputFormat: format, - }, - }, - }, - }; - let configMessage = - `X-Timestamp:${Date()}\r\n` + - "Content-Type:application/json; charset=utf-8\r\n" + - "Path:speech.config\r\n\r\n" + - JSON.stringify(configData); - console.info(`开始转换:${requestId}……`); - console.debug(`准备发送配置请求:${requestId}\n`, configMessage); - this.ws.send(configMessage, (configError) => { - if (configError) { - console.error(`配置请求发送失败:${requestId}\n`, configError); - } - - // 发送SSML消息 - let ssmlMessage = - `X-Timestamp:${Date()}\r\n` + - `X-RequestId:${requestId}\r\n` + - `Content-Type:application/ssml+xml\r\n` + - `Path:ssml\r\n\r\n` + - ssml; - console.debug(`准备发送SSML消息:${requestId}\n`, ssmlMessage); - this.ws.send(ssmlMessage, (ssmlError) => { - if (ssmlError) { - console.error(`SSML消息发送失败:${requestId}\n`, ssmlError); - } - }); - }); - }); - - // 收到请求,清除超时定时器 - if (this.timer) { - console.debug("收到新的请求,清除超时定时器"); - clearTimeout(this.timer); - } - // 设置定时器,超过10秒没有收到请求,主动断开连接 - console.debug("创建新的超时定时器"); - this.timer = setTimeout(() => { - if (this.ws && this.ws.readyState == WebSocket.OPEN) { - console.debug("已经 10 秒没有请求,主动关闭连接"); - this.ws.close(1000); - this.timer = null; - } - }, 10000); - - let data = await Promise.race([ - result, - new Promise((resolve, reject) => { - // 如果超过 20 秒没有返回结果,则清除请求并返回超时 - setTimeout(() => { - this.executorMap.delete(requestId); - this.bufferMap.delete(requestId); - reject("转换超时"); - }, 10000); - }), - ]); - console.info(`转换完成:${requestId}`); - console.info(`剩余 ${this.executorMap.size} 个任务`); - return data; - } -} - -const service = new Service(); -const retry = async function (fn, times, errorFn, failedMessage) { - let reason = { - message: failedMessage ?? "多次尝试后失败", - errors: [], - }; - for (let i = 0; i < times; i++) { - try { - return await fn(); - } catch (error) { - if (errorFn) { - errorFn(i, error); - } - reason.errors.push(error); - } - } - throw reason; -}; -const ra = async (text) => { - console.debug(`请求正文:${text}`); - try { - let format = "webm-24khz-16bit-mono-opus"; - if (Array.isArray(format)) { - throw `无效的音频格式:${format}`; - } - if (!FORMAT_CONTENT_TYPE.has(format)) { - throw `无效的音频格式:${format}`; - } - - let ssml = text; - if (ssml == null) { - throw `转换参数无效`; - } - let result = await retry( - async () => { - let result = await service.convert(ssml, format); - return result; - }, - 3, - (index, error) => { - console.warn(`第${index}次转换失败:${error}`); - }, - "服务器多次尝试后转换失败" - ); - return result; - // response.sendDate = true; - // response - // .status(200) - // .setHeader("Content-Type", FORMAT_CONTENT_TYPE.get(format)); - // response.end(result); - } catch (error) { - console.error(`发生错误, ${error.message}`); - // response.status(503).json(error); - } -}; - -// ra( -// ` 如果喜欢这个项目的话请点个 Star 吧。 ` -// ); diff --git a/public/lib/kookit/kookit.min.js b/public/lib/kookit/kookit.min.js index d8cffa7f..f7ff9f22 100644 --- a/public/lib/kookit/kookit.min.js +++ b/public/lib/kookit/kookit.min.js @@ -1,9 +1,9 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Kookit={})}(this,function(e){"use strict";function g(e,s,o,l){return new(o=o||Promise)(function(i,t){function r(e){try{a(l.next(e))}catch(e){t(e)}}function n(e){try{a(l.throw(e))}catch(e){t(e)}}function a(e){var t;e.done?i(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(r,n)}a((l=l.apply(e,s||[])).next())})}const y=e=>e?parseInt(e+""):0,p=t=>g(void 0,void 0,void 0,function*(){var e=yield t.load?(yield fetch(yield t.load()).then(e=>e.blob())).text():"";return i(e)}),i=e=>{var t=(new DOMParser).parseFromString(e,"text/html");let i=Array.from(t.querySelectorAll("img"));if(0===i.length)return e;for(let e=0;e{var i=document.createElement("iframe");i.style.width="100%",i.style.border="0",i.style.margin="0",i.style.padding="0",i.style.fontSize="100%",i.style.font="inherit",i.style.verticalAlign="baseline",e.innerHTML="",e.appendChild(i)},o=(i,r)=>{let e=document.getElementById("page-area");if(e){var n=e.getElementsByTagName("iframe")[0];if(n){let t=n.contentDocument;if(t){let e=t.createElement("style");e.id="default-style",e.textContent="p,empty-line{display: inherit;margin-block-start: inherit;margin-block-end: inherit;margin-inline-start: inherit;margin-inline-end: inherit;}body{margin: 0px}",t.head.appendChild(e),"scroll"!==r&&(n="double"===r?2:1,r=(r=Math.floor(i.clientWidth/12))%2==0?r:r-1,t.body.setAttribute("style",`width: auto;height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;max-width: inherit;column-fill: auto;column-gap: ${r}px;column-count: 12;column-width: ${(i.clientWidth-r)/n}px;`))}}}};class b{static getReaderConfig(e){return(JSON.parse(localStorage.getItem("readerConfig"))||{})[e]}static setReaderConfig(e,t){let i=JSON.parse(localStorage.getItem("readerConfig"))||{};i[e]=t,localStorage.setItem("readerConfig",JSON.stringify(i))}static getKookitConfig(e){return(JSON.parse(localStorage.getItem("kookitConfig"))||{})[e]}static setKookitConfig(e,t){let i=JSON.parse(localStorage.getItem("kookitConfig"))||{};i[e]=t,localStorage.setItem("kookitConfig",JSON.stringify(i))}static removeKookitConfig(){localStorage.removeItem("kookitConfig")}}let l=!1;const h=e=>Array.from(e.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,blockquote,address")),u=e=>e.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100),r=(c,d,h,u,f,m,p)=>g(void 0,void 0,void 0,function*(){var t="yes"===b.getReaderConfig("isSliding");let e=document.getElementById("page-area");if(e){var i,r,n,a,s,o,l=e.getElementsByTagName("iframe")[0];if(l){let e=l.contentDocument;e&&(l=(l=Math.floor(c.clientWidth/12))%2==0?l:l-1,0{i=i.filter(e=>e.href),t=window._.findLastIndex(i,{index:e,href:t});return"prev"===r?i[t-1]:i[t+1]},n=(r,n,a,s,o)=>g(void 0,void 0,void 0,function*(){var e=b.getKookitConfig("chapterTitle"),t=parseInt(b.getKookitConfig("chapterDocIndex")||"0"),i=b.getKookitConfig("chapterHref")||"";if(0!==t&&e){let e=c(t,i,n,"prev");e&&(b.setKookitConfig("text","prevChapter"),yield d(e.index,e.title,e.href,a,r,s,o),e.href&&-1g(void 0,void 0,void 0,function*(){let e=document.getElementById("page-area");if(e){var r,n,d,h,a=e.getElementsByTagName("iframe")[0];if(a){let i=a.contentDocument;if(i){i.body.innerHTML="",i.body.scrollTo(0,0),(-1===(s=o&&!s?window._.findLastIndex(c,{title:o}):s)||s>c.length-1)&&(s=0),i.body.innerHTML=(r=c,n=s,yield g(void 0,void 0,void 0,function*(){let t="";for(let e=n;e{e.onload=()=>{console.log("finished")}});let t=[];e.forEach(i=>{i.href.endsWith("null")||t.push(new Promise((e,t)=>{i.addEventListener("load",e)}))});try{yield Promise.race([Promise.all(t),new Promise((e,t)=>{setTimeout(()=>{t(new Error("Timeout"))},1e3)})])}catch(e){console.log(e)}b.setKookitConfig("chapterTitle",o),b.setKookitConfig("chapterHref",l),b.setKookitConfig("chapterDocIndex",s+""),b.setKookitConfig("percentage",s/c.length+""),b.setKookitConfig("text",""),d=u,h=f,yield g(void 0,void 0,void 0,function*(){let e=document.getElementById("page-area");if(e){let i=e.getElementsByTagName("iframe")[0];if(i)if("scroll"===h){var r=i.contentDocument;if(r){var n=r.body,a=r.documentElement;i.height=2*Math.max(n.scrollHeight,n.offsetHeight,a.clientHeight,a.scrollHeight,a.offsetHeight)+"px",i.scrolling="no",yield new Promise(e=>setTimeout(e,1e3));var s=n.lastElementChild,o=n.lastChild,l=n.getElementsByTagName("a"),c=n.getElementsByTagName("p"),r=n.getElementsByTagName("img"),a=n.getElementsByTagName("div"),n=l[l.length-1],l=c[c.length-1],r=c[r.length-1],a=a[a.length-1];let e=l||n||r||a;window._.isElement(n)&&window._.isElement(l)&&window._.isElement(a)&&(e=n.clientHeight+y(n.offsetTop)>l.clientHeight+y(l.offsetTop)?n:l,a.clientHeight+y(a.offsetTop)>e.clientHeight+y(e.offsetTop)&&(e=a)),window._.isElement(r)&&r.clientHeight+y(r.offsetTop)>e.clientHeight+y(e.offsetTop)&&(e=r);let t=0;if((s||e||o)&&(3!==o.nodeType||s||e)){if(3===o.nodeType&&document.createRange){let e=document.createRange();e.selectNodeContents(o),!e.getBoundingClientRect||(r=e.getBoundingClientRect())&&(t=r.bottom-r.top)}o=Math.max(window._.isElement(s)?s.clientHeight+y(s.offsetTop):0,window._.isElement(o)?o.clientHeight+y(o.offsetTop):0,window._.isElement(e)?e.clientHeight+y(e.offsetTop):0)+400+(3===o.nodeType?t:0);i.height=o+"px"}}}else i.height=d.clientHeight+"px"}}),((i,r,n)=>{let e=document.getElementById("page-area");if(e){var t=e.getElementsByTagName("iframe")[0];if(t){let e=t.contentDocument;if(e){var a,t=Math.floor(i.clientWidth/12),s=t%2==0?t:t-1;for(a of e.getElementsByTagName("img")){var o=a.parentElement;let e=0,t=0;n.startsWith("CB")&&"scroll"===r?t=o.offsetWidth:n.startsWith("CB")&&"single"===r?(e=i.clientHeight,t=i.clientWidth):a.width&&a.height?a.height/a.width>o.clientHeight/o.clientWidth?(e=o.clientHeight,t=e*a.width/a.height):(t=o.clientWidth,e=t*a.height/a.width):e=o&&o.clientWidth&&0g(void 0,void 0,void 0,function*(){let e=document.getElementById("page-area");if(e){var t=e.getElementsByTagName("iframe")[0];if(t){let n=t.contentDocument;if(n){let t=0,i=0,r=n.body;if(l){let e=h(n.body);var a=e.filter((e,t)=>u(e.textContent)&&(u(e.textContent)===u(l)||u(e.textContent)===window.ChineseS2T.t2s(u(l))||u(e.textContent)===window.ChineseS2T.s2t(u(l)))&&Math.abs(t-parseInt(c))<2);r=f(a[0],s),i=r?y(r.offsetLeft)-y(r.marginLeft):"prevChapter"===l?n.body.scrollWidth:0,t=r?y(r.offsetTop)-y(r.marginTop):0}else d&&-1{var i=Math.floor(t.clientWidth/12),i=i%2==0?i:i-1;return parseInt(y(e.offsetLeft)-y(e.marginLeft)+"")%((parseInt(t.clientWidth)+i)/2)==0?e:f(e.parentElement,t)},t=(a,s,o)=>g(void 0,void 0,void 0,function*(){if(!l){let e=document.getElementById("page-area");if(e){var r=e.getElementsByTagName("iframe")[0];if(r){r=r.contentDocument;if(r){let t=h(r.body);var r=t.filter(e=>m(a,e,s)&&(e.textContent||"").trim()),n=r[0];let i=0;for(let e=0;e{let e=b.getKookitConfig("chapterHref")||"",r=e.lastIndexOf("#"),n=e.substring(0,r),a=e.substring(r+1);for(let e=0;e-1)b.setKookitConfig("chapterHref",e)}}})(r,o),b.setKookitConfig("text",n&&n.textContent||""),b.setKookitConfig("count",i+""),l=!0,setTimeout(()=>{l=!1},100)}}}}}),w=(r,n,a,s,o)=>g(void 0,void 0,void 0,function*(){var e=parseInt(b.getKookitConfig("chapterDocIndex")||"0"),t=b.getKookitConfig("chapterHref")||"";let i=c(e,t,n,"next");i&&(yield d(i.index,i.title,i.href,a,r,s,o),i.href&&-1{var r,n=!1,a=t.getBoundingClientRect();return"scroll"!==i&&t.textContent&&t.textContent.trim()?n=-10<(r=a.left)&&r<=e.clientWidth:t.textContent&&t.textContent.trim()?n=(t=a.top)>=e.scrollTop&&t<=e.scrollTop+e.clientHeight:"scroll"!==i&&(n=0<=(a=a.left)&&a<=e.clientWidth),n};class a extends class{constructor(){this.callbacks={},this.callbacks.base={}}on(e,t){const i=this;if(void 0===e||""===e)return console.warn("wrong names"),!1;if(void 0===t)return console.warn("wrong callback"),!1;const r=this.resolveNames(e);return r.forEach(function(e){e=i.resolveName(e);i.callbacks[e.namespace]instanceof Object||(i.callbacks[e.namespace]={}),i.callbacks[e.namespace][e.value]instanceof Array||(i.callbacks[e.namespace][e.value]=[]),i.callbacks[e.namespace][e.value].push(t)}),this}off(e){const r=this;if(void 0===e||""===e)return console.warn("wrong name"),!1;const t=this.resolveNames(e);return t.forEach(function(e){var t=r.resolveName(e);if("base"!==t.namespace&&""===t.value)delete r.callbacks[t.namespace];else if("base"===t.namespace)for(const i in r.callbacks)r.callbacks[i]instanceof Object&&r.callbacks[i][t.value]instanceof Array&&(delete r.callbacks[i][t.value],0===Object.keys(r.callbacks[i]).length&&delete r.callbacks[i]);else r.callbacks[t.namespace]instanceof Object&&r.callbacks[t.namespace][t.value]instanceof Array&&(delete r.callbacks[t.namespace][t.value],0===Object.keys(r.callbacks[t.namespace]).length&&delete r.callbacks[t.namespace])}),this}trigger(e,t=[]){if(void 0===e||""===e)return console.warn("wrong name"),!1;const i=this;const r=t instanceof Array?t:[];let n=this.resolveNames(e);n=this.resolveName(n[0]),setTimeout(()=>{if("base"===n.namespace)for(const e in i.callbacks){if(i.callbacks[e]instanceof Object&&i.callbacks[e][n.value]instanceof Array&&i.callbacks[e][n.value])i.callbacks[e][n.value].forEach(function(e){e.apply(i,r)});else if(this.callbacks[n.namespace]instanceof Object&&i.callbacks[n.namespace][n.value]){if(""===n.value)return console.warn("wrong name"),this;i.callbacks[n.namespace][n.value].forEach(function(e){e.apply(i,r)})}return null}},100)}resolveNames(e){let t=e;return t=t.replace(/[^a-zA-Z0-9 ,/.]/g,""),t=t.replace(/[,/]+/g," "),t=t.split(" "),t}resolveName(e){const t={};var i=e.split(".");return t.original=e,t.value=i[0],t.namespace="base",1{let e=document.getElementById("page-area");if(e){var n=e.getElementsByTagName("iframe")[0];if(n){n=n.contentDocument;if(n){let e=h(n.body),t=e.filter(e=>m(i,e,r)&&(e.textContent||"").trim());return("scroll"!==r?t:e).filter(e=>"img"!==e.textContent).map(e=>e.textContent)}}}})(this.element,this.mode)}highlightNode(e,t){((i,r,n,a)=>{let e=document.getElementById("page-area");if(e){var s=e.getElementsByTagName("iframe")[0];if(s){s=s.contentDocument;if(s){let e=h(s.body),t=e.filter(e=>(e.getAttribute("style")===a&&e.setAttribute("style",""),m(i,e,r)&&(e.textContent||"").trim()&&e.textContent===n));0setTimeout(e,1e3))),{totalPage:parseInt(t.body.scrollWidth/t.body.clientWidth+"")+1,currentPage:parseInt(y(t.body.scrollLeft)/t.body.clientWidth+"")+1}}}})})}record(){return g(this,void 0,void 0,function*(){"yes"===b.getReaderConfig("isSliding")&&(yield new Promise(e=>setTimeout(e,1e3))),yield t(this.element,this.mode,this.flatChapter(this.chapterList))})}getPosition(){return{text:b.getKookitConfig("text"),chapterTitle:b.getKookitConfig("chapterTitle"),chapterDocIndex:b.getKookitConfig("chapterDocIndex"),chapterHref:b.getKookitConfig("chapterHref"),count:b.getKookitConfig("count"),percentage:b.getKookitConfig("percentage")}}setStyle(t){let e=document.getElementById("page-area");if(e){var i=e.getElementsByTagName("iframe")[0];if(i){let e=i.contentDocument;e&&e.body.setAttribute("style",t+e.body.getAttribute("style"))}}}}const x=(e,t=!1)=>{e=(new DOMParser).parseFromString(t?(e=>{let t="",i=e.split("\n");for(let e of i)if(S(e).slim()&&B(S(e).slim()))t+=`

${e}

`;else t+=`

${e}

`;if(t)return t;else return`

Title

${e}

`})(e):e,"text/html");let i=Array.from(e.querySelectorAll("h1,h2,h3,h4,h5,h6,title"));0===i.length&&(i=(e=>{let t=e.getElementsByTagName("*"),i=Array.from(t).filter(e=>{return e.childNodes.length===1&&e.childNodes[0].nodeType===Node.TEXT_NODE&&B(e.textContent)}),r=[];return i.forEach(e=>{const t=document.createElement("h1");t.innerHTML=e.innerText;e.parentNode.replaceChild(t,e);r.push(t)}),r})(e));for(let e=0;e{let t=[],i=e.split("
").filter(e=>e.trim()!==""),r=i.map(e=>{return A(e)||I(e)});return t=i.map((e,t)=>{return{index:t,title:r[t],text:e,href:"title"+t}})})(e.body.innerHTML),s={getCover:()=>""};return s.sections=a.map(e=>({id:e.index,load:()=>(e=>g(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([a[e].text],{type:"text/html"}))}))(e.index),unload:()=>{e.index}})),s.toc=a.map(e=>({label:e.title,href:"title"+e.index})),s.rendition={layout:"pre-paginated"},s.resolveHref=e=>({index:parseInt(e.substring(5,e.length))}),s.splitTOCHref=e=>[e,null],s.getTOCFragment=e=>e.documentElement,s};let T=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],C=["[","(","。",";",";"],k=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序"],L=[" "," ","、","·",".",":",":"];String.prototype.contains=function(e){return-1"="!==e&&"-"!==e&&"_"!==e&&"+"!==e).join("")};const S=e=>e.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100),B=e=>{return e&&(n=e,!(0-1r.startsWith(e)||r.startsWith(window.ChineseS2T.s2t(e))).length||e.startsWith("第")&&E(e)||e.startsWith("卷")&&(!(!/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test((i=e).substring(1,i.indexOf(" ")))&&!/^\d+$/.test(i.substring(1,i.indexOf(" "))))||(!(!/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test(i.substring(1,i.indexOf(" ")))&&!/^\d+$/.test(i.substring(1,i.indexOf(" "))))||!(!/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test(i.substring(1))&&!/^\d+$/.test(i.substring(1)))))||e.contains("第")&&e.lastIndexOf("第")<2&&E(e.substr(e.indexOf("第")))||(t=e,0-1{let i=!1;for(let e=0;e{const t=/([\s\S]*?)<\/h[1-6]>/.exec(e);return t?t[1].replace(/</g,"<").replace(/>/g,">"):""},I=e=>{const t=/([\s\S]*?)<\/title>/.exec(e);return t?t[1].replace(/</g,"<").replace(/>/g,">"):""};class M{constructor(e){this.book=e,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}getChapter(e){return g(this,void 0,void 0,function*(){return this.chapterList=e?yield Promise.all(e.map(t=>g(this,void 0,void 0,function*(){var e=t.href&&(yield this.book.resolveHref(t.href))?(yield this.book.resolveHref(t.href)).index:-1;return{title:t.label||e,href:t.href,index:e,subitems:t.subitems?yield this.getChapter(t.subitems):[]}}))):yield Promise.all(this.book.sections.map((e,t)=>g(this,void 0,void 0,function*(){return{title:e.label||t,href:e.href||"",index:t,subitems:e.subitems?yield this.getChapter(e.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return g(this,void 0,void 0,function*(){const i=this.flattenChapters.map(e=>e.index);return this.book.sections.map((e,t)=>-1<i.indexOf(t)?{title:this.flattenChapters[i.indexOf(t)].title,href:this.flattenChapters[i.indexOf(t)].href,text:e}:{title:"",href:"",text:e})})}flatChapter(t){let i=[];for(let e=0;e<t.length;e++)t[e].subitems&&0<t[e].subitems.length?(i.push(t[e]),i=i.concat(this.flatChapter(t[e].subitems))):i.push(t[e]);return i}getMetadata(){return new Promise((r,e)=>g(this,void 0,void 0,function*(){const t=this.book.metadata;try{var i=yield this.book.getCover(),e=new FileReader;e.readAsDataURL(i),e.onloadend=()=>{r({name:t.title,author:t.author[0].name,description:t.description,publisher:t.publisher,cover:e.result})}}catch(e){i=t.author&&t.author[0]&&t.author[0].name?t.author[0].name:t.author&&t.author[0]?t.author[0]:t.author||"";r({name:t.title,author:i,description:t.description,publisher:t.publisher,cover:""})}}))}}const R=(e,r)=>e.map((e,t,i)=>r(e,t,i)?t:null).filter(e=>null!=e),N=(r,e)=>[-1,...e,r.length].reduce(({xs:e,a:t},i)=>({xs:e?.concat([r.slice(t+1,i)])??[],a:i}),{}).xs,D=(e,t)=>e.slice(0,-1).concat([e[e.length-1].concat(t[0])]).concat(t.slice(1)),O=/\d/,H=/^epubcfi\((.*)\)$/,$=e=>e.replace(/[\^[\](),;=]/g,"^$&"),U=e=>H.test(e)?e:`epubcfi(${e})`,F=(e,t)=>R(e,([e])=>e===t),P=e=>{const t=[];let i;for(var[r,n]of e){if("/"===r)t.push({index:n});else{const a=t[t.length-1];if(":"===r)a.offset=n;else if("~"===r)a.temporal=n;else if("@"===r)a.spatial=(a.spatial??[]).concat(n);else if(";s"===r)a.side=n;else if("["===r){if("/"!==i||!n){a.text=(a.text??[]).concat(n);continue}a.id=n}}i=r}return t},z=e=>N(e,F(e,"!")).map(P),j=e=>{var t=(e=>{const t=[];let i,r,n="";var a=e=>(t.push(e),i=null,n=""),s=e=>(n+=e,r=!1);for(const o of Array.from(e.trim()).concat(""))if("^"!==o||r){if("!"===i)a(["!"]);else if(","===i)a([","]);else if("/"===i||":"===i){if(O.test(o)){s(o);continue}a([i,parseInt(n)])}else if("~"===i){if(O.test(o)||"."===o){s(o);continue}a(["~",parseFloat(n)])}else if("@"===i){if(":"===o){a(["@",parseFloat(n)]),i="@";continue}if(O.test(o)||"."===o){s(o);continue}a(["@",parseFloat(n)])}else{if("["===i){";"!==o||r?","!==o||r?"]"!==o||r?s(o):a(["[",n]):(a(["[",n]),i="["):(a(["[",n]),i=";");continue}if(i?.startsWith(";")){"="!==o||r?";"!==o||r?"]"!==o||r?s(o):a([i,n]):(a([i,n]),i=";"):(i=`;${n}`,n="");continue}}"/"!==o&&":"!==o&&"~"!==o&&"@"!==o&&"["!==o&&"!"!==o&&","!==o||(i=o)}else r=!0;return t})((i=e).match(H)?.[1]??i),e=F(t,",");if(!e.length)return z(t);var[i,t,e]=N(t,e).map(z);return{parent:i,start:t,end:e}},W=({index:e,id:t,offset:i,temporal:r,spatial:n,text:a,side:s})=>{var o=s?`;s=${s}`:"";return`/${e}`+(t?`[${$(t)}${o}]`:"")+(null!=i&&e%2?`:${i}`:"")+(r?`~${r}`:"")+(n?`@${n.join(":")}`:"")+(a||!t&&s?"["+(a?.map($)?.join(",")??"")+o+"]":"")},X=e=>e.parent?[e.parent,e.start,e.end].map(X).join(","):e.map(e=>e.map(W).join("")).join("!"),q=e=>U(X(e)),K=(e,t)=>"string"==typeof e?q(K(j(e),t)):e.parent?D(e.parent,e[t?"end":"start"]):e,Z=({nodeType:e})=>3===e||4===e,G=({nodeType:e})=>1===e,_=e=>{const t=Array.from(e.childNodes).filter(e=>Z(e)||G(e)).reduce((e,t)=>{let i=e[e.length-1];return i?Z(t)?Array.isArray(i)?i.push(t):Z(i)?e[e.length-1]=[i,t]:e.push(t):G(i)?e.push(null,t):e.push(t):e.push(t),e},[]);return G(t[0])&&t.unshift("first"),G(t[t.length-1])&&t.push("last"),t.unshift("before"),t.push("after"),t},J=(e,t)=>e?_(e)[t]:null,V=(e,t)=>{var i,r=t[t.length-1]["id"];if(r){r=e.ownerDocument.getElementById(r);if(r)return{node:r,offset:0}}for({index:i}of t){var n=J(e,i);if("first"===n)return{node:e.firstChild??e};if("last"===n)return{node:e.lastChild??e};if("before"===n)return{node:e,before:!0};if("after"===n)return{node:e,after:!0};e=n}var a=t[t.length-1]["offset"];if(!Array.isArray(e))return{node:e,offset:a};let s=0;for(const l of e){var o=l.nodeValue["length"];if(s+o>=a)return{node:l,offset:a-s};s+=o}},Y=(t,i)=>{var{parentNode:e,id:r}=t;const n=_(e);var a=n.findIndex(e=>Array.isArray(e)?e.some(e=>e===t):e===t),s=n[a];if(Array.isArray(s)){let e=0;for(const o of s){if(o===t){e+=i;break}e+=o.nodeValue.length}i=e}a={id:r,index:a,offset:i};return e!==t.ownerDocument.documentElement?Y(e).concat(a):[a]},Q=(e,t)=>V(e.documentElement,K(t)).node,ee={CONTAINER:"urn:oasis:names:tc:opendocument:xmlns:container",XHTML:"http://www.w3.org/1999/xhtml",OPF:"http://www.idpf.org/2007/opf",EPUB:"http://www.idpf.org/2007/ops",DC:"http://purl.org/dc/elements/1.1/",DCTERMS:"http://purl.org/dc/terms/",ENC:"http://www.w3.org/2001/04/xmlenc#",NCX:"http://www.daisy.org/z3986/2005/ncx/",XLINK:"http://www.w3.org/1999/xlink",SMIL:"http://www.w3.org/ns/SMIL"},te={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},ie=e=>e.toLowerCase().replace(/[-:](.)/g,(e,t)=>t.toUpperCase()),re=e=>e?e.trim().replace(/\s{2,}/g," "):"",ne=(t,i,e)=>e?e=>e.getAttribute(t)?.split(/\s/)?.includes(i):"function"==typeof i?e=>i(e.getAttribute(t)):e=>e.getAttribute(t)===i,ae=(...e)=>t=>t?Object.fromEntries(e.map(e=>[ie(e),t.getAttribute(e)])):null,se=e=>re(e?.textContent),oe=(e,i)=>{e=e.lookupNamespaceURI(null)===i||e.lookupPrefix(i);const r=e?(e,t)=>e=>e.namespaceURI===i&&e.localName===t:(e,t)=>e=>e.localName===t;return{$:(e,t)=>[...e.children].find(r(e,t)),$$:(e,t)=>[...e.children].filter(r(e,t)),$$$:e?(e,t)=>[...e.getElementsByTagNameNS(i,t)]:(e,t)=>[...e.getElementsByTagName(i,t)]}},le=(t,e)=>{try{if(e.includes(":"))return new URL(t,e);var i="whatever://whatever/";return decodeURI(new URL(t,i+e).href.replace(i,""))}catch(e){return console.warn(e),t}},ce=e=>/^(?!blob)\w+:/i.test(e),de=async(e,t,i)=>{const r=[];e.replace(t,(...e)=>(r.push(e),null));const n=[];for(const a of r)n.push(await i(...a));return e.replace(t,()=>n.shift())},he=e=>e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&");var ue={attrs:["dir","xml:lang"]},fe={name:"alternate-script",many:!0,...ue,props:["file-as"]},me={many:!0,...ue,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",fe]};const pe=[{name:"title",many:!0,...ue,props:["title-type","display-seq","file-as",fe]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...me},{name:"contributor",...me},{name:"publisher",...ue,props:["file-as",fe]},{name:"description",...ue,props:[fe]},{name:"rights",...ue,props:[fe]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...ue,props:["term","authority",fe]},{name:"belongs-to-collection",type:"meta",many:!0,...ue,props:["collection-type","group-position","dcterms:identifier","file-as",fe,{name:"belongs-to-collection",recursive:!0}]}],ge=(e,a=e=>e)=>{const{$:s,$$:i,$$$:t}=oe(e,ee.XHTML),r=n=>e=>{const t=s(e,"a")??s(e,"span");var i=s(e,"ol"),e=(e=t?.getAttribute("href"))?decodeURI(a(e)):null;const r={label:se(t)||t?.getAttribute("title"),href:e,subitems:o(i)};return n&&(r.type=t?.getAttributeNS(ee.EPUB,"type")?.split(/\s/)),r},o=(e,t)=>e?i(e,"li").map(r(t)):null;var n=(e,t)=>o(s(e,"ol"),t);let l=null,c=null,d=null,h=[];for(const u of t(e,"nav")){const f=u.getAttributeNS(ee.EPUB,"type")?.split(/\s/)??[];f.includes("toc")?l??=n(u):f.includes("page-list")?c??=n(u):f.includes("landmarks")?d??=n(u,!0):h.push({label:se(u.firstElementChild),type:f,list:n(u)})}return{toc:l,pageList:c,landmarks:d,others:h}},ye=(i,a=e=>e)=>{const{$:s,$$:o}=oe(i,ee.NCX),l=e=>{var t=s(e,"navLabel");const i=s(e,"content");var r=se(t),t=(t=i.getAttribute("src"))?decodeURI(a(t)):null;if("navPoint"!==e.localName)return{label:r,href:t};{const n=o(e,"navPoint");return{label:r,href:t,subitems:n.length?n.map(l):null}}},r=(e,t)=>o(e,t).map(l);var e=(e,t)=>{e=s(i.documentElement,e);return e?r(e,t):null};return{toc:e("navMap","navPoint"),pageList:e("pageList","pageTarget"),others:o(i.documentElement,"navList").map(e=>({label:se(s(e,"navLabel")),list:r(e,"navTarget")}))}},be=e=>{if(e){var t=e.split(":").map(e=>parseFloat(e));if(3===t.length){var[i,r,n]=t;return 60*i*60+60*r+n}if(2===t.length){var[t,a]=t;return 60*t+a}var[a,e]=e.split(/(?=[^\d.])/);return parseFloat(a)*("h"===e?3600:"min"===e?60:"ms"===e?.001:1)}},ve=(e,r=e=>e)=>{const{$:n,$$$:t}=oe(e,ee.SMIL);return t(e,"par").map(e=>{var t=n(e,"text")?.getAttribute("src")?.split("#")?.[1];const i=n(e,"audio");return i?{id:t,audio:{src:(e=i.getAttribute("src"))?decodeURI(r(e)):null,clipBegin:be(i.getAttribute("clipBegin")),clipEnd:be(i.getAttribute("clipEnd"))}}:{id:t}})},we=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,xe=e=>se(e.getElementById(e.documentElement.getAttribute("unique-identifier"))??e.getElementsByTagNameNS(ee.DC,"identifier")[0]),Te=async(e,t,i)=>{const r=new Uint8Array(await i.slice(0,t).arrayBuffer());t=Math.min(t,r.length);for(var n=0;n<t;n++)r[n]=r[n]^e[n%e.length];return new Blob([r,i.slice(t)],{type:i.type})},Ce=(t=async e=>{e=(new TextEncoder).encode(e),e=await globalThis.crypto.subtle.digest("SHA-1",e);return new Uint8Array(e)})=>({"http://www.idpf.org/2008/embedding":{key:e=>t(xe(e).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(e,t)=>Te(e,1040,t)},"http://ns.adobe.com/pdf/enc#RC":{key:e=>{const i=(e=>{for(const i of e.getElementsByTagNameNS(ee.DC,"identifier")){var[t]=se(i).split(":").slice(-1);if(we.test(t))return t}return""})(e).replaceAll("-","");return Uint8Array.from({length:16},(e,t)=>parseInt(i.slice(2*t,2*t+2),16))},decode:(e,t)=>Te(e,1024,t)}});class ke{#uris=new Map;#decoders=new Map;#algorithms;constructor(e){this.#algorithms=e}async init(e,t){var i,r;if(e)for({algorithm:i,uri:r}of Array.from(e.getElementsByTagNameNS(ee.ENC,"EncryptedData"),e=>({algorithm:e.getElementsByTagNameNS(ee.ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:e.getElementsByTagNameNS(ee.ENC,"CipherReference")[0]?.getAttribute("URI")}))){if(!this.#decoders.has(i)){const n=this.#algorithms[i];if(!n){console.warn("Unknown encryption algorithm");continue}const a=await n.key(t);this.#decoders.set(i,e=>n.decode(a,e))}this.#uris.set(r,i)}}getDecoder(e){return this.#decoders.get(this.#uris.get(e))??(e=>e)}}class Le{constructor({opf:e,resolveHref:r}){this.opf=e;const{$:t,$$:i,$$$:n}=oe(e,ee.OPF);var a=t(e.documentElement,"manifest");const s=t(e.documentElement,"spine"),o=i(s,"itemref");this.manifest=i(a,"item").map(ae("href","id","media-type","properties","media-overlay")).map(e=>(e.href=r(e.href),e.properties=e.properties?.split(/\s/),e)),this.spine=o.map(ae("idref","id","linear","properties")).map(e=>(e.properties=e.properties?.split(/\s/),e)),this.pageProgressionDirection=s.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID(s.getAttribute("toc"))??this.manifest.find(e=>e.mediaType===te.NCX))?.href;a=t(e.documentElement,"guide");a&&(this.guide=i(a,"reference").map(ae("type","title","href")).map(({type:e,title:t,href:i})=>({label:t,type:e.split(/\s/),href:r(i)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID(n(e,"meta").find(ne("name","cover"))?.getAttribute("content"))??this.getItemByHref(this.guide?.find(e=>e.type.includes("cover"))?.href),this.cfis=(e=>{const t=[];var i,r,n=e[0]["parentNode"];const a=Y(n);for([i,r]of _(n).entries()){var s=e[t.length];r===s&&t.push(q([a.concat({id:s.id,index:i})]))}return t})(o)}getItemByID(t){return this.manifest.find(e=>e.id===t)}getItemByHref(t){return this.manifest.find(e=>e.href===t)}getItemByProperty(t){return this.manifest.find(e=>e.properties?.includes(t))}resolveCFI(e){const t=j(e),i=(t.parent??t).shift();let r=Q(this.opf,i);r&&"idref"!==r.nodeName&&(i.at(-1).id=null,r=Q(this.opf,i));const n=r?.getAttribute("idref");return{index:this.spine.findIndex(e=>e.idref===n),anchor:e=>((e,t)=>{var i=K(t),r=K(t,!0),t=e.documentElement,i=V(t,i[0]),r=V(t,r[0]);const n=e.createRange();return i.before?n.setStartBefore(i.node):i.after?n.setStartAfter(i.node):n.setStart(i.node,i.offset),r.before?n.setEndBefore(r.node):r.after?n.setEndAfter(r.node):n.setEnd(r.node,r.offset),n})(e,t)}}}class Se{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:e,loadBlob:t,resources:i}){this.loadText=e,this.loadBlob=t,this.manifest=i.manifest,this.assets=i.manifest}createURL(e,t,i,r){if(!t)return"";i=URL.createObjectURL(new Blob([t],{type:i}));if(this.#cache.set(e,i),this.#refCount.set(e,1),r){const n=this.#children.get(r);n?n.push(e):this.#children.set(r,[e])}return i}ref(e,t){const i=this.#children.get(t);return i?.includes(e)||(this.#refCount.set(e,this.#refCount.get(e)+1),i?i.push(e):this.#children.set(t,[e])),this.#cache.get(e)}unref(e){if(this.#refCount.has(e)){var t=this.#refCount.get(e)-1;if(t<1){URL.revokeObjectURL(this.#cache.get(e)),this.#cache.delete(e),this.#refCount.delete(e);const i=this.#children.get(e);if(i)for(;i.length;)this.unref(i.pop());this.#children.delete(e)}else this.#refCount.set(e,t)}}async loadItem(e,t=[]){if(!e)return null;const{href:i,mediaType:r}=e;var n=te.JS.test(e.mediaType);if(n&&!this.allowScript)return null;var a=t.at(-1);return this.#cache.has(i)?this.ref(i,a):(n||[te.XHTML,te.HTML,te.CSS,te.SVG].includes(r))&&t.every(e=>e!==i)?this.loadReplaced(e,t):this.createURL(i,await this.loadBlob(i),r,a)}async loadHref(e,t,i=[]){if(ce(e))return e;const r=le(e,t);var n=this.manifest.find(e=>e.href===r);return n?this.loadItem(n,i.concat(t)):e}async loadReplaced(e,n=[]){const{href:a,mediaType:i}=e;var r,s=n.at(-1),o=await this.loadText(a);if(!o)return null;if([te.XHTML,te.HTML,te.SVG].includes(i)){let t=(new DOMParser).parseFromString(o,i);if(i===te.XHTML&&t.querySelector("parsererror")&&(console.warn(t.querySelector("parsererror").innerText),e.mediaType=te.HTML,t=(new DOMParser).parseFromString(o,e.mediaType)),[te.XHTML,te.SVG].includes(e.mediaType)){let e=t.firstChild;for(;e instanceof ProcessingInstruction;)e.data&&(r=await de(e.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(e,t,i,r)=>this.loadHref(i,a,n).then(e=>`${t}${e}${r}`)),e.replaceWith(t.createProcessingInstruction(e.target,r))),e=e.nextSibling}var l=async(e,t)=>e.setAttribute(t,await this.loadHref(e.getAttribute(t),a,n));for(const d of t.querySelectorAll("link[href]"))await l(d,"href");for(const h of t.querySelectorAll("[src]"))await l(h,"src");for(const u of t.querySelectorAll("[poster]"))await l(u,"poster");for(const f of t.querySelectorAll("object[data]"))await l(f,"data");for(const m of t.querySelectorAll("[*|href]:not([href]"))m.setAttributeNS(ee.XLINK,"href",await this.loadHref(m.getAttributeNS(ee.XLINK,"href"),a,n));for(const p of t.querySelectorAll("style"))p.textContent&&(p.textContent=await this.replaceCSS(p.textContent,a,n));for(const g of t.querySelectorAll("[style]"))g.setAttribute("style",await this.replaceCSS(g.getAttribute("style"),a,n));const c=(new XMLSerializer).serializeToString(t);return this.createURL(a,c,e.mediaType,s)}const c=i===te.CSS?await this.replaceCSS(o,a,n):await this.replaceString(o,a,n);return this.createURL(a,c,i,s)}async replaceCSS(e,i,r=[]){e=await de(e,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(e,t)=>this.loadHref(t,i,r).then(e=>`url("${e}")`));const t=await de(e,/@import\s*["']([^"'\n]*?)["']/gi,(e,t)=>this.loadHref(t,i,r).then(e=>`@import "${e}"`)),n=window?.innerWidth??800,a=window?.innerHeight??600;return t.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(e,t)=>parseFloat(t)*n/100+"px").replace(/(\d*\.?\d+)vh/gi,(e,t)=>parseFloat(t)*a/100+"px").replace(/page-break-(after|before|inside)/gi,(e,t)=>`-webkit-column-break-${t}`)}replaceString(e,s,t=[]){const o=new Map,i=this.assets.map(e=>{if(e.href!==s){var t=((e,t)=>{if(!e)return t;const i=e.replace(/\/$/,"").split("/"),r=t.replace(/\/$/,"").split("/");t=(i.length>r.length?i:r).findIndex((e,t)=>i[t]!==r[t]);return t<0?"":Array(i.length-t).fill("..").concat(r.slice(t)).join("/")})(s.slice(0,s.lastIndexOf("/")+1),e.href),i=encodeURI(t),r="/"+e.href,n=encodeURI(r),n=new Set([t,i,r,n]);for(const a of n)o.set(a,e);return Array.from(n)}}).flat().filter(e=>e);if(!i.length)return e;var r=new RegExp(i.map(he).join("|"),"g");return de(e,r,async e=>this.loadItem(o.get(e.replace(/^\//,"")),t.concat(s)))}unloadItem(e){this.unref(e?.href)}}class Be{parser=new DOMParser;#encryption;constructor({loadText:e,loadBlob:t,getSize:i,sha1:r}){this.loadText=e,this.loadBlob=t,this.getSize=i,this.#encryption=new ke(Ce(r))}#parseXML(e){return e?this.parser.parseFromString(e,te.XML):null}async#loadXML(e){return this.#parseXML(await this.loadText(e))}async init(){const e=await this.#loadXML("META-INF/container.xml");if(!e)throw new Error("Failed to load container file");var t=Array.from(e.getElementsByTagNameNS(ee.CONTAINER,"rootfile"),ae("full-path","media-type")).filter(e=>"application/oebps-package+xml"===e.mediaType);if(!t.length)throw new Error("No package document defined in container");const i=t[0].fullPath;var r=await this.#loadXML(i);if(!r)throw new Error("Failed to load package document");t=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init(t,r),this.resources=new Le({opf:r,resolveHref:e=>le(e,i)});const a=new Se({loadText:this.loadText,loadBlob:e=>Promise.resolve(this.loadBlob(e)).then(this.#encryption.getDecoder(e)),resources:this.resources});this.sections=this.resources.spine.map((e,t)=>{var{idref:i,linear:r,properties:e=[]}=e;const n=this.resources.getItemByID(i);return n?{id:this.resources.getItemByID(i)?.href,load:()=>a.loadItem(n),unload:()=>a.unloadItem(n),createDocument:()=>this.loadDocument(n),size:this.getSize(n.href),cfi:this.resources.cfis[t],linear:r,pageSpread:(e=>{for(const t of e){if("page-spread-left"===t||"rendition:page-spread-left"===t)return"left";if("page-spread-right"===t||"rendition:page-spread-right"===t)return"right";if("rendition:page-spread-center"===t)return"center"}})(e),resolveHref:e=>le(e,n.href),loadMediaOverlay:()=>this.loadMediaOverlay(n)}:(console.warn(`Could not find item with ID "${i}" in manifest`),null)}).filter(e=>e);const{navPath:n,ncxPath:s}=this.resources;if(n)try{var o=ge(await this.#loadXML(n),e=>le(e,n));this.toc=o.toc,this.pageList=o.pageList,this.landmarks=o.landmarks}catch(e){console.warn(e)}if(!this.toc&&s)try{var l=ye(await this.#loadXML(s),e=>le(e,s));this.toc=l.toc,this.pageList=l.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:c,rendition:d,media:h}=(e=>{const{$:t,$$:i}=oe(e,ee.OPF),r=t(e.documentElement,"metadata"),a=Array.from(r.children),l=(s,t)=>{if(!t)return null;const{props:e=[],attrs:i=[]}=s,r=se(t);if(!e.length&&!i.length)return r;var n=t.getAttribute("id");const o=n?a.filter(ne("refines","#"+n)):[];return Object.fromEntries([["value",r]].concat(e.map(e=>{var{many:t,recursive:i}=e,r="string"==typeof e?e:e.name,n=ne("property",r);const a=i?s:e;return[ie(r),t?o.filter(n).map(e=>l(a,e)):l(a,o.find(n))]})).concat(i.map(e=>[ie(e),t.getAttribute(e)])))},s=a.filter(ne("refines",null));e=t=>Object.fromEntries(i(r,"meta").filter(ne("property",e=>e?.startsWith(t))).map(e=>[e.getAttribute("property").replace(t,""),se(e)]));return{metadata:Object.fromEntries(pe.map(t=>{const{type:e,name:i,many:r}=t;var n="meta"===e?e=>e.namespaceURI===ee.OPF&&e.getAttribute("property")===i:e=>e.namespaceURI===ee.DC&&e.localName===i;return[ie(i),r?s.filter(n).map(e=>l(t,e)):l(t,s.find(n))]})),rendition:e("rendition:"),media:e("media:")}})(r);this.rendition=d,this.media=h,h.duration=be(h.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=c;l=c?.title?.[0];this.metadata={title:l?.value,sortAs:l?.fileAs,language:c?.language,identifier:xe(r),description:c?.description?.value,publisher:c?.publisher?.value,published:c?.date,modified:c?.dctermsModified,subject:c?.subject?.filter(({value:e,code:t})=>e||t)?.map(({value:e,code:t,scheme:i})=>({name:e,code:t,scheme:i})),rights:c?.rights?.value};const u={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"};r=i=>e=>{var t=[...new Set(e.role?.map(({value:e,scheme:t})=>(t&&"marc:relators"!==t?null:u[e])??i))],e={name:e.value,sortAs:e.fileAs};return[t.length?t:[i],e]};return c?.creator?.map(r("author"))?.concat(c?.contributor?.map?.(r("contributor")))?.forEach(([e,t])=>e.forEach(e=>{this.metadata[e]?this.metadata[e].push(t):this.metadata[e]=[t]})),this}async loadDocument(e){var t=await this.loadText(e.href);return this.parser.parseFromString(t,e.mediaType)}async loadMediaOverlay(e){e=e.mediaOverlay;if(!e)return null;const t=this.resources.getItemByID(e);e=await this.#loadXML(t.href);return ve(e,e=>le(e,t.href))}resolveCFI(e){return this.resources.resolveCFI(e)}resolveHref(e){const[t,i]=e.split("#"),r=this.resources.getItemByHref(decodeURI(t));return r?{index:this.resources.spine.findIndex(({idref:e})=>e===r.id),anchor:i?e=>((e,t)=>e.getElementById(t)??e.querySelector(`[name="${CSS.escape(t)}"]`))(e,i):()=>0}:null}splitTOCHref(e){return e?.split("#")??[]}getTOCFragment(e,t){return e.getElementById(t)??e.querySelector(`[name="${CSS.escape(t)}"]`)}isExternal(e){return ce(e)}async getCover(){var e=this.resources?.cover;return e?.href?new Blob([await this.loadBlob(e.href)],{type:e.mediaType}):null}async getCalibreBookmarks(){const e=await this.loadText("META-INF/calibre_bookmarks.txt");var t="encoding=json+base64:";if(e?.startsWith(t)){t=atob(e.slice(t.length));return JSON.parse(t)}}}const Ee=e=>{if(!e)return"";const t=document.createElement("textarea");return t.innerHTML=e,t.value},Ae={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},Ie={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},Me={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},Re={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},Ne={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},De={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},Oe={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},He={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},$e={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},Ue={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},Fe={magic:[0,4,"string"],numEntries:[8,4,"uint"]},Pe={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},ze={1252:"windows-1252",65001:"utf-8"},je={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},We={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},Xe=(e,t)=>{const i=new e.constructor(e.length+t.length);return i.set(e),i.set(t,e.length),i},qe=(e,t,i)=>{const r=new e.constructor(e.length+t.length+i.length);return r.set(e),r.set(t,e.length),r.set(i,e.length+t.length),r},Ke=new TextDecoder,Ze=e=>Ke.decode(e),Ge=e=>{if(e){var t=e.byteLength,t=4===t?"getUint32":2===t?"getUint16":"getUint8";return new DataView(e)[t](0)}},_e=(e,n)=>Object.fromEntries(Array.from(Object.entries(e)).map(([e,[t,i,r]])=>[e,("string"===r?Ze:Ge)(n.slice(t,t+i))])),Je=e=>new TextDecoder(ze[e]),Ve=(e,t=0)=>{let i=0,r=0;for(const n of e.subarray(t,t+4))if(i=i<<7|(127&n)>>>0,r++,128&n)break;return{value:i,length:r}},Ye=e=>{let t=0;for(;0<e;e>>=1)1==(1&e)&&t++;return t},Qe=e=>{let t=0;for(;0==(1&e);)e>>=1,t++;return t},et=t=>{let i=[];for(let e=0;e<t.length;e++){var r=t[e];if(0===r)i.push(0);else if(r<=8)for(const o of t.subarray(e+1,(e+=r)+1))i.push(o);else if(r<=127)i.push(r);else if(r<=191){var n=r<<8|t[1+e++],a=(16383&n)>>>3,s=3+(7&n);for(let e=0;e<s;e++)i.push(i[i.length-a])}else i.push(32,128^r)}return Uint8Array.from(i)},tt=async(t,i)=>{const r=await i(t.huffcdic),{magic:e,offset1:n,offset2:a}=_e($e,r);if("HUFF"!==e)throw new Error("Invalid HUFF record");const h=Array.from({length:256},(e,t)=>n+4*t).map(e=>Ge(r.slice(e,e+4))).map(e=>[128&e,31&e,e>>>8]),u=[null].concat(Array.from({length:32},(e,t)=>a+8*t).map(e=>[Ge(r.slice(e,e+4)),Ge(r.slice(e+4,e+8))])),f=[];for(let e=1;e<t.numHuffcdic;e++){const p=await i(t.huffcdic+e);var s=_e(Ue,p);if("CDIC"!==s.magic)throw new Error("Invalid CDIC record");var o=Math.min(1<<s.codeLength,s.numEntries-f.length);const g=p.slice(s.length);for(let e=0;e<o;e++){var l=Ge(g.slice(2*e,2*e+2)),c=Ge(g.slice(l,l+2)),d=32768&c,c=new Uint8Array(g.slice(l+2,l+2+(32767&c)));f.push([c,d])}}const m=s=>{let o=new Uint8Array;var l=8*s.byteLength;for(let a=0;a<l;){var c=Number(((t,i)=>{var e=i+32,r=e>>3;let n=0n;for(let e=i>>3;e<=r;e++)n=n<<8n|BigInt(t[e]??0);return n>>8n-BigInt(7&e)&0xffffffffn})(s,a));let[e,t,i]=h[c>>>24];if(!e){for(;c>>>32-t<u[t][0];)t+=1;i=u[t][1]}if((a+=t)>l)break;var d=i-(c>>>32-t);let[r,n]=f[d];n||(r=m(r),f[d]=[r,!0]),o=Xe(o,r)}return o};return m},it=async(t,i)=>{const e=await i(t),r=_e(Oe,e);if("INDX"!==r.magic)throw new Error("Invalid INDX record");const n=Je(r.encoding),a=e.slice(r.length);var s=_e(He,a);if("TAGX"!==s.magic)throw new Error("Invalid TAGX section");var o=(s.length-12)/4,l=Array.from({length:o},(e,t)=>new Uint8Array(a.slice(12+4*t,12+4*t+4)));const c={};let d=0;for(let e=0;e<r.numCncx;e++){const H=await i(t+r.numRecords+e+1);var h=new Uint8Array(H);for(let e=0;e<h.byteLength;){var u=e,{value:f,length:m}=Ve(h,e);e+=m;m=H.slice(e,e+f);e+=f,c[d+u]=n.decode(m)}d+=65536}const p=[];for(let e=0;e<r.numRecords;e++){const $=await i(t+1+e);var g=new Uint8Array($);const r=_e(Oe,$);if("INDX"!==r.magic)throw new Error("Invalid INDX record");for(let i=0;i<r.numRecords;i++){var y=r.idxt+4+2*i,b=Ge($.slice(y,y+2)),v=Ge($.slice(b,b+1)),y=Ze($.slice(b+1,b+1+v));const U=[];var w,x,T,C,k,L,S,B,E,A,I,M=b+1+v;let e=0,t=M+s.numControlBytes;for([w,x,T,C]of l)1&C?e++:(S=M+e,(k=Ge($.slice(S,S+1))&T)===T?1<Ye(T)?({value:L,length:S}=Ve(g,t),U.push([w,null,L,x]),t+=S):U.push([w,1,null,x]):U.push([w,k>>Qe(T),null,x]));const F={};for([B,E,A,I]of U){const P=[];if(null!=E)for(let e=0;e<E*I;e++){var{value:R,length:N}=Ve(g,t);P.push(R),t+=N}else{let e=0;for(;e<A;){var{value:D,length:O}=Ve(g,t);P.push(D),t+=O,e+=O}}F[B]=P}p.push({name:y,tagMap:F})}}return{table:p,cncx:c}};class rt extends class{#file;#offsets;pdb;async open(e){this.#file=e;var t=_e(Ie,await e.slice(0,78).arrayBuffer());this.pdb=t;const i=await e.slice(78,78+8*t.numRecords).arrayBuffer();this.#offsets=Array.from({length:t.numRecords},(e,t)=>Ge(i.slice(8*t,8*t+4))).map((e,t,i)=>[e,i[t+1]])}loadRecord(e){e=this.#offsets[e];if(!e)throw new RangeError("Record index out of bounds");return this.#file.slice(...e).arrayBuffer()}async loadMagic(e){e=this.#offsets[e][0];return Ze(await this.#file.slice(e,e+4).arrayBuffer())}}{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:e}){super(),this.unzlib=e}async open(e){await super.open(e),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let t=8<=this.headers.mobi.version;if(!t){e=this.headers.exth?.boundary;if(e<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(e)),this.#start=e,t=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),new(t?ut:st)(this).init()}#getHeaders(e){var t=_e(Me,e);const i=_e(Re,e);if("MOBI"!==i.magic)throw new Error("Missing MOBI header");var{titleOffset:r,titleLength:n,localeLanguage:a,localeRegion:s}=i;i.title=e.slice(r,r+n);a=We[a];i.language=a?.[s>>2]??a?.[0];a=64&i.exthFlag?((t,e)=>{var{magic:i,count:r}=_e(De,t);if("EXTH"!==i)throw new Error("Invalid EXTH header");const n=Je(e),a={};let s=12;for(let e=0;e<r;e++){var o,l,c,d=Ge(t.slice(s,s+4)),h=Ge(t.slice(s+4,s+8));d in je&&([o,l,c]=je[d],d=t.slice(s+8,s+h),d="uint"===l?Ge(d):n.decode(d),c?(a[o]??=[],a[o].push(d)):a[o]=d),s+=h}return a})(e.slice(i.length+16),i.encoding):null,e=8<=i.version?_e(Ne,e):null;return{palmdoc:t,mobi:i,exth:a,kf8:e}}async#setup(){var{palmdoc:e,mobi:t}=this.headers;this.#decoder=Je(t.encoding),this.#encoder=new TextEncoder;var e=e["compression"];if(this.#decompress=1===e?e=>e:2===e?et:17480===e?await tt(t,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");var t=t["trailingFlags"];const r=1&t,n=Ye(t>>>1);this.#removeTrailingEntries=t=>{for(let e=0;e<n;e++){var i=(e=>{let t=0;for(const i of e.subarray(-4))128&i&&(t=0),t=t<<7|127&i;return t})(t);t=t.subarray(0,-i)}var e;return r&&(e=1+(3&t[t.length-1]),t=t.subarray(0,-e)),t}}decode(...e){return this.#decoder.decode(...e)}encode(...e){return this.#encoder.encode(...e)}loadRecord(e){return super.loadRecord(this.#start+e)}loadMagic(e){return super.loadMagic(this.#start+e)}loadText(e){return this.loadRecord(e+1).then(e=>new Uint8Array(e)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(e){const t=await super.loadRecord(this.#resourceStart+e);e=Ze(t.slice(0,4));return"FONT"===e?(async(e,t)=>{var{flags:i,dataStart:r,keyLength:n,keyStart:a}=_e(Pe,e);const s=new Uint8Array(e.slice(r));if(2&i)for(var r=16===n?1024:1040,o=new Uint8Array(e.slice(a,a+n)),l=Math.min(r,s.length),c=0;c<l;c++)s[c]=s[c]^o[c%o.length];if(1&i)try{return t(s)}catch(e){console.warn(e),console.warn("Failed to decompress font")}return s})(t,this.unzlib):"VIDE"===e||"AUDI"===e?t.slice(12):t}getNCX(){var e=this.headers.mobi.indx;if(e<4294967295)return(async(e,t)=>{const{table:i,cncx:r}=await it(e,t),n=i.map(({tagMap:e},t)=>({index:t,offset:e[1]?.[0],size:e[2]?.[0],label:r[e[3]]??"",headingLevel:e[4]?.[0],pos:e[6],parent:e[21]?.[0],firstChild:e[22]?.[0],lastChild:e[23]?.[0]})),a=t=>(null==t.firstChild||(t.children=n.filter(e=>e.parent===t.index).map(a)),t);return n.filter(e=>0===e.headingLevel).map(a)})(e,this.loadRecord.bind(this))}getMetadata(){const{mobi:e,exth:t}=this.headers;return{identifier:e.uid.toString(),title:Ee(t?.title||this.decode(e.title)),author:t?.creator?.map(Ee),publisher:Ee(t?.publisher),language:t?.language??e.language,published:t?.date,description:Ee(t?.description),subject:t?.subject?.map(Ee),rights:Ee(t?.rights)}}async getCover(){var e=this.headers["exth"],e=e?.coverOffset<4294967295?e?.coverOffset:e?.thumbnailOffset<4294967295?e?.thumbnailOffset:null;if(null!=e){e=await this.loadResource(e);return new Blob([e])}}}const nt=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,at=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class st{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=Ae.HTML;constructor(e){this.mobi=e}async init(){let t=new Uint8Array;for(let e=0;e<this.mobi.headers.palmdoc.numTextRecords;e++)t=Xe(t,await this.mobi.loadText(e));const r=Array.from(new Uint8Array(t),e=>String.fromCharCode(e)).join("");this.#sections=[0].concat(Array.from(r.matchAll(nt),e=>e.index)).map((e,t,i)=>r.slice(e,i[t+1])).map(e=>Uint8Array.from(e,e=>e.charCodeAt(0))).map(e=>({book:this,raw:e})).reduce((e,t)=>{var i=e[e.length-1];return t.start=i?.end??0,t.end=t.start+t.raw.byteLength,e.concat(t)},[]),this.sections=this.#sections.map((e,t)=>({id:t,load:()=>this.loadSection(e),createDocument:()=>this.createDocument(e),size:e.end-e.start}));const n=[];try{const a=await this.mobi.getNCX(),s=({label:e,offset:t,children:i})=>{var r=t.toString().padStart(10,"0"),t=`filepos:${r}`;return n.push(r),{label:e=Ee(e),href:t,subitems:i?.map(s)}};if(this.toc=a?.map(s),this.landmarks=await this.getGuide(),!this.toc){var e=this.landmarks.find(({type:e})=>e?.includes("toc"))?.href;if(e){var i=this.resolveHref(e)["index"];const o=await this.sections[i].createDocument();this.toc=Array.from(o.querySelectorAll("a[filepos]"),e=>({label:e.innerText?.trim(),href:`filepos:${e.getAttribute("filepos")}`}))}}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(n.concat(Array.from(r.matchAll(at),e=>e[1])))].map(e=>({filepos:e,number:Number(e)})).sort((e,t)=>e.number-t.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const e=await this.createDocument(this.#sections[0]);return Array.from(e.getElementsByTagName("reference"),e=>({label:e.getAttribute("title"),type:e.getAttribute("type")?.split(/\s/),href:`filepos:${e.getAttribute("filepos")}`}))}async loadResource(e){if(this.#resourceCache.has(e))return this.#resourceCache.get(e);var t=await this.mobi.loadResource(e),t=URL.createObjectURL(new Blob([t]));return this.#resourceCache.set(e,t),t}async loadRecindex(e){return this.loadResource(Number(e)-1)}async replaceResources(e){for(const a of e.querySelectorAll("img[recindex]")){var t=a.getAttribute("recindex");try{a.src=await this.loadRecindex(t)}catch(e){console.warn(`Failed to load image ${t}`)}}for(const s of e.querySelectorAll("[mediarecindex]")){var i=s.getAttribute("mediarecindex"),r=s.getAttribute("recindex");try{s.src=await this.loadRecindex(i),r&&(s.poster=await this.loadRecindex(r))}catch(e){console.warn(`Failed to load media ${i}`)}}for(const o of e.querySelectorAll("[filepos]")){var n=o.getAttribute("filepos");o.href=`filepos:${n}`}}async loadText(t){if(this.#textCache.has(t))return this.#textCache.get(t);const r=t["raw"],n=this.#fileposList.filter(({number:e})=>e>=t.start&&e<t.end).map(e=>({...e,offset:e.number-t.start}));let a=r;n.length&&(a=r.subarray(0,n[0].offset),n.forEach(({filepos:e,offset:t},i)=>{i=n[i+1],e=this.mobi.encode(`<a id="filepos${e}"></a>`);a=qe(a,e,r.subarray(t,i?.offset))}));var e=this.mobi.decode(a).replaceAll(nt,"");return this.#textCache.set(t,e),e}async createDocument(e){e=await this.loadText(e);return this.parser.parseFromString(e,this.#type)}async loadSection(e){if(this.#cache.has(e))return this.#cache.get(e);const t=await this.createDocument(e),i=t.createElement("style");t.head.append(i),i.append(t.createTextNode(`blockquote { +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Kookit={})}(this,function(e){"use strict";function b(e,s,o,l){return new(o=o||Promise)(function(r,t){function i(e){try{a(l.next(e))}catch(e){t(e)}}function n(e){try{a(l.throw(e))}catch(e){t(e)}}function a(e){var t;e.done?r(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(i,n)}a((l=l.apply(e,s||[])).next())})}const g=e=>e?parseInt(e+""):0,v=t=>b(void 0,void 0,void 0,function*(){var e=yield t.load?(yield fetch(yield t.load()).then(e=>e.blob())).text():"";return r(e)}),r=e=>{var t=(new DOMParser).parseFromString(e,"text/html");let r=Array.from(t.querySelectorAll("img"));if(0===r.length)return e;for(let e=0;e<r.length;e++){var i=document.createElement("address"),n=document.createTextNode("img");i.appendChild(n),i.setAttribute("style","visibility: hidden; position: absolute"),r[e].parentNode&&r[e].parentNode.insertBefore(i,r[e])}return t.documentElement.innerHTML},s=(e,t=0)=>{var r=document.createElement("iframe");r.style.width="100%",r.style.border="0",r.style.margin="0",r.style.padding="0",r.style.minHeight="calc(100% - 2px)",r.style.fontSize="100%",r.style.font="inherit",r.scrolling="no",r.style.verticalAlign="baseline",e.innerHTML="",e.appendChild(r)},w=(r,i,n)=>{let e=document.getElementById("page-area");if(e){var t=e.getElementsByTagName("iframe")[0];if(t){let e=t.contentDocument;if(e){var a,t=Math.floor(r.clientWidth/12),s=t%2==0?t:t-1;for(a of e.getElementsByTagName("img")){var o=a.parentElement;let e=0,t=0;n.startsWith("CB")&&"scroll"===i?t=o.offsetWidth:n.startsWith("CB")&&"single"===i?(e=r.clientHeight,t=r.clientWidth):a.width&&a.height?a.height/a.width>o.clientHeight/o.clientWidth?(e=o.clientHeight,t=e*a.width/a.height):(t=o.clientWidth,e=t*a.height/a.width):e=o&&o.clientWidth&&0<o.clientWidth?(t=o.clientWidth,o.clientHeight):(t=r.clientWidth,r.clientHeight),t=Math.min("scroll"===i||"single"===i?r.clientWidth:(r.clientWidth-s)/2,t),(t||e)&&a.setAttribute("style",`max-width: ${0<t?t+"px":""};max-height:${0<e?e+"px":""}; ${n.startsWith("CB")?"display: block; margin-left: auto; margin-right: auto;":""}`)}}}}},o=(r,i)=>{let e=document.getElementById("page-area");if(e){var n=e.getElementsByTagName("iframe")[0];if(n){let t=n.contentDocument;if(t){let e=t.createElement("style");e.id="default-style",e.textContent="p,empty-line{display: inherit;margin-block-start: inherit;margin-block-end: inherit;margin-inline-start: inherit;margin-inline-end: inherit;}body{margin: 0px}",t.head.appendChild(e),"scroll"!==i&&(n="double"===i?2:1,i=(i=Math.floor(r.clientWidth/12))%2==0?i:i-1,t.body.setAttribute("style",`width: auto;height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;max-width: inherit;column-fill: auto;column-gap: ${i}px;column-count: 12;column-width: ${(r.clientWidth-i)/n}px;`))}}}};class x{static getReaderConfig(e){return(JSON.parse(localStorage.getItem("readerConfig"))||{})[e]}static setReaderConfig(e,t){let r=JSON.parse(localStorage.getItem("readerConfig"))||{};r[e]=t,localStorage.setItem("readerConfig",JSON.stringify(r))}static getKookitConfig(e){return(JSON.parse(localStorage.getItem("kookitConfig"))||{})[e]}static setKookitConfig(e,t){let r=JSON.parse(localStorage.getItem("kookitConfig"))||{};r[e]=t,localStorage.setItem("kookitConfig",JSON.stringify(r))}static removeKookitConfig(){localStorage.removeItem("kookitConfig")}}let l=!1;const h=e=>Array.from(e.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,blockquote,address")),u=e=>e.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100),i=(c,d,h,u,f,p,m)=>b(void 0,void 0,void 0,function*(){var t="yes"===x.getReaderConfig("isSliding");let e=document.getElementById("page-area");if(e){var r,i,n,a,s,o,l=e.getElementsByTagName("iframe")[0];if(l){let e=l.contentDocument;e&&(l=(l=Math.floor(c.clientWidth/12))%2==0?l:l-1,0<p?e.body.scrollBy({top:0,left:-c.clientWidth-l,behavior:t?"smooth":"auto"}):p<0&&(r=c,i=d,n=h,a=u,s=f,o=m,yield b(void 0,void 0,void 0,function*(){let e=document.getElementById("page-area");var t;e&&(!(t=e.getElementsByTagName("iframe")[0])||(t=t.contentDocument)&&Math.abs(r.scrollHeight-g(r.scrollTop)-r.clientHeight)<10&&Math.abs(t.body.scrollWidth-g(t.body.scrollLeft)-t.body.clientWidth)<10&&(yield y(r,i,n,a,s),o("rendered")))}),e.body.scrollBy({top:0,left:c.clientWidth+l,behavior:t?"smooth":"auto"})))}}}),c=(e,t,r,i)=>{r=r.filter(e=>e.href),t=window._.findLastIndex(r,{index:e,href:t});return"prev"===i?r[t-1]:r[t+1]},n=(i,n,a,s,o)=>b(void 0,void 0,void 0,function*(){var e=x.getKookitConfig("chapterTitle"),t=parseInt(x.getKookitConfig("chapterDocIndex")||"0"),r=x.getKookitConfig("chapterHref")||"";if(0!==t&&e){let e=c(t,r,n,"prev");e&&(x.setKookitConfig("text","prevChapter"),yield d(e.index,e.title,e.href,a,i,s,o),e.href&&-1<e.href.indexOf("#")&&(yield C(i,s,"","",e.href)))}}),d=(h,u,f,p,m,g,y)=>b(void 0,void 0,void 0,function*(){let e=document.getElementById("page-area");if(e){var i,n,a,s,o,l,c,d=e.getElementsByTagName("iframe")[0];if(d){let r=d.contentDocument;if(r){r.body.innerHTML="",r.body.scrollTo(0,0),(-1===(h=u&&!h?window._.findLastIndex(p,{title:u}):h)||h>p.length-1)&&(h=0),r.body.innerHTML=(i=p,n=h,yield b(void 0,void 0,void 0,function*(){let t="";for(let e=n;e<i.length&&(t+=yield v(i[e].text),!i[e+1]||!i[e+1].title);e++);return t})),x.getKookitConfig("chapterDocIndex")&&(a=parseInt(x.getKookitConfig("chapterDocIndex")),p[a]&&p[a].text&&p[a].text.unload&&a!==parseInt(h+"")&&p[a].text.unload());let e=Array.from(r.getElementsByTagName("link"));e.forEach(e=>{e.onload=()=>{console.log("finished")}});let t=[];e.forEach(r=>{r.href.endsWith("null")||t.push(new Promise((e,t)=>{r.addEventListener("load",e)}))});try{yield Promise.race([Promise.all(t),new Promise((e,t)=>{setTimeout(()=>{t(new Error("Timeout"))},1e3)})])}catch(e){console.log(e)}x.setKookitConfig("chapterTitle",u),x.setKookitConfig("chapterHref",f),x.setKookitConfig("chapterDocIndex",h+""),x.setKookitConfig("percentage",h/p.length+""),x.setKookitConfig("text",""),s=m,o=g,l=d,c=y,yield b(void 0,void 0,void 0,function*(){var e;"scroll"===o?(e=l.contentDocument)&&(yield Promise.all(Array.from(e.images).map(t=>t.complete?Promise.resolve(0!==t.naturalHeight):new Promise(e=>{t.addEventListener("load",()=>e(!0)),t.addEventListener("error",()=>e(!1))}))).then(e=>{e.every(e=>e)?console.log("all images loaded successfully"):console.log("some images failed to load, all finished loading")}),w(s,o,c),l.height=e.body.scrollHeight+"px"):l.height=s.clientHeight+"px"}),C(m,g,"","","")}}}}),C=(s,o,l,c,d)=>b(void 0,void 0,void 0,function*(){let e=document.getElementById("page-area");if(e){var t=e.getElementsByTagName("iframe")[0];if(t){let n=t.contentDocument;if(n){let t=0,r=0,i=n.body;if(l){let e=h(n.body);var a=e.filter((e,t)=>u(e.textContent)&&(u(e.textContent)===u(l)||u(e.textContent)===window.ChineseS2T.t2s(u(l))||u(e.textContent)===window.ChineseS2T.s2t(u(l)))&&(Math.abs(t-parseInt(c))<2||"search"===c));i=f(a[0],s),r=i?g(i.offsetLeft)-g(i.marginLeft):"prevChapter"===l?n.body.scrollWidth:0,t=i?g(i.offsetTop)-g(i.marginTop):0}else d&&-1<d.indexOf("#")&&(a=d.split("#").reverse()[0],i=f(n.body.querySelector("#"+a)||n.body,s),r=i?g(i.offsetLeft):0,t=i?g(i.offsetTop):0);"scroll"!==o?n.body.scrollTo(r,0):s.scrollTo(0,t)}}}}),f=(e,t)=>{var r=Math.floor(t.clientWidth/12),r=r%2==0?r:r-1;return parseInt(g(e.offsetLeft)-g(e.marginLeft)+"")%((parseInt(t.clientWidth)+r)/2)==0?e:f(e.parentElement,t)},t=(a,s,o)=>b(void 0,void 0,void 0,function*(){if(!l){let e=document.getElementById("page-area");if(e){var i=e.getElementsByTagName("iframe")[0];if(i){i=i.contentDocument;if(i){let t=h(i.body);var i=t.filter(e=>p(a,e,s)&&(e.textContent||"").trim()),n=i[0];let r=0;for(let e=0;e<t.length;e++)if(p(a,t[e],s)&&n&&t[e].innerHTML===n.innerHTML){r=e;break}((t,r)=>{let e=x.getKookitConfig("chapterHref")||"",i=e.lastIndexOf("#"),n=e.substring(0,i),a=e.substring(i+1);for(let e=0;e<t.length;e++){const s=t[e];if(a&&s.id){let e=n+"#"+s.id;let t=window._.findLastIndex(r,{href:e});if(t>-1)x.setKookitConfig("chapterHref",e)}}})(i,o),x.setKookitConfig("text",n&&n.textContent||""),x.setKookitConfig("count",r+""),l=!0,setTimeout(()=>{l=!1},100)}}}}}),y=(i,n,a,s,o)=>b(void 0,void 0,void 0,function*(){var e=parseInt(x.getKookitConfig("chapterDocIndex")||"0"),t=x.getKookitConfig("chapterHref")||"";let r=c(e,t,n,"next");r&&(yield d(r.index,r.title,r.href,a,i,s,o),r.href&&-1<r.href.indexOf("#")&&(yield C(i,s,"","",r.href)))}),p=(e,t,r)=>{var i,n=!1,a=t.getBoundingClientRect();return"scroll"!==r&&t.textContent&&t.textContent.trim()?n=-10<(i=a.left)&&i<=e.clientWidth:t.textContent&&t.textContent.trim()?n=(t=a.top)>=e.scrollTop&&t<=e.scrollTop+e.clientHeight:"scroll"!==r&&(n=0<=(a=a.left)&&a<=e.clientWidth),n};class a extends class{constructor(){this.callbacks={},this.callbacks.base={}}on(e,t){const r=this;if(void 0===e||""===e)return console.warn("wrong names"),!1;if(void 0===t)return console.warn("wrong callback"),!1;const i=this.resolveNames(e);return i.forEach(function(e){e=r.resolveName(e);r.callbacks[e.namespace]instanceof Object||(r.callbacks[e.namespace]={}),r.callbacks[e.namespace][e.value]instanceof Array||(r.callbacks[e.namespace][e.value]=[]),r.callbacks[e.namespace][e.value].push(t)}),this}off(e){const i=this;if(void 0===e||""===e)return console.warn("wrong name"),!1;const t=this.resolveNames(e);return t.forEach(function(e){var t=i.resolveName(e);if("base"!==t.namespace&&""===t.value)delete i.callbacks[t.namespace];else if("base"===t.namespace)for(const r in i.callbacks)i.callbacks[r]instanceof Object&&i.callbacks[r][t.value]instanceof Array&&(delete i.callbacks[r][t.value],0===Object.keys(i.callbacks[r]).length&&delete i.callbacks[r]);else i.callbacks[t.namespace]instanceof Object&&i.callbacks[t.namespace][t.value]instanceof Array&&(delete i.callbacks[t.namespace][t.value],0===Object.keys(i.callbacks[t.namespace]).length&&delete i.callbacks[t.namespace])}),this}trigger(e,t=[]){if(void 0===e||""===e)return console.warn("wrong name"),!1;const r=this;const i=t instanceof Array?t:[];let n=this.resolveNames(e);n=this.resolveName(n[0]),setTimeout(()=>{if("base"===n.namespace)for(const e in r.callbacks){if(r.callbacks[e]instanceof Object&&r.callbacks[e][n.value]instanceof Array&&r.callbacks[e][n.value])r.callbacks[e][n.value].forEach(function(e){e.apply(r,i)});else if(this.callbacks[n.namespace]instanceof Object&&r.callbacks[n.namespace][n.value]){if(""===n.value)return console.warn("wrong name"),this;r.callbacks[n.namespace][n.value].forEach(function(e){e.apply(r,i)})}return null}},100)}resolveNames(e){let t=e;return t=t.replace(/[^a-zA-Z0-9 ,/.]/g,""),t=t.replace(/[,/]+/g," "),t=t.split(" "),t}resolveName(e){const t={};var r=e.split(".");return t.original=e,t.value=r[0],t.namespace="base",1<r.length&&""!==r[1]&&(t.namespace=r[1]),t}}{constructor(e,t){super(),this.mode=e,this.format=t,this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element=""}getPageSize(){return{width:this.element.clientWidth,height:this.element.clientHeight}}resolveChapter(e){let t=new URL(e).pathname+new URL(e).hash,r=-1;for(let e=0;e<this.flattenChapters.length;e++)if(this.flattenChapters[e].href.includes(t.substring(1))){r=e;break}if(-1<r)return this.flattenChapters[r];{let t=new URL(e).pathname;for(let e=0;e<this.flattenChapters.length;e++)if(this.flattenChapters[e].href.includes(t.substring(1))){r=e;break}return-1<r?this.flattenChapters[r]:null}}flatChapter(t){let r=[];for(let e=0;e<t.length;e++)t[e].subitems&&0<t[e].subitems.length?(r.push(t[e]),r=r.concat(this.flatChapter(t[e].subitems))):r.push(t[e]);return this.flattenChapters=r,r}getChapter(){return this.chapterList}goToChapter(e,t,r){return b(this,void 0,void 0,function*(){yield d(parseInt(e),r,t,this.chapterDocList,this.element,this.mode,this.format),t&&-1<t.indexOf("#")&&(yield C(this.element,this.mode,"","",t)),yield this.record(),this.trigger("rendered")})}goToPosition(a){return b(this,void 0,void 0,function*(){var{text:e,chapterDocIndex:t,chapterTitle:r,chapterHref:i,count:n}=JSON.parse(a);yield d(parseInt(t),r,i,this.chapterDocList,this.element,this.mode,this.format),yield C(this.element,this.mode,e,n,""),yield this.record(),this.trigger("rendered")})}goToNode(i){return b(this,void 0,void 0,function*(){let e=document.getElementById("page-area");if(e){var t,r=e.getElementsByTagName("iframe")[0];if(r){let e=r.contentDocument;e&&(r=(t=f(i,this.element))?g(t.offsetLeft):0,t=t?g(t.offsetTop):0,"scroll"!==this.mode?e.body.scrollTo(r,0):this.element.scrollTo(0,t),yield this.record(),this.trigger("rendered"))}}})}removeContent(){this.element.innerHTML=""}prev(){return b(this,void 0,void 0,function*(){this.trigger("page-changed");let e=document.getElementById("page-area");if(e){var t=e.getElementsByTagName("iframe")[0];if(t){let e=t.contentDocument;e&&("scroll"===this.mode||0===g(e.body.scrollLeft)?(yield n(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.mode,this.format),e.body.scrollTo(e.body.scrollWidth,0),this.trigger("rendered")):yield i(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.mode,this.format,1,this.trigger),yield this.record())}}})}next(){return b(this,void 0,void 0,function*(){this.trigger("page-changed");let e=document.getElementById("page-area");var t;e&&(!(t=e.getElementsByTagName("iframe")[0])||(t=t.contentDocument)&&(Math.abs(t.body.scrollWidth-g(t.body.scrollLeft)-t.body.clientWidth)<10||"scroll"===this.mode?(yield y(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.mode,this.format),this.trigger("rendered")):yield i(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.mode,this.format,-1,this.trigger),yield this.record()))})}prevChapter(){return b(this,void 0,void 0,function*(){this.trigger("page-changed");let e=document.getElementById("page-area");var t;!e||(t=e.getElementsByTagName("iframe")[0])&&t.contentDocument&&(yield n(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.mode,this.format),yield this.record(),this.trigger("rendered"))})}nextChapter(){return b(this,void 0,void 0,function*(){this.trigger("page-changed");let e=document.getElementById("page-area");var t;!e||(t=e.getElementsByTagName("iframe")[0])&&t.contentDocument&&(yield y(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.mode,this.format),yield this.record(),this.trigger("rendered"))})}visibleText(){return((r,i)=>{let e=document.getElementById("page-area");if(e){var n=e.getElementsByTagName("iframe")[0];if(n){n=n.contentDocument;if(n){let e=h(n.body),t=e.filter(e=>p(r,e,i)&&(e.textContent||"").trim());return("scroll"!==i?t:e).filter(e=>"img"!==e.textContent).map(e=>e.textContent)}}}})(this.element,this.mode)}highlightNode(e,t){((r,i,n,a)=>{let e=document.getElementById("page-area");if(e){var s=e.getElementsByTagName("iframe")[0];if(s){s=s.contentDocument;if(s){let e=h(s.body),t=e.filter(e=>(e.getAttribute("style")===a&&e.setAttribute("style",""),p(r,e,i)&&(e.textContent||"").trim()&&e.textContent===n));0<t.length&&t[0].setAttribute("style",a)}}}})(this.element,this.mode,e,t)}doSearch(e){return b(this,void 0,void 0,function*(){return s=e,o=this.chapterDocList,yield b(void 0,void 0,void 0,function*(){var i;let n=[];for(let r=0;r<o.length;r++){var e=(new DOMParser).parseFromString(yield v(o[r].text),"text/html");let t=h(e.body).filter(e=>!(e=>{var t=e.children;let r=false;for(var i=/^(address|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,n=0;n<t.length;n++)if(i.test(t[n].nodeName)){r=true;break}return r})(e));for(let e=0;e<t.length;e++){var a=(t[e].textContent||"").indexOf(s);-1<a&&n.push({excerpt:(null===(i=t[e].textContent)||void 0===i?void 0:i.substring(a-100,a+100))||"",cfi:JSON.stringify({text:t[e].textContent,chapterTitle:o[r].title,chapterDocIndex:r,chapterHref:o[r].href,count:"search",percentage:r/o.length})})}}for(let e=0;e<o.length;e++)o[e].text&&o[e].text.unload&&o[e].text.unload();return window._.uniq(n,"excerpt")});var s,o})}getProgress(){return b(this,void 0,void 0,function*(){return yield b(void 0,void 0,void 0,function*(){let e=document.getElementById("page-area");if(e){var t=e.getElementsByTagName("iframe")[0];if(t){t=t.contentDocument;if(t)return 1===parseInt(t.body.scrollWidth/t.body.clientWidth+"")&&(yield new Promise(e=>setTimeout(e,1e3))),{totalPage:parseInt(t.body.scrollWidth/t.body.clientWidth+"")+1,currentPage:parseInt(g(t.body.scrollLeft)/t.body.clientWidth+"")+1}}}})})}record(){return b(this,void 0,void 0,function*(){"yes"===x.getReaderConfig("isSliding")&&(yield new Promise(e=>setTimeout(e,1e3))),yield t(this.element,this.mode,this.flatChapter(this.chapterList))})}getPosition(){return{text:x.getKookitConfig("text"),chapterTitle:x.getKookitConfig("chapterTitle"),chapterDocIndex:x.getKookitConfig("chapterDocIndex"),chapterHref:x.getKookitConfig("chapterHref"),count:x.getKookitConfig("count"),percentage:x.getKookitConfig("percentage")}}setStyle(t){let e=document.getElementById("page-area");if(e){var r=e.getElementsByTagName("iframe")[0];if(r){let e=r.contentDocument;e&&e.body.setAttribute("style",t+e.body.getAttribute("style"))}}}}const m=(e,t=!1)=>{e=(new DOMParser).parseFromString(t?(e=>{let t="",r=e.split("\n");for(let e of r)if(B(e).slim()&&!e.startsWith(" ")&&!e.startsWith(" ")&&A(B(e).slim()))t+=`<h1>${e}</h1>`;else t+=`<p>${e}</p>`;if(t)return t;else return`<h1>Title</h1><p>${e}</p>`})(e):e,"text/html");let r=Array.from(e.querySelectorAll("h1,h2,h3,h4,h5,h6,title"));0===r.length&&(r=(e=>{let t=e.getElementsByTagName("*"),r=Array.from(t).filter(e=>{return e.childNodes.length===1&&e.childNodes[0].nodeType===Node.TEXT_NODE&&A(e.textContent)}),i=[];return r.forEach(e=>{const t=document.createElement("h1");t.innerHTML=e.innerText;e.parentNode.replaceChild(t,e);i.push(t)}),i})(e));for(let e=0;e<r.length;e++){var i=document.createElement("address"),n=document.createTextNode(" ");i.appendChild(n),r[e].parentNode&&r[e].parentNode.insertBefore(i,r[e])}const a=(e=>{let t=[],r=e.split("<address> </address>").filter(e=>e.trim()!==""),i=r.map(e=>{return I(e)||M(e)});return t=r.map((e,t)=>{return{index:t,title:i[t],text:e,href:"title"+t}})})(e.body.innerHTML),s={getCover:()=>""};return s.sections=a.map(e=>({id:e.index,load:()=>(e=>b(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([a[e].text],{type:"text/html"}))}))(e.index),unload:()=>{e.index}})),s.toc=a.map(e=>({label:e.title,href:"title"+e.index})),s.rendition={layout:"pre-paginated"},s.resolveHref=e=>({index:parseInt(e.substring(5,e.length))}),s.splitTOCHref=e=>[e,null],s.getTOCFragment=e=>e.documentElement,s};let T=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],k=["[","(","。",";",";"],L=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序"],S=[" "," ","、","·",".",":",":"];String.prototype.contains=function(e){return-1<this.indexOf(e)},String.prototype.slim=function(){return this.split("").filter(e=>"="!==e&&"-"!==e&&"_"!==e&&"+"!==e).join("")};const B=e=>e.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100),A=e=>{return e&&(n=e,!(0<k.filter(e=>-1<n.indexOf(e)).length))&&(i=e,0<L.filter(e=>i.startsWith(e)||i.startsWith(window.ChineseS2T.s2t(e))).length||e.startsWith("第")&&E(e)||e.startsWith("卷")&&(!(!/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test((r=e).substring(1,r.indexOf(" ")))&&!/^\d+$/.test(r.substring(1,r.indexOf(" "))))||(!(!/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test(r.substring(1,r.indexOf(" ")))&&!/^\d+$/.test(r.substring(1,r.indexOf(" "))))||!(!/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test(r.substring(1))&&!/^\d+$/.test(r.substring(1)))))||e.contains("第")&&e.lastIndexOf("第")<2&&E(e.substr(e.indexOf("第")))||(t=e,0<S.filter(e=>-1<t.indexOf(e)&&(/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test(t.substring(0,t.indexOf(e)))||/^\d+$/.test(t.substring(0,t.indexOf(e))))).length));var t,r,i,n},E=t=>{let r=!1;for(let e=0;e<T.length&&((/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/.test(t.substring(1,t.indexOf(T[e])).trim())||/^\d+$/.test(t.substring(1,t.indexOf(T[e])).trim()))&&(r=!0),!r);e++);return r},I=e=>{const t=/<h[1-6]>([\s\S]*?)<\/h[1-6]>/.exec(e);return t?t[1].replace(/</g,"<").replace(/>/g,">"):""},M=e=>{const t=/<title>([\s\S]*?)<\/title>/.exec(e);return t?t[1].replace(/</g,"<").replace(/>/g,">"):""};class R{constructor(e){this.book=e,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}getChapter(e){return b(this,void 0,void 0,function*(){return this.chapterList=e?yield Promise.all(e.map(t=>b(this,void 0,void 0,function*(){var e=t.href&&(yield this.book.resolveHref(t.href))?(yield this.book.resolveHref(t.href)).index:-1;return{title:t.label||e,href:t.href,index:e,subitems:t.subitems?yield this.getChapter(t.subitems):[]}}))):yield Promise.all(this.book.sections.map((e,t)=>b(this,void 0,void 0,function*(){return{title:e.label||t,href:e.href||"",index:t,subitems:e.subitems?yield this.getChapter(e.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return b(this,void 0,void 0,function*(){const r=this.flattenChapters.map(e=>e.index);return this.book.sections.map((e,t)=>-1<r.indexOf(t)?{title:this.flattenChapters[r.indexOf(t)].title,href:this.flattenChapters[r.indexOf(t)].href,text:e}:{title:"",href:"",text:e})})}flatChapter(t){let r=[];for(let e=0;e<t.length;e++)t[e].subitems&&0<t[e].subitems.length?(r.push(t[e]),r=r.concat(this.flatChapter(t[e].subitems))):r.push(t[e]);return r}getMetadata(){return new Promise((i,e)=>b(this,void 0,void 0,function*(){const t=this.book.metadata;try{var r=yield this.book.getCover(),e=new FileReader;e.readAsDataURL(r),e.onloadend=()=>{i({name:t.title,author:t.author[0].name,description:t.description,publisher:t.publisher,cover:e.result})}}catch(e){r=t.author&&t.author[0]&&t.author[0].name?t.author[0].name:t.author&&t.author[0]?t.author[0]:t.author||"";i({name:t.title,author:r,description:t.description,publisher:t.publisher,cover:""})}}))}}const D=(e,i)=>e.map((e,t,r)=>i(e,t,r)?t:null).filter(e=>null!=e),N=(i,e)=>[-1,...e,i.length].reduce(({xs:e,a:t},r)=>({xs:e?.concat([i.slice(t+1,r)])??[],a:r}),{}).xs,O=(e,t)=>e.slice(0,-1).concat([e[e.length-1].concat(t[0])]).concat(t.slice(1)),H=/\d/,$=/^epubcfi\((.*)\)$/,U=e=>e.replace(/[\^[\](),;=]/g,"^$&"),F=e=>$.test(e)?e:`epubcfi(${e})`,P=(e,t)=>D(e,([e])=>e===t),z=e=>{const t=[];let r;for(var[i,n]of e){if("/"===i)t.push({index:n});else{const a=t[t.length-1];if(":"===i)a.offset=n;else if("~"===i)a.temporal=n;else if("@"===i)a.spatial=(a.spatial??[]).concat(n);else if(";s"===i)a.side=n;else if("["===i){if("/"!==r||!n){a.text=(a.text??[]).concat(n);continue}a.id=n}}r=i}return t},j=e=>N(e,P(e,"!")).map(z),W=e=>{var t=(e=>{const t=[];let r,i,n="";var a=e=>(t.push(e),r=null,n=""),s=e=>(n+=e,i=!1);for(const o of Array.from(e.trim()).concat(""))if("^"!==o||i){if("!"===r)a(["!"]);else if(","===r)a([","]);else if("/"===r||":"===r){if(H.test(o)){s(o);continue}a([r,parseInt(n)])}else if("~"===r){if(H.test(o)||"."===o){s(o);continue}a(["~",parseFloat(n)])}else if("@"===r){if(":"===o){a(["@",parseFloat(n)]),r="@";continue}if(H.test(o)||"."===o){s(o);continue}a(["@",parseFloat(n)])}else{if("["===r){";"!==o||i?","!==o||i?"]"!==o||i?s(o):a(["[",n]):(a(["[",n]),r="["):(a(["[",n]),r=";");continue}if(r?.startsWith(";")){"="!==o||i?";"!==o||i?"]"!==o||i?s(o):a([r,n]):(a([r,n]),r=";"):(r=`;${n}`,n="");continue}}"/"!==o&&":"!==o&&"~"!==o&&"@"!==o&&"["!==o&&"!"!==o&&","!==o||(r=o)}else i=!0;return t})((r=e).match($)?.[1]??r),e=P(t,",");if(!e.length)return j(t);var[r,t,e]=N(t,e).map(j);return{parent:r,start:t,end:e}},X=({index:e,id:t,offset:r,temporal:i,spatial:n,text:a,side:s})=>{var o=s?`;s=${s}`:"";return`/${e}`+(t?`[${U(t)}${o}]`:"")+(null!=r&&e%2?`:${r}`:"")+(i?`~${i}`:"")+(n?`@${n.join(":")}`:"")+(a||!t&&s?"["+(a?.map(U)?.join(",")??"")+o+"]":"")},q=e=>e.parent?[e.parent,e.start,e.end].map(q).join(","):e.map(e=>e.map(X).join("")).join("!"),K=e=>F(q(e)),Z=(e,t)=>"string"==typeof e?K(Z(W(e),t)):e.parent?O(e.parent,e[t?"end":"start"]):e,G=({nodeType:e})=>3===e||4===e,J=({nodeType:e})=>1===e,V=e=>{const t=Array.from(e.childNodes).filter(e=>G(e)||J(e)).reduce((e,t)=>{let r=e[e.length-1];return r?G(t)?Array.isArray(r)?r.push(t):G(r)?e[e.length-1]=[r,t]:e.push(t):J(r)?e.push(null,t):e.push(t):e.push(t),e},[]);return J(t[0])&&t.unshift("first"),J(t[t.length-1])&&t.push("last"),t.unshift("before"),t.push("after"),t},_=(e,t)=>e?V(e)[t]:null,Y=(e,t)=>{var r,i=t[t.length-1]["id"];if(i){i=e.ownerDocument.getElementById(i);if(i)return{node:i,offset:0}}for({index:r}of t){var n=_(e,r);if("first"===n)return{node:e.firstChild??e};if("last"===n)return{node:e.lastChild??e};if("before"===n)return{node:e,before:!0};if("after"===n)return{node:e,after:!0};e=n}var a=t[t.length-1]["offset"];if(!Array.isArray(e))return{node:e,offset:a};let s=0;for(const l of e){var o=l.nodeValue["length"];if(s+o>=a)return{node:l,offset:a-s};s+=o}},Q=(t,r)=>{var{parentNode:e,id:i}=t;const n=V(e);var a=n.findIndex(e=>Array.isArray(e)?e.some(e=>e===t):e===t),s=n[a];if(Array.isArray(s)){let e=0;for(const o of s){if(o===t){e+=r;break}e+=o.nodeValue.length}r=e}a={id:i,index:a,offset:r};return e!==t.ownerDocument.documentElement?Q(e).concat(a):[a]},ee=(e,t)=>Y(e.documentElement,Z(t)).node,te={CONTAINER:"urn:oasis:names:tc:opendocument:xmlns:container",XHTML:"http://www.w3.org/1999/xhtml",OPF:"http://www.idpf.org/2007/opf",EPUB:"http://www.idpf.org/2007/ops",DC:"http://purl.org/dc/elements/1.1/",DCTERMS:"http://purl.org/dc/terms/",ENC:"http://www.w3.org/2001/04/xmlenc#",NCX:"http://www.daisy.org/z3986/2005/ncx/",XLINK:"http://www.w3.org/1999/xlink",SMIL:"http://www.w3.org/ns/SMIL"},re={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},ie=e=>e.toLowerCase().replace(/[-:](.)/g,(e,t)=>t.toUpperCase()),ne=e=>e?e.trim().replace(/\s{2,}/g," "):"",ae=(t,r,e)=>e?e=>e.getAttribute(t)?.split(/\s/)?.includes(r):"function"==typeof r?e=>r(e.getAttribute(t)):e=>e.getAttribute(t)===r,se=(...e)=>t=>t?Object.fromEntries(e.map(e=>[ie(e),t.getAttribute(e)])):null,oe=e=>ne(e?.textContent),le=(e,r)=>{e=e.lookupNamespaceURI(null)===r||e.lookupPrefix(r);const i=e?(e,t)=>e=>e.namespaceURI===r&&e.localName===t:(e,t)=>e=>e.localName===t;return{$:(e,t)=>[...e.children].find(i(e,t)),$$:(e,t)=>[...e.children].filter(i(e,t)),$$$:e?(e,t)=>[...e.getElementsByTagNameNS(r,t)]:(e,t)=>[...e.getElementsByTagName(r,t)]}},ce=(t,e)=>{try{if(e.includes(":"))return new URL(t,e);var r="whatever://whatever/";return decodeURI(new URL(t,r+e).href.replace(r,""))}catch(e){return console.warn(e),t}},de=e=>/^(?!blob)\w+:/i.test(e),he=async(e,t,r)=>{const i=[];e.replace(t,(...e)=>(i.push(e),null));const n=[];for(const a of i)n.push(await r(...a));return e.replace(t,()=>n.shift())},ue=e=>e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&");var fe={attrs:["dir","xml:lang"]},pe={name:"alternate-script",many:!0,...fe,props:["file-as"]},me={many:!0,...fe,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",pe]};const ge=[{name:"title",many:!0,...fe,props:["title-type","display-seq","file-as",pe]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...me},{name:"contributor",...me},{name:"publisher",...fe,props:["file-as",pe]},{name:"description",...fe,props:[pe]},{name:"rights",...fe,props:[pe]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...fe,props:["term","authority",pe]},{name:"belongs-to-collection",type:"meta",many:!0,...fe,props:["collection-type","group-position","dcterms:identifier","file-as",pe,{name:"belongs-to-collection",recursive:!0}]}],ye=(e,a=e=>e)=>{const{$:s,$$:r,$$$:t}=le(e,te.XHTML),i=n=>e=>{const t=s(e,"a")??s(e,"span");var r=s(e,"ol"),e=(e=t?.getAttribute("href"))?decodeURI(a(e)):null;const i={label:oe(t)||t?.getAttribute("title"),href:e,subitems:o(r)};return n&&(i.type=t?.getAttributeNS(te.EPUB,"type")?.split(/\s/)),i},o=(e,t)=>e?r(e,"li").map(i(t)):null;var n=(e,t)=>o(s(e,"ol"),t);let l=null,c=null,d=null,h=[];for(const u of t(e,"nav")){const f=u.getAttributeNS(te.EPUB,"type")?.split(/\s/)??[];f.includes("toc")?l??=n(u):f.includes("page-list")?c??=n(u):f.includes("landmarks")?d??=n(u,!0):h.push({label:oe(u.firstElementChild),type:f,list:n(u)})}return{toc:l,pageList:c,landmarks:d,others:h}},be=(r,a=e=>e)=>{const{$:s,$$:o}=le(r,te.NCX),l=e=>{var t=s(e,"navLabel");const r=s(e,"content");var i=oe(t),t=(t=r.getAttribute("src"))?decodeURI(a(t)):null;if("navPoint"!==e.localName)return{label:i,href:t};{const n=o(e,"navPoint");return{label:i,href:t,subitems:n.length?n.map(l):null}}},i=(e,t)=>o(e,t).map(l);var e=(e,t)=>{e=s(r.documentElement,e);return e?i(e,t):null};return{toc:e("navMap","navPoint"),pageList:e("pageList","pageTarget"),others:o(r.documentElement,"navList").map(e=>({label:oe(s(e,"navLabel")),list:i(e,"navTarget")}))}},ve=e=>{if(e){var t=e.split(":").map(e=>parseFloat(e));if(3===t.length){var[r,i,n]=t;return 60*r*60+60*i+n}if(2===t.length){var[t,a]=t;return 60*t+a}var[a,e]=e.split(/(?=[^\d.])/);return parseFloat(a)*("h"===e?3600:"min"===e?60:"ms"===e?.001:1)}},we=(e,i=e=>e)=>{const{$:n,$$$:t}=le(e,te.SMIL);return t(e,"par").map(e=>{var t=n(e,"text")?.getAttribute("src")?.split("#")?.[1];const r=n(e,"audio");return r?{id:t,audio:{src:(e=r.getAttribute("src"))?decodeURI(i(e)):null,clipBegin:ve(r.getAttribute("clipBegin")),clipEnd:ve(r.getAttribute("clipEnd"))}}:{id:t}})},xe=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,Ce=e=>oe(e.getElementById(e.documentElement.getAttribute("unique-identifier"))??e.getElementsByTagNameNS(te.DC,"identifier")[0]),Te=async(e,t,r)=>{const i=new Uint8Array(await r.slice(0,t).arrayBuffer());t=Math.min(t,i.length);for(var n=0;n<t;n++)i[n]=i[n]^e[n%e.length];return new Blob([i,r.slice(t)],{type:r.type})},ke=(t=async e=>{e=(new TextEncoder).encode(e),e=await globalThis.crypto.subtle.digest("SHA-1",e);return new Uint8Array(e)})=>({"http://www.idpf.org/2008/embedding":{key:e=>t(Ce(e).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(e,t)=>Te(e,1040,t)},"http://ns.adobe.com/pdf/enc#RC":{key:e=>{const r=(e=>{for(const r of e.getElementsByTagNameNS(te.DC,"identifier")){var[t]=oe(r).split(":").slice(-1);if(xe.test(t))return t}return""})(e).replaceAll("-","");return Uint8Array.from({length:16},(e,t)=>parseInt(r.slice(2*t,2*t+2),16))},decode:(e,t)=>Te(e,1024,t)}});class Le{#uris=new Map;#decoders=new Map;#algorithms;constructor(e){this.#algorithms=e}async init(e,t){var r,i;if(e)for({algorithm:r,uri:i}of Array.from(e.getElementsByTagNameNS(te.ENC,"EncryptedData"),e=>({algorithm:e.getElementsByTagNameNS(te.ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:e.getElementsByTagNameNS(te.ENC,"CipherReference")[0]?.getAttribute("URI")}))){if(!this.#decoders.has(r)){const n=this.#algorithms[r];if(!n){console.warn("Unknown encryption algorithm");continue}const a=await n.key(t);this.#decoders.set(r,e=>n.decode(a,e))}this.#uris.set(i,r)}}getDecoder(e){return this.#decoders.get(this.#uris.get(e))??(e=>e)}}class Se{constructor({opf:e,resolveHref:i}){this.opf=e;const{$:t,$$:r,$$$:n}=le(e,te.OPF);var a=t(e.documentElement,"manifest");const s=t(e.documentElement,"spine"),o=r(s,"itemref");this.manifest=r(a,"item").map(se("href","id","media-type","properties","media-overlay")).map(e=>(e.href=i(e.href),e.properties=e.properties?.split(/\s/),e)),this.spine=o.map(se("idref","id","linear","properties")).map(e=>(e.properties=e.properties?.split(/\s/),e)),this.pageProgressionDirection=s.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID(s.getAttribute("toc"))??this.manifest.find(e=>e.mediaType===re.NCX))?.href;a=t(e.documentElement,"guide");a&&(this.guide=r(a,"reference").map(se("type","title","href")).map(({type:e,title:t,href:r})=>({label:t,type:e.split(/\s/),href:i(r)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID(n(e,"meta").find(ae("name","cover"))?.getAttribute("content"))??this.getItemByHref(this.guide?.find(e=>e.type.includes("cover"))?.href),this.cfis=(e=>{const t=[];var r,i,n=e[0]["parentNode"];const a=Q(n);for([r,i]of V(n).entries()){var s=e[t.length];i===s&&t.push(K([a.concat({id:s.id,index:r})]))}return t})(o)}getItemByID(t){return this.manifest.find(e=>e.id===t)}getItemByHref(t){return this.manifest.find(e=>e.href===t)}getItemByProperty(t){return this.manifest.find(e=>e.properties?.includes(t))}resolveCFI(e){const t=W(e),r=(t.parent??t).shift();let i=ee(this.opf,r);i&&"idref"!==i.nodeName&&(r.at(-1).id=null,i=ee(this.opf,r));const n=i?.getAttribute("idref");return{index:this.spine.findIndex(e=>e.idref===n),anchor:e=>((e,t)=>{var r=Z(t),i=Z(t,!0),t=e.documentElement,r=Y(t,r[0]),i=Y(t,i[0]);const n=e.createRange();return r.before?n.setStartBefore(r.node):r.after?n.setStartAfter(r.node):n.setStart(r.node,r.offset),i.before?n.setEndBefore(i.node):i.after?n.setEndAfter(i.node):n.setEnd(i.node,i.offset),n})(e,t)}}}class Be{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:e,loadBlob:t,resources:r}){this.loadText=e,this.loadBlob=t,this.manifest=r.manifest,this.assets=r.manifest}createURL(e,t,r,i){if(!t)return"";r=URL.createObjectURL(new Blob([t],{type:r}));if(this.#cache.set(e,r),this.#refCount.set(e,1),i){const n=this.#children.get(i);n?n.push(e):this.#children.set(i,[e])}return r}ref(e,t){const r=this.#children.get(t);return r?.includes(e)||(this.#refCount.set(e,this.#refCount.get(e)+1),r?r.push(e):this.#children.set(t,[e])),this.#cache.get(e)}unref(e){if(this.#refCount.has(e)){var t=this.#refCount.get(e)-1;if(t<1){URL.revokeObjectURL(this.#cache.get(e)),this.#cache.delete(e),this.#refCount.delete(e);const r=this.#children.get(e);if(r)for(;r.length;)this.unref(r.pop());this.#children.delete(e)}else this.#refCount.set(e,t)}}async loadItem(e,t=[]){if(!e)return null;const{href:r,mediaType:i}=e;var n=re.JS.test(e.mediaType);if(n&&!this.allowScript)return null;var a=t.at(-1);return this.#cache.has(r)?this.ref(r,a):(n||[re.XHTML,re.HTML,re.CSS,re.SVG].includes(i))&&t.every(e=>e!==r)?this.loadReplaced(e,t):this.createURL(r,await this.loadBlob(r),i,a)}async loadHref(e,t,r=[]){if(de(e))return e;const i=ce(e,t);var n=this.manifest.find(e=>e.href===i);return n?this.loadItem(n,r.concat(t)):e}async loadReplaced(e,n=[]){const{href:a,mediaType:r}=e;var i,s=n.at(-1),o=await this.loadText(a);if(!o)return null;if([re.XHTML,re.HTML,re.SVG].includes(r)){let t=(new DOMParser).parseFromString(o,r);if(r===re.XHTML&&t.querySelector("parsererror")&&(console.warn(t.querySelector("parsererror").innerText),e.mediaType=re.HTML,t=(new DOMParser).parseFromString(o,e.mediaType)),[re.XHTML,re.SVG].includes(e.mediaType)){let e=t.firstChild;for(;e instanceof ProcessingInstruction;)e.data&&(i=await he(e.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(e,t,r,i)=>this.loadHref(r,a,n).then(e=>`${t}${e}${i}`)),e.replaceWith(t.createProcessingInstruction(e.target,i))),e=e.nextSibling}var l=async(e,t)=>e.setAttribute(t,await this.loadHref(e.getAttribute(t),a,n));for(const d of t.querySelectorAll("link[href]"))await l(d,"href");for(const h of t.querySelectorAll("[src]"))await l(h,"src");for(const u of t.querySelectorAll("[poster]"))await l(u,"poster");for(const f of t.querySelectorAll("object[data]"))await l(f,"data");for(const p of t.querySelectorAll("[*|href]:not([href]"))p.setAttributeNS(te.XLINK,"href",await this.loadHref(p.getAttributeNS(te.XLINK,"href"),a,n));for(const m of t.querySelectorAll("style"))m.textContent&&(m.textContent=await this.replaceCSS(m.textContent,a,n));for(const g of t.querySelectorAll("[style]"))g.setAttribute("style",await this.replaceCSS(g.getAttribute("style"),a,n));const c=(new XMLSerializer).serializeToString(t);return this.createURL(a,c,e.mediaType,s)}const c=r===re.CSS?await this.replaceCSS(o,a,n):await this.replaceString(o,a,n);return this.createURL(a,c,r,s)}async replaceCSS(e,r,i=[]){e=await he(e,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(e,t)=>this.loadHref(t,r,i).then(e=>`url("${e}")`));const t=await he(e,/@import\s*["']([^"'\n]*?)["']/gi,(e,t)=>this.loadHref(t,r,i).then(e=>`@import "${e}"`)),n=window?.innerWidth??800,a=window?.innerHeight??600;return t.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(e,t)=>parseFloat(t)*n/100+"px").replace(/(\d*\.?\d+)vh/gi,(e,t)=>parseFloat(t)*a/100+"px").replace(/page-break-(after|before|inside)/gi,(e,t)=>`-webkit-column-break-${t}`)}replaceString(e,s,t=[]){const o=new Map,r=this.assets.map(e=>{if(e.href!==s){var t=((e,t)=>{if(!e)return t;const r=e.replace(/\/$/,"").split("/"),i=t.replace(/\/$/,"").split("/");t=(r.length>i.length?r:i).findIndex((e,t)=>r[t]!==i[t]);return t<0?"":Array(r.length-t).fill("..").concat(i.slice(t)).join("/")})(s.slice(0,s.lastIndexOf("/")+1),e.href),r=encodeURI(t),i="/"+e.href,n=encodeURI(i),n=new Set([t,r,i,n]);for(const a of n)o.set(a,e);return Array.from(n)}}).flat().filter(e=>e);if(!r.length)return e;var i=new RegExp(r.map(ue).join("|"),"g");return he(e,i,async e=>this.loadItem(o.get(e.replace(/^\//,"")),t.concat(s)))}unloadItem(e){this.unref(e?.href)}}class Ae{parser=new DOMParser;#encryption;constructor({loadText:e,loadBlob:t,getSize:r,sha1:i}){this.loadText=e,this.loadBlob=t,this.getSize=r,this.#encryption=new Le(ke(i))}#parseXML(e){return e?this.parser.parseFromString(e,re.XML):null}async#loadXML(e){return this.#parseXML(await this.loadText(e))}async init(){const e=await this.#loadXML("META-INF/container.xml");if(!e)throw new Error("Failed to load container file");var t=Array.from(e.getElementsByTagNameNS(te.CONTAINER,"rootfile"),se("full-path","media-type")).filter(e=>"application/oebps-package+xml"===e.mediaType);if(!t.length)throw new Error("No package document defined in container");const r=t[0].fullPath;var i=await this.#loadXML(r);if(!i)throw new Error("Failed to load package document");t=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init(t,i),this.resources=new Se({opf:i,resolveHref:e=>ce(e,r)});const a=new Be({loadText:this.loadText,loadBlob:e=>Promise.resolve(this.loadBlob(e)).then(this.#encryption.getDecoder(e)),resources:this.resources});this.sections=this.resources.spine.map((e,t)=>{var{idref:r,linear:i,properties:e=[]}=e;const n=this.resources.getItemByID(r);return n?{id:this.resources.getItemByID(r)?.href,load:()=>a.loadItem(n),unload:()=>a.unloadItem(n),createDocument:()=>this.loadDocument(n),size:this.getSize(n.href),cfi:this.resources.cfis[t],linear:i,pageSpread:(e=>{for(const t of e){if("page-spread-left"===t||"rendition:page-spread-left"===t)return"left";if("page-spread-right"===t||"rendition:page-spread-right"===t)return"right";if("rendition:page-spread-center"===t)return"center"}})(e),resolveHref:e=>ce(e,n.href),loadMediaOverlay:()=>this.loadMediaOverlay(n)}:(console.warn(`Could not find item with ID "${r}" in manifest`),null)}).filter(e=>e);const{navPath:n,ncxPath:s}=this.resources;if(n)try{var o=ye(await this.#loadXML(n),e=>ce(e,n));this.toc=o.toc,this.pageList=o.pageList,this.landmarks=o.landmarks}catch(e){console.warn(e)}if(!this.toc&&s)try{var l=be(await this.#loadXML(s),e=>ce(e,s));this.toc=l.toc,this.pageList=l.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:c,rendition:d,media:h}=(e=>{const{$:t,$$:r}=le(e,te.OPF),i=t(e.documentElement,"metadata"),a=Array.from(i.children),l=(s,t)=>{if(!t)return null;const{props:e=[],attrs:r=[]}=s,i=oe(t);if(!e.length&&!r.length)return i;var n=t.getAttribute("id");const o=n?a.filter(ae("refines","#"+n)):[];return Object.fromEntries([["value",i]].concat(e.map(e=>{var{many:t,recursive:r}=e,i="string"==typeof e?e:e.name,n=ae("property",i);const a=r?s:e;return[ie(i),t?o.filter(n).map(e=>l(a,e)):l(a,o.find(n))]})).concat(r.map(e=>[ie(e),t.getAttribute(e)])))},s=a.filter(ae("refines",null));e=t=>Object.fromEntries(r(i,"meta").filter(ae("property",e=>e?.startsWith(t))).map(e=>[e.getAttribute("property").replace(t,""),oe(e)]));return{metadata:Object.fromEntries(ge.map(t=>{const{type:e,name:r,many:i}=t;var n="meta"===e?e=>e.namespaceURI===te.OPF&&e.getAttribute("property")===r:e=>e.namespaceURI===te.DC&&e.localName===r;return[ie(r),i?s.filter(n).map(e=>l(t,e)):l(t,s.find(n))]})),rendition:e("rendition:"),media:e("media:")}})(i);this.rendition=d,this.media=h,h.duration=ve(h.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=c;l=c?.title?.[0];this.metadata={title:l?.value,sortAs:l?.fileAs,language:c?.language,identifier:Ce(i),description:c?.description?.value,publisher:c?.publisher?.value,published:c?.date,modified:c?.dctermsModified,subject:c?.subject?.filter(({value:e,code:t})=>e||t)?.map(({value:e,code:t,scheme:r})=>({name:e,code:t,scheme:r})),rights:c?.rights?.value};const u={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"};i=r=>e=>{var t=[...new Set(e.role?.map(({value:e,scheme:t})=>(t&&"marc:relators"!==t?null:u[e])??r))],e={name:e.value,sortAs:e.fileAs};return[t.length?t:[r],e]};return c?.creator?.map(i("author"))?.concat(c?.contributor?.map?.(i("contributor")))?.forEach(([e,t])=>e.forEach(e=>{this.metadata[e]?this.metadata[e].push(t):this.metadata[e]=[t]})),this}async loadDocument(e){var t=await this.loadText(e.href);return this.parser.parseFromString(t,e.mediaType)}async loadMediaOverlay(e){e=e.mediaOverlay;if(!e)return null;const t=this.resources.getItemByID(e);e=await this.#loadXML(t.href);return we(e,e=>ce(e,t.href))}resolveCFI(e){return this.resources.resolveCFI(e)}resolveHref(e){const[t,r]=e.split("#"),i=this.resources.getItemByHref(decodeURI(t));return i?{index:this.resources.spine.findIndex(({idref:e})=>e===i.id),anchor:r?e=>((e,t)=>e.getElementById(t)??e.querySelector(`[name="${CSS.escape(t)}"]`))(e,r):()=>0}:null}splitTOCHref(e){return e?.split("#")??[]}getTOCFragment(e,t){return e.getElementById(t)??e.querySelector(`[name="${CSS.escape(t)}"]`)}isExternal(e){return de(e)}async getCover(){var e=this.resources?.cover;return e?.href?new Blob([await this.loadBlob(e.href)],{type:e.mediaType}):null}async getCalibreBookmarks(){const e=await this.loadText("META-INF/calibre_bookmarks.txt");var t="encoding=json+base64:";if(e?.startsWith(t)){t=atob(e.slice(t.length));return JSON.parse(t)}}}const Ee=e=>{if(!e)return"";const t=document.createElement("textarea");return t.innerHTML=e,t.value},Ie={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},Me={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},Re={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},De={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},Ne={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},Oe={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},He={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},$e={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},Ue={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},Fe={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},Pe={magic:[0,4,"string"],numEntries:[8,4,"uint"]},ze={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},je={1252:"windows-1252",65001:"utf-8"},We={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},Xe={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},qe=(e,t)=>{const r=new e.constructor(e.length+t.length);return r.set(e),r.set(t,e.length),r},Ke=(e,t,r)=>{const i=new e.constructor(e.length+t.length+r.length);return i.set(e),i.set(t,e.length),i.set(r,e.length+t.length),i},Ze=new TextDecoder,Ge=e=>Ze.decode(e),Je=e=>{if(e){var t=e.byteLength,t=4===t?"getUint32":2===t?"getUint16":"getUint8";return new DataView(e)[t](0)}},Ve=(e,n)=>Object.fromEntries(Array.from(Object.entries(e)).map(([e,[t,r,i]])=>[e,("string"===i?Ge:Je)(n.slice(t,t+r))])),_e=e=>new TextDecoder(je[e]),Ye=(e,t=0)=>{let r=0,i=0;for(const n of e.subarray(t,t+4))if(r=r<<7|(127&n)>>>0,i++,128&n)break;return{value:r,length:i}},Qe=e=>{let t=0;for(;0<e;e>>=1)1==(1&e)&&t++;return t},et=e=>{let t=0;for(;0==(1&e);)e>>=1,t++;return t},tt=t=>{let r=[];for(let e=0;e<t.length;e++){var i=t[e];if(0===i)r.push(0);else if(i<=8)for(const o of t.subarray(e+1,(e+=i)+1))r.push(o);else if(i<=127)r.push(i);else if(i<=191){var n=i<<8|t[1+e++],a=(16383&n)>>>3,s=3+(7&n);for(let e=0;e<s;e++)r.push(r[r.length-a])}else r.push(32,128^i)}return Uint8Array.from(r)},rt=async(t,r)=>{const i=await r(t.huffcdic),{magic:e,offset1:n,offset2:a}=Ve(Ue,i);if("HUFF"!==e)throw new Error("Invalid HUFF record");const h=Array.from({length:256},(e,t)=>n+4*t).map(e=>Je(i.slice(e,e+4))).map(e=>[128&e,31&e,e>>>8]),u=[null].concat(Array.from({length:32},(e,t)=>a+8*t).map(e=>[Je(i.slice(e,e+4)),Je(i.slice(e+4,e+8))])),f=[];for(let e=1;e<t.numHuffcdic;e++){const m=await r(t.huffcdic+e);var s=Ve(Fe,m);if("CDIC"!==s.magic)throw new Error("Invalid CDIC record");var o=Math.min(1<<s.codeLength,s.numEntries-f.length);const g=m.slice(s.length);for(let e=0;e<o;e++){var l=Je(g.slice(2*e,2*e+2)),c=Je(g.slice(l,l+2)),d=32768&c,c=new Uint8Array(g.slice(l+2,l+2+(32767&c)));f.push([c,d])}}const p=s=>{let o=new Uint8Array;var l=8*s.byteLength;for(let a=0;a<l;){var c=Number(((t,r)=>{var e=r+32,i=e>>3;let n=0n;for(let e=r>>3;e<=i;e++)n=n<<8n|BigInt(t[e]??0);return n>>8n-BigInt(7&e)&0xffffffffn})(s,a));let[e,t,r]=h[c>>>24];if(!e){for(;c>>>32-t<u[t][0];)t+=1;r=u[t][1]}if((a+=t)>l)break;var d=r-(c>>>32-t);let[i,n]=f[d];n||(i=p(i),f[d]=[i,!0]),o=qe(o,i)}return o};return p},it=async(t,r)=>{const e=await r(t),i=Ve(He,e);if("INDX"!==i.magic)throw new Error("Invalid INDX record");const n=_e(i.encoding),a=e.slice(i.length);var s=Ve($e,a);if("TAGX"!==s.magic)throw new Error("Invalid TAGX section");var o=(s.length-12)/4,l=Array.from({length:o},(e,t)=>new Uint8Array(a.slice(12+4*t,12+4*t+4)));const c={};let d=0;for(let e=0;e<i.numCncx;e++){const H=await r(t+i.numRecords+e+1);var h=new Uint8Array(H);for(let e=0;e<h.byteLength;){var u=e,{value:f,length:p}=Ye(h,e);e+=p;p=H.slice(e,e+f);e+=f,c[d+u]=n.decode(p)}d+=65536}const m=[];for(let e=0;e<i.numRecords;e++){const $=await r(t+1+e);var g=new Uint8Array($);const i=Ve(He,$);if("INDX"!==i.magic)throw new Error("Invalid INDX record");for(let r=0;r<i.numRecords;r++){var y=i.idxt+4+2*r,b=Je($.slice(y,y+2)),v=Je($.slice(b,b+1)),y=Ge($.slice(b+1,b+1+v));const U=[];var w,x,C,T,k,L,S,B,A,E,I,M=b+1+v;let e=0,t=M+s.numControlBytes;for([w,x,C,T]of l)1&T?e++:(S=M+e,(k=Je($.slice(S,S+1))&C)===C?1<Qe(C)?({value:L,length:S}=Ye(g,t),U.push([w,null,L,x]),t+=S):U.push([w,1,null,x]):U.push([w,k>>et(C),null,x]));const F={};for([B,A,E,I]of U){const P=[];if(null!=A)for(let e=0;e<A*I;e++){var{value:R,length:D}=Ye(g,t);P.push(R),t+=D}else{let e=0;for(;e<E;){var{value:N,length:O}=Ye(g,t);P.push(N),t+=O,e+=O}}F[B]=P}m.push({name:y,tagMap:F})}}return{table:m,cncx:c}};class nt extends class{#file;#offsets;pdb;async open(e){this.#file=e;var t=Ve(Me,await e.slice(0,78).arrayBuffer());this.pdb=t;const r=await e.slice(78,78+8*t.numRecords).arrayBuffer();this.#offsets=Array.from({length:t.numRecords},(e,t)=>Je(r.slice(8*t,8*t+4))).map((e,t,r)=>[e,r[t+1]])}loadRecord(e){e=this.#offsets[e];if(!e)throw new RangeError("Record index out of bounds");return this.#file.slice(...e).arrayBuffer()}async loadMagic(e){e=this.#offsets[e][0];return Ge(await this.#file.slice(e,e+4).arrayBuffer())}}{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:e}){super(),this.unzlib=e}async open(e){await super.open(e),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let t=8<=this.headers.mobi.version;if(!t){e=this.headers.exth?.boundary;if(e<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(e)),this.#start=e,t=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),new(t?ft:ot)(this).init()}#getHeaders(e){var t=Ve(Re,e);const r=Ve(De,e);if("MOBI"!==r.magic)throw new Error("Missing MOBI header");var{titleOffset:i,titleLength:n,localeLanguage:a,localeRegion:s}=r;r.title=e.slice(i,i+n);a=Xe[a];r.language=a?.[s>>2]??a?.[0];a=64&r.exthFlag?((t,e)=>{var{magic:r,count:i}=Ve(Oe,t);if("EXTH"!==r)throw new Error("Invalid EXTH header");const n=_e(e),a={};let s=12;for(let e=0;e<i;e++){var o,l,c,d=Je(t.slice(s,s+4)),h=Je(t.slice(s+4,s+8));d in We&&([o,l,c]=We[d],d=t.slice(s+8,s+h),d="uint"===l?Je(d):n.decode(d),c?(a[o]??=[],a[o].push(d)):a[o]=d),s+=h}return a})(e.slice(r.length+16),r.encoding):null,e=8<=r.version?Ve(Ne,e):null;return{palmdoc:t,mobi:r,exth:a,kf8:e}}async#setup(){var{palmdoc:e,mobi:t}=this.headers;this.#decoder=_e(t.encoding),this.#encoder=new TextEncoder;var e=e["compression"];if(this.#decompress=1===e?e=>e:2===e?tt:17480===e?await rt(t,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");var t=t["trailingFlags"];const i=1&t,n=Qe(t>>>1);this.#removeTrailingEntries=t=>{for(let e=0;e<n;e++){var r=(e=>{let t=0;for(const r of e.subarray(-4))128&r&&(t=0),t=t<<7|127&r;return t})(t);t=t.subarray(0,-r)}var e;return i&&(e=1+(3&t[t.length-1]),t=t.subarray(0,-e)),t}}decode(...e){return this.#decoder.decode(...e)}encode(...e){return this.#encoder.encode(...e)}loadRecord(e){return super.loadRecord(this.#start+e)}loadMagic(e){return super.loadMagic(this.#start+e)}loadText(e){return this.loadRecord(e+1).then(e=>new Uint8Array(e)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(e){const t=await super.loadRecord(this.#resourceStart+e);e=Ge(t.slice(0,4));return"FONT"===e?(async(e,t)=>{var{flags:r,dataStart:i,keyLength:n,keyStart:a}=Ve(ze,e);const s=new Uint8Array(e.slice(i));if(2&r)for(var i=16===n?1024:1040,o=new Uint8Array(e.slice(a,a+n)),l=Math.min(i,s.length),c=0;c<l;c++)s[c]=s[c]^o[c%o.length];if(1&r)try{return t(s)}catch(e){console.warn(e),console.warn("Failed to decompress font")}return s})(t,this.unzlib):"VIDE"===e||"AUDI"===e?t.slice(12):t}getNCX(){var e=this.headers.mobi.indx;if(e<4294967295)return(async(e,t)=>{const{table:r,cncx:i}=await it(e,t),n=r.map(({tagMap:e},t)=>({index:t,offset:e[1]?.[0],size:e[2]?.[0],label:i[e[3]]??"",headingLevel:e[4]?.[0],pos:e[6],parent:e[21]?.[0],firstChild:e[22]?.[0],lastChild:e[23]?.[0]})),a=t=>(null==t.firstChild||(t.children=n.filter(e=>e.parent===t.index).map(a)),t);return n.filter(e=>0===e.headingLevel).map(a)})(e,this.loadRecord.bind(this))}getMetadata(){const{mobi:e,exth:t}=this.headers;return{identifier:e.uid.toString(),title:Ee(t?.title||this.decode(e.title)),author:t?.creator?.map(Ee),publisher:Ee(t?.publisher),language:t?.language??e.language,published:t?.date,description:Ee(t?.description),subject:t?.subject?.map(Ee),rights:Ee(t?.rights)}}async getCover(){var e=this.headers["exth"],e=e?.coverOffset<4294967295?e?.coverOffset:e?.thumbnailOffset<4294967295?e?.thumbnailOffset:null;if(null!=e){e=await this.loadResource(e);return new Blob([e])}}}const at=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,st=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class ot{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=Ie.HTML;constructor(e){this.mobi=e}async init(){let t=new Uint8Array;for(let e=0;e<this.mobi.headers.palmdoc.numTextRecords;e++)t=qe(t,await this.mobi.loadText(e));const i=Array.from(new Uint8Array(t),e=>String.fromCharCode(e)).join("");this.#sections=[0].concat(Array.from(i.matchAll(at),e=>e.index)).map((e,t,r)=>i.slice(e,r[t+1])).map(e=>Uint8Array.from(e,e=>e.charCodeAt(0))).map(e=>({book:this,raw:e})).reduce((e,t)=>{var r=e[e.length-1];return t.start=r?.end??0,t.end=t.start+t.raw.byteLength,e.concat(t)},[]),this.sections=this.#sections.map((e,t)=>({id:t,load:()=>this.loadSection(e),createDocument:()=>this.createDocument(e),size:e.end-e.start}));const n=[];try{const a=await this.mobi.getNCX(),s=({label:e,offset:t,children:r})=>{var i=t.toString().padStart(10,"0"),t=`filepos:${i}`;return n.push(i),{label:e=Ee(e),href:t,subitems:r?.map(s)}};if(this.toc=a?.map(s),this.landmarks=await this.getGuide(),!this.toc){var e=this.landmarks.find(({type:e})=>e?.includes("toc"))?.href;if(e){var r=this.resolveHref(e)["index"];const o=await this.sections[r].createDocument();this.toc=Array.from(o.querySelectorAll("a[filepos]"),e=>({label:e.innerText?.trim(),href:`filepos:${e.getAttribute("filepos")}`}))}}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(n.concat(Array.from(i.matchAll(st),e=>e[1])))].map(e=>({filepos:e,number:Number(e)})).sort((e,t)=>e.number-t.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const e=await this.createDocument(this.#sections[0]);return Array.from(e.getElementsByTagName("reference"),e=>({label:e.getAttribute("title"),type:e.getAttribute("type")?.split(/\s/),href:`filepos:${e.getAttribute("filepos")}`}))}async loadResource(e){if(this.#resourceCache.has(e))return this.#resourceCache.get(e);var t=await this.mobi.loadResource(e),t=URL.createObjectURL(new Blob([t]));return this.#resourceCache.set(e,t),t}async loadRecindex(e){return this.loadResource(Number(e)-1)}async replaceResources(e){for(const a of e.querySelectorAll("img[recindex]")){var t=a.getAttribute("recindex");try{a.src=await this.loadRecindex(t)}catch(e){console.warn(`Failed to load image ${t}`)}}for(const s of e.querySelectorAll("[mediarecindex]")){var r=s.getAttribute("mediarecindex"),i=s.getAttribute("recindex");try{s.src=await this.loadRecindex(r),i&&(s.poster=await this.loadRecindex(i))}catch(e){console.warn(`Failed to load media ${r}`)}}for(const o of e.querySelectorAll("[filepos]")){var n=o.getAttribute("filepos");o.href=`filepos:${n}`}}async loadText(t){if(this.#textCache.has(t))return this.#textCache.get(t);const i=t["raw"],n=this.#fileposList.filter(({number:e})=>e>=t.start&&e<t.end).map(e=>({...e,offset:e.number-t.start}));let a=i;n.length&&(a=i.subarray(0,n[0].offset),n.forEach(({filepos:e,offset:t},r)=>{r=n[r+1],e=this.mobi.encode(`<a id="filepos${e}"></a>`);a=Ke(a,e,i.subarray(t,r?.offset))}));var e=this.mobi.decode(a).replaceAll(at,"");return this.#textCache.set(t,e),e}async createDocument(e){e=await this.loadText(e);return this.parser.parseFromString(e,this.#type)}async loadSection(e){if(this.#cache.has(e))return this.#cache.get(e);const t=await this.createDocument(e),r=t.createElement("style");t.head.append(r),r.append(t.createTextNode(`blockquote { margin-block-start: 0; margin-block-end: 0; margin-inline-start: 1em; margin-inline-end: 0; - }`)),await this.replaceResources(t);var r=this.serializer.serializeToString(t),r=URL.createObjectURL(new Blob([r],{type:this.#type}));return this.#cache.set(e,r),r}resolveHref(e){const t=e.match(/filepos:(.*)/)[1],i=Number(t);return{index:this.#sections.findIndex(e=>e.end>i),anchor:e=>e.getElementById(`filepos${t}`)}}splitTOCHref(e){e=e.match(/filepos:(.*)/)[1];const t=Number(e);return[this.#sections.findIndex(e=>e.end>t),`filepos${e}`]}getTOCFragment(e,t){return e.getElementById(t)}isExternal(e){return/^(?!blob|filepos)\w+:/i.test(e)}}const ot=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,lt=/kindle:pos:fid:(\w+):off:(\w+)/,ct=e=>{var[t,e]=e.match(lt).slice(1);return{fid:parseInt(t,32),off:parseInt(e,32)}},dt=(e=0,t=0)=>`kindle:pos:fid:${e.toString(32).toUpperCase().padStart(4,"0")}:off:${t.toString(32).toUpperCase().padStart(10,"0")}`,ht=e=>{var t=e.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(t){var[,e,t]=t;return`[${e}="${CSS.escape(t)}"]`}};class ut{parser=new DOMParser;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#checkType=!0;#type=Ae.XHTML;constructor(e){this.mobi=e}async init(){const e=this.mobi.loadRecord.bind(this.mobi);var t=this.mobi.headers["kf8"];try{const l=await e(t.fdst);var i=_e(Fe,l);if("FDST"!==i.magic)throw new Error("Missing FDST record");var r=Array.from({length:i.numEntries},(e,t)=>12+8*t).map(e=>[Ge(l.slice(e,e+4)),Ge(l.slice(e+4,e+8))]);this.#tables.fdstTable=r,this.#fullRawLength=r[r.length-1][1]}catch{}const n=(await it(t.skel,e)).table.map(({name:e,tagMap:t},i)=>({index:i,name:e,numFrag:t[1][0],offset:t[6][0],length:t[6][1]})),a=await it(t.frag,e),s=a.table.map(({name:e,tagMap:t})=>({insertOffset:parseInt(e),selector:a.cncx[t[2][0]],index:t[4][0],offset:t[6][0],length:t[6][1]}));this.#tables.skelTable=n,this.#tables.fragTable=s,this.#sections=n.reduce((e,t)=>{var i=e[e.length-1],r=i?.fragEnd??0,n=r+t.numFrag;const a=s.slice(r,n);r=t.length+a.map(e=>e.length).reduce((e,t)=>e+t);return e.concat({skel:t,frags:a,fragEnd:n,length:r,totalLength:(i?.totalLength??0)+r})},[]),this.#sections.unshift({frags:[]}),this.sections=this.#sections.map((e,t)=>e.frags.length?{id:t,load:()=>this.loadSection(e),createDocument:()=>this.createDocument(e),size:e.length}:{linear:"no"});try{const c=await this.mobi.getNCX(),d=({label:e,pos:t,children:i})=>{var[r,n]=t,t=dt(r,n);const a=this.#fragmentOffsets.get(r);return a?a.push(n):this.#fragmentOffsets.set(r,[n]),{label:Ee(e),href:t,subitems:i?.map(d)}};this.toc=c?.map(d),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const o=this.mobi.headers["exth"];return this.dir=o.pageProgressionDirection,this.rendition={layout:"true"===o.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(o.originalResolution?.split("x")?.slice(0,2)?.map((e,t)=>[t?"height":"width",e])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(t){const i={};var r=this.mobi.headers.kf8.resourceStart,n=this.mobi.pdb.numRecords;for(let e=r;e<n;e++)try{const s=await this.mobi.loadMagic(e);var a=t.find(e=>e===s);a&&(i[a]=e)}catch{}return i}async getGuide(){var e=this.mobi.headers.kf8.guide;if(e<4294967295){var t=this.mobi.loadRecord.bind(this.mobi);const{table:i,cncx:r}=await it(e,t);return i.map(({name:e,tagMap:t})=>({label:r[t[1][0]]??"",type:e?.split(/\s/),href:dt(t[6]?.[0]??t[3]?.[0])}))}}async loadResourceBlob(e){var{resourceType:t,id:i,type:e}=(e=>{var[t,i,e]=e.match(ot).slice(1);return{resourceType:t,id:parseInt(i,32),type:e}})(e),i="flow"===t?await this.loadFlow(i):await this.mobi.loadResource(i-1),i=[Ae.XHTML,Ae.HTML,Ae.CSS,Ae.SVG].includes(e)?await this.replaceResources(this.mobi.decode(i)):i;return new Blob([i],{type:e})}async loadResource(e){if(this.#cache.has(e))return this.#cache.get(e);var t=await this.loadResourceBlob(e),t=URL.createObjectURL(t);return this.#cache.set(e,t),t}replaceResources(e){return(async(e,t,i)=>{const r=[];e.replace(t,(...e)=>(r.push(e),null));const n=[];for(const a of r)n.push(await i(...a));return e.replace(t,()=>n.shift())})(e,new RegExp(ot,"g"),this.loadResource.bind(this))}async loadRaw(e,t){var i=t-this.#rawHead.length,r=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-e;if(i<0||i<r){for(;this.#rawHead.length<t;){var n=++this.#lastLoadedHead,n=await this.mobi.loadText(n);this.#rawHead=Xe(this.#rawHead,n)}return this.#rawHead.slice(e,t)}for(;this.#fullRawLength-this.#rawTail.length>e;){var a=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,a=await this.mobi.loadText(a);this.#rawTail=Xe(a,this.#rawTail)}r=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(e-r,t-r)}loadFlow(e){if(e<4294967295)return this.loadRaw(...this.#tables.fdstTable[e])}async loadText(e){var{skel:t,frags:i,length:e}=e;const r=await this.loadRaw(t.offset,t.offset+e);let n=r.slice(0,t.length);for(const c of i){var a=c.insertOffset-t.offset,s=t.length+c.offset,o=r.slice(s,s+c.length);n=qe(n.slice(0,a),o,n.slice(a));a=this.#fragmentOffsets.get(c.index);if(a)for(const d of a){var l=this.mobi.decode(o).slice(d),l=ht(l);this.#setFragmentSelector(c.index,d,l)}}return this.mobi.decode(n)}async createDocument(e){e=await this.loadText(e);return this.parser.parseFromString(e,this.#type)}async loadSection(e){if(this.#cache.has(e))return this.#cache.get(e);var t=await this.loadText(e);this.#checkType&&this.parser.parseFromString(t,this.#type).querySelector("parsererror")&&(this.#type=Ae.HTML),this.#checkType&&(this.#checkType=!1);t=await this.replaceResources(t),t=URL.createObjectURL(new Blob([t],{type:this.#type}));return this.#cache.set(e,t),t}getIndexByFID(t){return this.#sections.findIndex(e=>e.frags.some(e=>e.index===t))}#setFragmentSelector(e,t,i){const r=this.#fragmentSelectors.get(e);if(r)r.set(t,i);else{const r=new Map;this.#fragmentSelectors.set(e,r),r.set(t,i)}}async resolveHref(e){const{fid:t,off:i}=ct(e);var r=this.getIndexByFID(t);if(!(r<0)){const a=this.#fragmentSelectors.get(t)?.get(i);if(a)return{index:r,anchor:e=>e.querySelector(a)};const{skel:s,frags:o}=this.#sections[r];var n=o.find(e=>e.index===t),e=s.offset+s.length+n.offset,n=await this.loadRaw(e,e+n.length),n=this.mobi.decode(n).slice(i);const l=ht(n);this.#setFragmentSelector(t,i,l);return{index:r,anchor:e=>e.querySelector(l)}}}splitTOCHref(e){e=ct(e);return[this.getIndexByFID(e.fid),e]}getTOCFragment(e,{fid:t,off:i}){i=this.#fragmentSelectors.get(t)?.get(i);return e.querySelector(i)}isExternal(e){return/^(?!blob|kindle)\w+:/i.test(e)}}const ft=({entries:e,loadBlob:r,getSize:t},i)=>{const n=new Map,a=new Map,s=[".jpg",".jpeg",".png",".gif",".bmp",".webp",".svg"],o=e.map(e=>e.filename).filter(t=>s.some(e=>t.endsWith(e))).sort(),l={getCover:()=>r(o[0])};return l.metadata={title:i.name},l.sections=o.map(e=>({id:e,load:()=>(async e=>{if(n.has(e))return n.get(e);var t=URL.createObjectURL(await r(e)),i=URL.createObjectURL(new Blob([`<img src="${t}">`],{type:"text/html"}));return a.set(e,[t,i]),n.set(e,i),i})(e),unload:()=>(e=>{a.get(e)?.forEach?.(e=>URL.revokeObjectURL(e)),a.delete(e),n.delete(e)})(e),size:t(e)})),l.toc=o.map(e=>({label:e,href:e})),l.rendition={layout:"pre-paginated"},l.resolveHref=t=>({index:l.sections.findIndex(e=>e.id===t)}),l.splitTOCHref=e=>[e,null],l.getTOCFragment=e=>e.documentElement,l};const mt=e=>e?.trim()?.replace(/\s{2,}/g," "),pt=e=>mt(e?.textContent),gt={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},yt={XML:"application/xml",XHTML:"application/xhtml+xml"},bt={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"};const vt={epigraph:["blockquote"],subtitle:["h2",bt],"text-author":["p",bt],date:["p",bt],stanza:"stanza"},wt={title:["header",{p:["h1",bt],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",bt],poem:["blockquote",vt],subtitle:["h2",bt],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",bt]};vt.epigraph.push(wt);const xt={image:"image",title:["section",{p:["h1",bt],"empty-line":["br"]}],epigraph:["section",wt],section:["section",wt]},Tt=e=>{const t=e.getAttributeNS(gt.XLINK,"href");var[,i]=t.split("#");const r=e.getRootNode().getElementById(i);return r?`data:${r.getAttribute("content-type")};base64,${r.textContent}`:t};class Ct{constructor(e){this.fb2=e,this.doc=document.implementation.createDocument(gt.XHTML,"html")}image(e){const t=this.doc.createElement("img");return t.alt=e.getAttribute("alt"),t.title=e.getAttribute("title"),t.setAttribute("src",Tt(e)),t}anchor(e){const t=this.convert(e,{a:["a",bt]});return t.setAttribute("href",e.getAttributeNS(gt.XLINK,"href")),"note"===e.getAttribute("type")&&t.setAttributeNS(gt.EPUB,"epub:type","noteref"),t}stanza(e){const t=this.convert(e,{stanza:["p",{title:["header",{p:["strong",bt],"empty-line":["br"]}],subtitle:["p",bt]}]});for(const i of e.children)"v"===i.nodeName&&(t.append(this.doc.createTextNode(i.textContent)),t.append(this.doc.createElement("br")));return t}convert(e,t){if(3===e.nodeType)return this.doc.createTextNode(e.textContent);if(4===e.nodeType)return this.doc.createCDATASection(e.textContent);if(8===e.nodeType)return this.doc.createComment(e.textContent);var i=t?.[e.nodeName];if(!i)return null;if("string"==typeof i)return this[i](e);var[r,i]=i;const n=this.doc.createElement(r);if(e.id&&(n.id=e.id),n.classList.add(e.nodeName),Array.isArray(i))for(const l of i)n.setAttribute(l,e.getAttribute(l));var a="self"===i?t:Array.isArray(i)?null:i;let s=e.firstChild;for(;s;){var o=this.convert(s,a);o&&n.append(o),s=s.nextSibling}return n}}const kt=URL.createObjectURL(new Blob([` + }`)),await this.replaceResources(t);var i=this.serializer.serializeToString(t),i=URL.createObjectURL(new Blob([i],{type:this.#type}));return this.#cache.set(e,i),i}resolveHref(e){const t=e.match(/filepos:(.*)/)[1],r=Number(t);return{index:this.#sections.findIndex(e=>e.end>r),anchor:e=>e.getElementById(`filepos${t}`)}}splitTOCHref(e){e=e.match(/filepos:(.*)/)[1];const t=Number(e);return[this.#sections.findIndex(e=>e.end>t),`filepos${e}`]}getTOCFragment(e,t){return e.getElementById(t)}isExternal(e){return/^(?!blob|filepos)\w+:/i.test(e)}}const lt=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,ct=/kindle:pos:fid:(\w+):off:(\w+)/,dt=e=>{var[t,e]=e.match(ct).slice(1);return{fid:parseInt(t,32),off:parseInt(e,32)}},ht=(e=0,t=0)=>`kindle:pos:fid:${e.toString(32).toUpperCase().padStart(4,"0")}:off:${t.toString(32).toUpperCase().padStart(10,"0")}`,ut=e=>{var t=e.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(t){var[,e,t]=t;return`[${e}="${CSS.escape(t)}"]`}};class ft{parser=new DOMParser;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#checkType=!0;#type=Ie.XHTML;constructor(e){this.mobi=e}async init(){const e=this.mobi.loadRecord.bind(this.mobi);var t=this.mobi.headers["kf8"];try{const l=await e(t.fdst);var r=Ve(Pe,l);if("FDST"!==r.magic)throw new Error("Missing FDST record");var i=Array.from({length:r.numEntries},(e,t)=>12+8*t).map(e=>[Je(l.slice(e,e+4)),Je(l.slice(e+4,e+8))]);this.#tables.fdstTable=i,this.#fullRawLength=i[i.length-1][1]}catch{}const n=(await it(t.skel,e)).table.map(({name:e,tagMap:t},r)=>({index:r,name:e,numFrag:t[1][0],offset:t[6][0],length:t[6][1]})),a=await it(t.frag,e),s=a.table.map(({name:e,tagMap:t})=>({insertOffset:parseInt(e),selector:a.cncx[t[2][0]],index:t[4][0],offset:t[6][0],length:t[6][1]}));this.#tables.skelTable=n,this.#tables.fragTable=s,this.#sections=n.reduce((e,t)=>{var r=e[e.length-1],i=r?.fragEnd??0,n=i+t.numFrag;const a=s.slice(i,n);i=t.length+a.map(e=>e.length).reduce((e,t)=>e+t);return e.concat({skel:t,frags:a,fragEnd:n,length:i,totalLength:(r?.totalLength??0)+i})},[]),this.#sections.unshift({frags:[]}),this.sections=this.#sections.map((e,t)=>e.frags.length?{id:t,load:()=>this.loadSection(e),createDocument:()=>this.createDocument(e),size:e.length}:{linear:"no"});try{const c=await this.mobi.getNCX(),d=({label:e,pos:t,children:r})=>{var[i,n]=t,t=ht(i,n);const a=this.#fragmentOffsets.get(i);return a?a.push(n):this.#fragmentOffsets.set(i,[n]),{label:Ee(e),href:t,subitems:r?.map(d)}};this.toc=c?.map(d),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const o=this.mobi.headers["exth"];return this.dir=o.pageProgressionDirection,this.rendition={layout:"true"===o.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(o.originalResolution?.split("x")?.slice(0,2)?.map((e,t)=>[t?"height":"width",e])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(t){const r={};var i=this.mobi.headers.kf8.resourceStart,n=this.mobi.pdb.numRecords;for(let e=i;e<n;e++)try{const s=await this.mobi.loadMagic(e);var a=t.find(e=>e===s);a&&(r[a]=e)}catch{}return r}async getGuide(){var e=this.mobi.headers.kf8.guide;if(e<4294967295){var t=this.mobi.loadRecord.bind(this.mobi);const{table:r,cncx:i}=await it(e,t);return r.map(({name:e,tagMap:t})=>({label:i[t[1][0]]??"",type:e?.split(/\s/),href:ht(t[6]?.[0]??t[3]?.[0])}))}}async loadResourceBlob(e){var{resourceType:t,id:r,type:e}=(e=>{var[t,r,e]=e.match(lt).slice(1);return{resourceType:t,id:parseInt(r,32),type:e}})(e),r="flow"===t?await this.loadFlow(r):await this.mobi.loadResource(r-1),r=[Ie.XHTML,Ie.HTML,Ie.CSS,Ie.SVG].includes(e)?await this.replaceResources(this.mobi.decode(r)):r;return new Blob([r],{type:e})}async loadResource(e){if(this.#cache.has(e))return this.#cache.get(e);var t=await this.loadResourceBlob(e),t=URL.createObjectURL(t);return this.#cache.set(e,t),t}replaceResources(e){return(async(e,t,r)=>{const i=[];e.replace(t,(...e)=>(i.push(e),null));const n=[];for(const a of i)n.push(await r(...a));return e.replace(t,()=>n.shift())})(e,new RegExp(lt,"g"),this.loadResource.bind(this))}async loadRaw(e,t){var r=t-this.#rawHead.length,i=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-e;if(r<0||r<i){for(;this.#rawHead.length<t;){var n=++this.#lastLoadedHead,n=await this.mobi.loadText(n);this.#rawHead=qe(this.#rawHead,n)}return this.#rawHead.slice(e,t)}for(;this.#fullRawLength-this.#rawTail.length>e;){var a=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,a=await this.mobi.loadText(a);this.#rawTail=qe(a,this.#rawTail)}i=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(e-i,t-i)}loadFlow(e){if(e<4294967295)return this.loadRaw(...this.#tables.fdstTable[e])}async loadText(e){var{skel:t,frags:r,length:e}=e;const i=await this.loadRaw(t.offset,t.offset+e);let n=i.slice(0,t.length);for(const c of r){var a=c.insertOffset-t.offset,s=t.length+c.offset,o=i.slice(s,s+c.length);n=Ke(n.slice(0,a),o,n.slice(a));a=this.#fragmentOffsets.get(c.index);if(a)for(const d of a){var l=this.mobi.decode(o).slice(d),l=ut(l);this.#setFragmentSelector(c.index,d,l)}}return this.mobi.decode(n)}async createDocument(e){e=await this.loadText(e);return this.parser.parseFromString(e,this.#type)}async loadSection(e){if(this.#cache.has(e))return this.#cache.get(e);var t=await this.loadText(e);this.#checkType&&this.parser.parseFromString(t,this.#type).querySelector("parsererror")&&(this.#type=Ie.HTML),this.#checkType&&(this.#checkType=!1);t=await this.replaceResources(t),t=URL.createObjectURL(new Blob([t],{type:this.#type}));return this.#cache.set(e,t),t}getIndexByFID(t){return this.#sections.findIndex(e=>e.frags.some(e=>e.index===t))}#setFragmentSelector(e,t,r){const i=this.#fragmentSelectors.get(e);if(i)i.set(t,r);else{const i=new Map;this.#fragmentSelectors.set(e,i),i.set(t,r)}}async resolveHref(e){const{fid:t,off:r}=dt(e);var i=this.getIndexByFID(t);if(!(i<0)){const a=this.#fragmentSelectors.get(t)?.get(r);if(a)return{index:i,anchor:e=>e.querySelector(a)};const{skel:s,frags:o}=this.#sections[i];var n=o.find(e=>e.index===t),e=s.offset+s.length+n.offset,n=await this.loadRaw(e,e+n.length),n=this.mobi.decode(n).slice(r);const l=ut(n);this.#setFragmentSelector(t,r,l);return{index:i,anchor:e=>e.querySelector(l)}}}splitTOCHref(e){e=dt(e);return[this.getIndexByFID(e.fid),e]}getTOCFragment(e,{fid:t,off:r}){r=this.#fragmentSelectors.get(t)?.get(r);return e.querySelector(r)}isExternal(e){return/^(?!blob|kindle)\w+:/i.test(e)}}const pt=({entries:e,loadBlob:i,getSize:t},r)=>{const n=new Map,a=new Map,s=[".jpg",".jpeg",".png",".gif",".bmp",".webp",".svg"],o=e.map(e=>e.filename).filter(t=>s.some(e=>t.endsWith(e))).sort(),l={getCover:()=>i(o[0])};return l.metadata={title:r.name},l.sections=o.map(e=>({id:e,load:()=>(async e=>{if(n.has(e))return n.get(e);var t=URL.createObjectURL(await i(e)),r=URL.createObjectURL(new Blob([`<img src="${t}">`],{type:"text/html"}));return a.set(e,[t,r]),n.set(e,r),r})(e),unload:()=>(e=>{a.get(e)?.forEach?.(e=>URL.revokeObjectURL(e)),a.delete(e),n.delete(e)})(e),size:t(e)})),l.toc=o.map(e=>({label:e,href:e})),l.rendition={layout:"pre-paginated"},l.resolveHref=t=>({index:l.sections.findIndex(e=>e.id===t)}),l.splitTOCHref=e=>[e,null],l.getTOCFragment=e=>e.documentElement,l};const mt=e=>e?.trim()?.replace(/\s{2,}/g," "),gt=e=>mt(e?.textContent),yt={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},bt={XML:"application/xml",XHTML:"application/xhtml+xml"},vt={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"};const wt={epigraph:["blockquote"],subtitle:["h2",vt],"text-author":["p",vt],date:["p",vt],stanza:"stanza"},xt={title:["header",{p:["h1",vt],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",vt],poem:["blockquote",wt],subtitle:["h2",vt],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",vt]};wt.epigraph.push(xt);const Ct={image:"image",title:["section",{p:["h1",vt],"empty-line":["br"]}],epigraph:["section",xt],section:["section",xt]},Tt=e=>{const t=e.getAttributeNS(yt.XLINK,"href");var[,r]=t.split("#");const i=e.getRootNode().getElementById(r);return i?`data:${i.getAttribute("content-type")};base64,${i.textContent}`:t};class kt{constructor(e){this.fb2=e,this.doc=document.implementation.createDocument(yt.XHTML,"html")}image(e){const t=this.doc.createElement("img");return t.alt=e.getAttribute("alt"),t.title=e.getAttribute("title"),t.setAttribute("src",Tt(e)),t}anchor(e){const t=this.convert(e,{a:["a",vt]});return t.setAttribute("href",e.getAttributeNS(yt.XLINK,"href")),"note"===e.getAttribute("type")&&t.setAttributeNS(yt.EPUB,"epub:type","noteref"),t}stanza(e){const t=this.convert(e,{stanza:["p",{title:["header",{p:["strong",vt],"empty-line":["br"]}],subtitle:["p",vt]}]});for(const r of e.children)"v"===r.nodeName&&(t.append(this.doc.createTextNode(r.textContent)),t.append(this.doc.createElement("br")));return t}convert(e,t){if(3===e.nodeType)return this.doc.createTextNode(e.textContent);if(4===e.nodeType)return this.doc.createCDATASection(e.textContent);if(8===e.nodeType)return this.doc.createComment(e.textContent);var r=t?.[e.nodeName];if(!r)return null;if("string"==typeof r)return this[r](e);var[i,r]=r;const n=this.doc.createElement(i);if(e.id&&(n.id=e.id),n.classList.add(e.nodeName),Array.isArray(r))for(const l of r)n.setAttribute(l,e.getAttribute(l));var a="self"===r?t:Array.isArray(r)?null:r;let s=e.firstChild;for(;s;){var o=this.convert(s,a);o&&n.append(o),s=s.nextSibling}return n}}const Lt=URL.createObjectURL(new Blob([` @namespace epub "http://www.idpf.org/2007/ops"; body > img, section > img { display: block; @@ -49,8 +49,8 @@ a[epub|type~="noteref"] { body:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph { margin: 3em 0; } -`],{type:"text/css"})),Lt="data-foliate-id",St=async e=>{const t={},i=await(async e=>{var t=await e.arrayBuffer();const i=new TextDecoder("utf-8").decode(t),r=new DOMParser;e=r.parseFromString(i,yt.XML);const n=e.xmlEncoding||i.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(n&&"utf-8"!==n.toLowerCase()){const i=new TextDecoder(n).decode(t);return r.parseFromString(i,yt.XML)}return e})(e),r=new Ct(i),n=e=>i.querySelector(e);var a=e=>[...i.querySelectorAll(e)],s=e=>{var t=pt(e.querySelector("nickname"));if(t)return t;const i=pt(e.querySelector("first-name")),r=pt(e.querySelector("middle-name")),n=pt(e.querySelector("last-name"));return{name:[i,r,n].filter(e=>e).join(" "),sortAs:n?[n,[i,r].filter(e=>e).join(" ")].join(", "):null}},o=e=>e?.getAttribute("value")??pt(e),e=n("title-info annotation");t.metadata={title:pt(n("title-info book-title")),identifier:pt(n("document-info id")),language:pt(n("title-info lang")),author:a("title-info author").map(s),translator:a("title-info translator").map(s),producer:a("document-info author").map(s).concat(a("document-info program-used").map(pt)),publisher:pt(n("publish-info publisher")),published:o(n("title-info date")),modified:o(n("document-info date")),description:e?r.convert(e,{annotation:["div",wt]}).innerHTML:null,subject:a("title-info genre").map(pt)},t.getCover=()=>fetch(Tt(n("coverpage image"))).then(e=>e.blob());const l=Array.from(i.querySelectorAll("body"),e=>{e=r.convert(e,{body:["body",xt]});return[Array.from(e.children,e=>{var t=[e,...e.querySelectorAll("[id]")].map(e=>e.id);return{el:e,ids:t}}),e]}),c=l[0][0].map(({el:e,ids:t})=>{return{ids:t,titles:Array.from(e.querySelectorAll(":scope > section > .title"),(e,t)=>(e.setAttribute(Lt,t),{title:pt(e),index:t})),el:e}}).concat(l.slice(1).map(([e,t])=>{e=e.map(e=>e.ids).flat();return t.classList.add("notesBodyType"),{ids:e,el:t,linear:"no"}})).map(({ids:e,titles:t,el:i,linear:r})=>{const n=(a=i.outerHTML,`<?xml version="1.0" encoding="utf-8"?> +`],{type:"text/css"})),St="data-foliate-id",Bt=async e=>{const t={},r=await(async e=>{var t=await e.arrayBuffer();const r=new TextDecoder("utf-8").decode(t),i=new DOMParser;e=i.parseFromString(r,bt.XML);const n=e.xmlEncoding||r.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(n&&"utf-8"!==n.toLowerCase()){const r=new TextDecoder(n).decode(t);return i.parseFromString(r,bt.XML)}return e})(e),i=new kt(r),n=e=>r.querySelector(e);var a=e=>[...r.querySelectorAll(e)],s=e=>{var t=gt(e.querySelector("nickname"));if(t)return t;const r=gt(e.querySelector("first-name")),i=gt(e.querySelector("middle-name")),n=gt(e.querySelector("last-name"));return{name:[r,i,n].filter(e=>e).join(" "),sortAs:n?[n,[r,i].filter(e=>e).join(" ")].join(", "):null}},o=e=>e?.getAttribute("value")??gt(e),e=n("title-info annotation");t.metadata={title:gt(n("title-info book-title")),identifier:gt(n("document-info id")),language:gt(n("title-info lang")),author:a("title-info author").map(s),translator:a("title-info translator").map(s),producer:a("document-info author").map(s).concat(a("document-info program-used").map(gt)),publisher:gt(n("publish-info publisher")),published:o(n("title-info date")),modified:o(n("document-info date")),description:e?i.convert(e,{annotation:["div",xt]}).innerHTML:null,subject:a("title-info genre").map(gt)},t.getCover=()=>fetch(Tt(n("coverpage image"))).then(e=>e.blob());const l=Array.from(r.querySelectorAll("body"),e=>{e=i.convert(e,{body:["body",Ct]});return[Array.from(e.children,e=>{var t=[e,...e.querySelectorAll("[id]")].map(e=>e.id);return{el:e,ids:t}}),e]}),c=l[0][0].map(({el:e,ids:t})=>{return{ids:t,titles:Array.from(e.querySelectorAll(":scope > section > .title"),(e,t)=>(e.setAttribute(St,t),{title:gt(e),index:t})),el:e}}).concat(l.slice(1).map(([e,t])=>{e=e.map(e=>e.ids).flat();return t.classList.add("notesBodyType"),{ids:e,el:t,linear:"no"}})).map(({ids:e,titles:t,el:r,linear:i})=>{const n=(a=r.outerHTML,`<?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml"> - <head><link href="${kt}" rel="stylesheet" type="text/css"/></head> + <head><link href="${Lt}" rel="stylesheet" type="text/css"/></head> <body>${a}</body> -</html>`);var a=new Blob([n],{type:yt.XHTML});const s=URL.createObjectURL(a);return{ids:e,title:mt(i.querySelector(".title, .subtitle, p")?.textContent??(i.classList.contains("title")?i.textContent:"")),titles:t,load:()=>s,createDocument:()=>(new DOMParser).parseFromString(n,yt.XHTML),size:a.size-Array.from(i.querySelectorAll("[src]"),e=>e.getAttribute("src")?.length??0).reduce((e,t)=>e+t,0),linear:r}}),d=new Map;return t.sections=c.map((e,t)=>{var{ids:i,load:r,createDocument:n,size:a,linear:e}=e;for(const s of i)s&&d.set(s,t);return{id:t,load:r,createDocument:n,size:a,linear:e}}),t.toc=c.map(({title:e,titles:t},i)=>{const r=i.toString();return{label:e,href:r,subitems:t?.length?t.map(({title:e,index:t})=>({label:e,href:`${r}#${t}`})):null}}).filter(e=>e),t.resolveHref=e=>{const[t,i]=e.split("#");return t?{index:Number(t),anchor:e=>e.querySelector(`[${Lt}="${i}"]`)}:{index:d.get(i),anchor:e=>e.getElementById(i)}},t.splitTOCHref=e=>e?.split("#")?.map(e=>Number(e))??[],t.getTOCFragment=(e,t)=>e.querySelector(`[${Lt}="${t}"]`),t};window.e=window.eval,window.a=window.atob,e.ComicRender=class extends a{constructor(e,t,i){super(t,i),this.comicBuffer=e,this.mode=t,this.format=i,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc}renderTo(a){return new Promise((n,e)=>g(this,void 0,void 0,function*(){var e,t,i=new Blob([this.comicBuffer]),i=new File([i],"book."+this.format.toLocaleLowerCase(),{lastModified:(new Date).getTime(),type:i.type});"CBZ"===this.format?(e=yield this.makeZipLoader(i),this.book=ft(e,i)):"CBT"===this.format?(e=yield this.makeTarLoader(),this.book=ft(e,i)):"CBR"===this.format?(this.rpc=yield window.RPC.new("./lib/libunrar/worker.js",{loaded:function(){console.log("loaded")},progressShow:function(e,t,i){console.log(i)}}),yield new Promise(e=>setTimeout(e,200)),t=yield this.makeRarLoader(),this.book=ft(t,i)):"CB7"===this.format&&(t=yield this.make7zLoader(),this.book=ft(t,i));let r=new M(this.book);this.element=a,this.chapterList=yield r.getChapter(this.book.toc),this.chapterDocList=yield r.getChapterDoc(),s(a),o(a,this.mode),this.trigger("rendered"),n()}))}makeZipLoader(c){return g(this,void 0,void 0,function*(){const{ZipReader:e,BlobReader:t,TextWriter:i,BlobWriter:r}=window.zip;window.zip.configure({useWebWorkers:!1});const n=new e(new t(c)),a=yield n.getEntries(),s=new Map(a.map(e=>[e.filename,e]));var o=i=>(e,...t)=>s.has(e)?i(s.get(e),...t):null,l=o(e=>e.getData(new i)),o=o((e,t)=>e.getData(new r(t)));return{entries:a,loadText:l,loadBlob:o,getSize:e=>{return null!==(e=null===(e=s.get(e))||void 0===e?void 0:e.uncompressedSize)&&void 0!==e?e:0}}})}makeTarLoader(){return g(this,void 0,void 0,function*(){const e=yield window.untar(this.comicBuffer),r=new Map(e.map(e=>[e.name,e]));var t=i=>(e,...t)=>r.has(e)?i(r.get(e),...t):null,i=t(e=>e.readAsString()),t=t((e,t)=>e.blob);return{entries:e.map(e=>({filename:e.name})),loadText:i,loadBlob:t,getSize:e=>{return null!==(e=null===(e=r.get(e))||void 0===e?void 0:e.size)&&void 0!==e?e:0}}})}makeRarLoader(){return g(this,void 0,void 0,function*(){return new Promise((n,e)=>{var t=[this.comicBuffer],i=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=t,this.rpc.unrar(i,null,0).then(e=>{var t=this.getRarEntries(e.ls);const r=new Map(Object.values(t).map(e=>[e.fullFileName,e]));var i=i=>(e,...t)=>r.has(e)?i(r.get(e),...t):null,e=i(e=>e.fullFileName),i=i((e,t)=>new Blob([e.fileContent]));n({entries:Object.values(t).map(e=>({filename:e.fullFileName})),loadText:e,loadBlob:i,getSize:e=>{return null!==(e=null===(e=r.get(e))||void 0===e?void 0:e.fileSize)&&void 0!==e?e:0}})}).catch(e=>{console.log(e)})})})}make7zLoader(){return g(this,void 0,void 0,function*(){var e="./lib/7z-wasm/7zz.wasm";if(!window.wasmBinary){const o=yield fetch(e,{credentials:"same-origin"});if(!o.ok)throw"failed to load wasm binary file at '"+e+"'";window.wasmBinary=yield o.arrayBuffer()}const t=yield window.SevenZip({wasmBinary:window.wasmBinary});var i=new Uint8Array(this.comicBuffer),r="archive.cb7",e=t.FS.open(r,"w+");t.FS.write(e,i,0,i.length),t.FS.close(e),t.callMain(["x",r]);const n=t.FS,a=this.get7zEntries(n.lookupPath("/").node),s=new Map(a.map(e=>[e.name,e]));e=i=>(e,...t)=>s.has(e)?i(s.get(e),...t):null,r=e(e=>e.name),e=e((e,t)=>new Blob([e.buffer]));return{entries:a.map(e=>({filename:e.name})),loadText:r,loadBlob:e,getSize:e=>{return null!==(e=null===(e=s.get(e))||void 0===e?void 0:e.packSize)&&void 0!==e?e:0}}})}getRarEntries(t){const e=Object.keys(t);let i=[];return e.forEach(e=>{"dir"===t[e].type?i=i.concat(this.getRarEntries(t[e].ls)):i.push({fullFileName:e,fileContent:t[e].fileContent,fileSize:t[e].fileSize})}),i}get7zEntries(e){const t=e.contents,i=Object.keys(t).filter(e=>"archive.cb7"!=e&&"dev"!=e&&"home"!=e&&"proc"!=e&&"tmp"!=e);let r=[];return i.forEach(e=>{t[e].isFolder?r=r.concat(this.get7zEntries(t[e])):r.push({name:e,buffer:t[e].contents,size:t[e].usedBytes})}),r}getMetadata(){return g(this,void 0,void 0,function*(){return new Promise((n,e)=>g(this,void 0,void 0,function*(){var e,t,i=new Blob([this.comicBuffer]),i=new File([i],"book",{lastModified:(new Date).getTime(),type:i.type});"CBZ"===this.format?(e=yield this.makeZipLoader(i),this.book=ft(e,i)):"CBT"===this.format?(e=yield this.makeTarLoader(),this.book=ft(e,i)):"CBR"===this.format?(this.rpc=yield window.RPC.new("./lib/libunrar/worker.js",{loaded:function(){console.log("loaded")},progressShow:function(e,t,i){console.log(i)}}),yield new Promise(e=>setTimeout(e,200)),t=yield this.makeRarLoader(),this.book=ft(t,i)):"CB7"===this.format&&(t=yield this.make7zLoader(),this.book=ft(t,i));var i=yield this.book.getCover(),r=new FileReader;r.readAsDataURL(i),r.onloadend=()=>{n({cover:r.result})}}))})}},e.EpubRender=class extends a{constructor(e,t){super(t,"EPUB"),this.epubBuffer=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.book="",this.element=""}renderTo(r){return new Promise((i,e)=>g(this,void 0,void 0,function*(){var e=new Blob([this.epubBuffer]),e=new File([e],"book",{lastModified:(new Date).getTime(),type:e.type}),e=yield this.makeZipLoader(e);this.book=yield new Be(e).init();let t=new M(this.book);this.element=r,this.chapterList=yield t.getChapter(this.book.toc),this.chapterDocList=yield t.getChapterDoc(),s(r),o(r,this.mode),this.trigger("rendered"),i()}))}makeZipLoader(c){return g(this,void 0,void 0,function*(){const{ZipReader:e,BlobReader:t,TextWriter:i,BlobWriter:r}=window.zip;window.zip.configure({useWebWorkers:!1});const n=new e(new t(c)),a=yield n.getEntries(),s=new Map(a.map(e=>[e.filename,e]));var o=i=>(e,...t)=>s.has(e)?i(s.get(e),...t):null,l=o(e=>e.getData(new i)),o=o((e,t)=>e.getData(new r(t)));return{entries:a,loadText:l,loadBlob:o,getSize:e=>{return null!==(e=null===(e=s.get(e))||void 0===e?void 0:e.uncompressedSize)&&void 0!==e?e:0}}})}getMetadata(){return g(this,void 0,void 0,function*(){var e=new Blob([this.epubBuffer]),e=new File([e],"book",{lastModified:(new Date).getTime(),type:e.type}),e=yield this.makeZipLoader(e);this.book=yield new Be(e).init();let t=new M(this.book);return yield t.getMetadata()})}},e.Fb2Render=class extends a{constructor(e,t){super(t,"FB2"),this.fb2Buffer=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.book="",this.element=""}renderTo(r){return new Promise((i,e)=>g(this,void 0,void 0,function*(){var e=new Blob([this.fb2Buffer]);this.book=yield St(e);let t=new M(this.book);this.element=r,this.chapterList=yield t.getChapter(this.book.toc),this.chapterDocList=yield t.getChapterDoc(),s(r),o(r,this.mode),this.trigger("rendered"),i()}))}getMetadata(){return g(this,void 0,void 0,function*(){var e=new Blob([this.fb2Buffer]);this.book=yield St(e);let t=new M(this.book);return yield t.getMetadata()})}},e.MobiRender=class extends a{constructor(e,t){super(t,"MOBI"),this.mobiBuffer=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.book="",this.element=""}renderTo(r){return new Promise((i,e)=>g(this,void 0,void 0,function*(){var t=new Blob([this.mobiBuffer]),t=new File([t],"book",{lastModified:(new Date).getTime(),type:t.type});if(yield(async e=>{return"BOOKMOBI"===Ze(await e.slice(60,68).arrayBuffer())})(t)){this.book=yield new rt({unzlib:window.fflate.unzlibSync}).open(t);let e=new M(this.book);this.element=r,this.chapterList=yield e.getChapter(this.book.toc),this.chapterDocList=yield e.getChapterDoc(),this.metadata=yield e.getMetadata(),s(r),o(r,this.mode),this.trigger("rendered"),i()}}))}getMetadata(){return g(this,void 0,void 0,function*(){var e=new Blob([this.mobiBuffer]),e=new File([e],"book",{lastModified:(new Date).getTime(),type:e.type});this.book=yield new rt({unzlib:window.fflate.unzlibSync}).open(e);let t=new M(this.book);return yield t.getMetadata()})}},e.StrRender=class extends a{constructor(e,t){super(t,"STR"),this.bookStr=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.element=""}renderTo(i){return new Promise((t,e)=>g(this,void 0,void 0,function*(){this.element=i,this.book=x(this.bookStr,!0);let e=new M(this.book);this.chapterList=yield e.getChapter(this.book.toc),this.chapterDocList=yield e.getChapterDoc(),s(i),o(i,this.mode),this.trigger("rendered"),t()}))}},e.TxtRender=class extends a{constructor(e,t,i){super(t,"TXT"),this.txtBuffer=e,this.encoding=i,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.bookStr="",this.element="",this.book=""}renderTo(r){return new Promise((i,e)=>g(this,void 0,void 0,function*(){this.element=r;var e=new TextDecoder(this.encoding).decode(this.txtBuffer);this.book=x(e,!0);let t=new M(this.book);this.chapterList=yield t.getChapter(this.book.toc),this.chapterDocList=yield t.getChapterDoc(),s(r),o(r,this.mode),this.trigger("rendered"),i()}))}},Object.defineProperty(e,"__esModule",{value:!0})}); +</html>`);var a=new Blob([n],{type:bt.XHTML});const s=URL.createObjectURL(a);return{ids:e,title:mt(r.querySelector(".title, .subtitle, p")?.textContent??(r.classList.contains("title")?r.textContent:"")),titles:t,load:()=>s,createDocument:()=>(new DOMParser).parseFromString(n,bt.XHTML),size:a.size-Array.from(r.querySelectorAll("[src]"),e=>e.getAttribute("src")?.length??0).reduce((e,t)=>e+t,0),linear:i}}),d=new Map;return t.sections=c.map((e,t)=>{var{ids:r,load:i,createDocument:n,size:a,linear:e}=e;for(const s of r)s&&d.set(s,t);return{id:t,load:i,createDocument:n,size:a,linear:e}}),t.toc=c.map(({title:e,titles:t},r)=>{const i=r.toString();return{label:e,href:i,subitems:t?.length?t.map(({title:e,index:t})=>({label:e,href:`${i}#${t}`})):null}}).filter(e=>e),t.resolveHref=e=>{const[t,r]=e.split("#");return t?{index:Number(t),anchor:e=>e.querySelector(`[${St}="${r}"]`)}:{index:d.get(r),anchor:e=>e.getElementById(r)}},t.splitTOCHref=e=>e?.split("#")?.map(e=>Number(e))??[],t.getTOCFragment=(e,t)=>e.querySelector(`[${St}="${t}"]`),t};window.e=window.eval,window.a=window.atob,e.ComicRender=class extends a{constructor(e,t,r){super(t,r),this.comicBuffer=e,this.mode=t,this.format=r,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc}renderTo(a){return new Promise((n,e)=>b(this,void 0,void 0,function*(){var e,t,r=new Blob([this.comicBuffer]),r=new File([r],"book."+this.format.toLocaleLowerCase(),{lastModified:(new Date).getTime(),type:r.type});"CBZ"===this.format?(e=yield this.makeZipLoader(r),this.book=pt(e,r)):"CBT"===this.format?(e=yield this.makeTarLoader(),this.book=pt(e,r)):"CBR"===this.format?(this.rpc=yield window.RPC.new("./lib/libunrar/worker.js",{loaded:function(){console.log("loaded")},progressShow:function(e,t,r){console.log(r)}}),yield new Promise(e=>setTimeout(e,200)),t=yield this.makeRarLoader(),this.book=pt(t,r)):"CB7"===this.format&&(t=yield this.make7zLoader(),this.book=pt(t,r));let i=new R(this.book);this.element=a,this.chapterList=yield i.getChapter(this.book.toc),this.chapterDocList=yield i.getChapterDoc(),s(a),o(a,this.mode),this.trigger("rendered"),n()}))}makeZipLoader(c){return b(this,void 0,void 0,function*(){const{ZipReader:e,BlobReader:t,TextWriter:r,BlobWriter:i}=window.zip;window.zip.configure({useWebWorkers:!1});const n=new e(new t(c)),a=yield n.getEntries(),s=new Map(a.map(e=>[e.filename,e]));var o=r=>(e,...t)=>s.has(e)?r(s.get(e),...t):null,l=o(e=>e.getData(new r)),o=o((e,t)=>e.getData(new i(t)));return{entries:a,loadText:l,loadBlob:o,getSize:e=>{return null!==(e=null===(e=s.get(e))||void 0===e?void 0:e.uncompressedSize)&&void 0!==e?e:0}}})}makeTarLoader(){return b(this,void 0,void 0,function*(){const e=yield window.untar(this.comicBuffer),i=new Map(e.map(e=>[e.name,e]));var t=r=>(e,...t)=>i.has(e)?r(i.get(e),...t):null,r=t(e=>e.readAsString()),t=t((e,t)=>e.blob);return{entries:e.map(e=>({filename:e.name})),loadText:r,loadBlob:t,getSize:e=>{return null!==(e=null===(e=i.get(e))||void 0===e?void 0:e.size)&&void 0!==e?e:0}}})}makeRarLoader(){return b(this,void 0,void 0,function*(){return new Promise((n,e)=>{var t=[this.comicBuffer],r=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=t,this.rpc.unrar(r,null,0).then(e=>{var t=this.getRarEntries(e.ls);const i=new Map(Object.values(t).map(e=>[e.fullFileName,e]));var r=r=>(e,...t)=>i.has(e)?r(i.get(e),...t):null,e=r(e=>e.fullFileName),r=r((e,t)=>new Blob([e.fileContent]));n({entries:Object.values(t).map(e=>({filename:e.fullFileName})),loadText:e,loadBlob:r,getSize:e=>{return null!==(e=null===(e=i.get(e))||void 0===e?void 0:e.fileSize)&&void 0!==e?e:0}})}).catch(e=>{console.log(e)})})})}make7zLoader(){return b(this,void 0,void 0,function*(){var e="./lib/7z-wasm/7zz.wasm";if(!window.wasmBinary){const o=yield fetch(e,{credentials:"same-origin"});if(!o.ok)throw"failed to load wasm binary file at '"+e+"'";window.wasmBinary=yield o.arrayBuffer()}const t=yield window.SevenZip({wasmBinary:window.wasmBinary});var r=new Uint8Array(this.comicBuffer),i="archive.cb7",e=t.FS.open(i,"w+");t.FS.write(e,r,0,r.length),t.FS.close(e),t.callMain(["x",i]);const n=t.FS,a=this.get7zEntries(n.lookupPath("/").node),s=new Map(a.map(e=>[e.name,e]));e=r=>(e,...t)=>s.has(e)?r(s.get(e),...t):null,i=e(e=>e.name),e=e((e,t)=>new Blob([e.buffer]));return{entries:a.map(e=>({filename:e.name})),loadText:i,loadBlob:e,getSize:e=>{return null!==(e=null===(e=s.get(e))||void 0===e?void 0:e.packSize)&&void 0!==e?e:0}}})}getRarEntries(t){const e=Object.keys(t);let r=[];return e.forEach(e=>{"dir"===t[e].type?r=r.concat(this.getRarEntries(t[e].ls)):r.push({fullFileName:e,fileContent:t[e].fileContent,fileSize:t[e].fileSize})}),r}get7zEntries(e){const t=e.contents,r=Object.keys(t).filter(e=>"archive.cb7"!=e&&"dev"!=e&&"home"!=e&&"proc"!=e&&"tmp"!=e);let i=[];return r.forEach(e=>{t[e].isFolder?i=i.concat(this.get7zEntries(t[e])):i.push({name:e,buffer:t[e].contents,size:t[e].usedBytes})}),i}getMetadata(){return b(this,void 0,void 0,function*(){return new Promise((n,e)=>b(this,void 0,void 0,function*(){var e,t,r=new Blob([this.comicBuffer]),r=new File([r],"book",{lastModified:(new Date).getTime(),type:r.type});"CBZ"===this.format?(e=yield this.makeZipLoader(r),this.book=pt(e,r)):"CBT"===this.format?(e=yield this.makeTarLoader(),this.book=pt(e,r)):"CBR"===this.format?(this.rpc=yield window.RPC.new("./lib/libunrar/worker.js",{loaded:function(){console.log("loaded")},progressShow:function(e,t,r){console.log(r)}}),yield new Promise(e=>setTimeout(e,200)),t=yield this.makeRarLoader(),this.book=pt(t,r)):"CB7"===this.format&&(t=yield this.make7zLoader(),this.book=pt(t,r));var r=yield this.book.getCover(),i=new FileReader;i.readAsDataURL(r),i.onloadend=()=>{n({cover:i.result})}}))})}},e.EpubRender=class extends a{constructor(e,t){super(t,"EPUB"),this.epubBuffer=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.book="",this.element=""}renderTo(i){return new Promise((r,e)=>b(this,void 0,void 0,function*(){var e=new Blob([this.epubBuffer]),e=new File([e],"book",{lastModified:(new Date).getTime(),type:e.type}),e=yield this.makeZipLoader(e);this.book=yield new Ae(e).init();let t=new R(this.book);this.element=i,this.chapterList=yield t.getChapter(this.book.toc),this.chapterDocList=yield t.getChapterDoc(),s(i),o(i,this.mode),this.trigger("rendered"),r()}))}makeZipLoader(c){return b(this,void 0,void 0,function*(){const{ZipReader:e,BlobReader:t,TextWriter:r,BlobWriter:i}=window.zip;window.zip.configure({useWebWorkers:!1});const n=new e(new t(c)),a=yield n.getEntries(),s=new Map(a.map(e=>[e.filename,e]));var o=r=>(e,...t)=>s.has(e)?r(s.get(e),...t):null,l=o(e=>e.getData(new r)),o=o((e,t)=>e.getData(new i(t)));return{entries:a,loadText:l,loadBlob:o,getSize:e=>{return null!==(e=null===(e=s.get(e))||void 0===e?void 0:e.uncompressedSize)&&void 0!==e?e:0}}})}getMetadata(){return b(this,void 0,void 0,function*(){var e=new Blob([this.epubBuffer]),e=new File([e],"book",{lastModified:(new Date).getTime(),type:e.type}),e=yield this.makeZipLoader(e);this.book=yield new Ae(e).init();let t=new R(this.book);return yield t.getMetadata()})}},e.Fb2Render=class extends a{constructor(e,t){super(t,"FB2"),this.fb2Buffer=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.book="",this.element=""}renderTo(i){return new Promise((r,e)=>b(this,void 0,void 0,function*(){var e=new Blob([this.fb2Buffer]);this.book=yield Bt(e);let t=new R(this.book);this.element=i,this.chapterList=yield t.getChapter(this.book.toc),this.chapterDocList=yield t.getChapterDoc(),s(i),o(i,this.mode),this.trigger("rendered"),r()}))}getMetadata(){return b(this,void 0,void 0,function*(){var e=new Blob([this.fb2Buffer]);this.book=yield Bt(e);let t=new R(this.book);return yield t.getMetadata()})}},e.MobiRender=class extends a{constructor(e,t){super(t,"MOBI"),this.mobiBuffer=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.book="",this.element=""}renderTo(i){return new Promise((r,e)=>b(this,void 0,void 0,function*(){var t=new Blob([this.mobiBuffer]),t=new File([t],"book",{lastModified:(new Date).getTime(),type:t.type});if(yield(async e=>{return"BOOKMOBI"===Ge(await e.slice(60,68).arrayBuffer())})(t)){this.book=yield new nt({unzlib:window.fflate.unzlibSync}).open(t);let e=new R(this.book);this.element=i,this.chapterList=yield e.getChapter(this.book.toc),this.chapterDocList=yield e.getChapterDoc(),this.metadata=yield e.getMetadata(),s(i),o(i,this.mode),this.trigger("rendered"),r()}}))}getMetadata(){return b(this,void 0,void 0,function*(){var e=new Blob([this.mobiBuffer]),e=new File([e],"book",{lastModified:(new Date).getTime(),type:e.type});this.book=yield new nt({unzlib:window.fflate.unzlibSync}).open(e);let t=new R(this.book);return yield t.getMetadata()})}},e.StrRender=class extends a{constructor(e,t){super(t,"STR"),this.bookStr=e,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.element=""}renderTo(r){return new Promise((t,e)=>b(this,void 0,void 0,function*(){this.element=r,this.book=m(this.bookStr,!0);let e=new R(this.book);this.chapterList=yield e.getChapter(this.book.toc),this.chapterDocList=yield e.getChapterDoc(),s(r),o(r,this.mode),this.trigger("rendered"),t()}))}},e.TxtRender=class extends a{constructor(e,t,r){super(t,"TXT"),this.txtBuffer=e,this.encoding=r,this.mode=t,this.chapterList=[],this.chapterDocList=[],this.bookStr="",this.element="",this.book=""}renderTo(i){return new Promise((r,e)=>b(this,void 0,void 0,function*(){this.element=i;var e=new TextDecoder(this.encoding).decode(this.txtBuffer);this.book=m(e,!0);let t=new R(this.book);this.chapterList=yield t.getChapter(this.book.toc),this.chapterDocList=yield t.getChapterDoc(),s(i),o(i,this.mode),this.trigger("rendered"),r()}))}},Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/src/assets/locales/cn/translation.json b/src/assets/locales/cn/translation.json index 3bb97b23..58a679ec 100644 --- a/src/assets/locales/cn/translation.json +++ b/src/assets/locales/cn/translation.json @@ -90,6 +90,7 @@ "Descend": "降序", "Ascend": "升序", "Sort by Name": "按书名", + "Turn on Bionic Reading": "开启仿生阅读", "Token": "凭证", "Book not exist": "书籍不存在", "Please authorize your account, and fill the following box with the token": "登录授权后,您将获得一串代码,请将代码填入以下输入框即可完成绑定", diff --git a/src/assets/locales/en/translation.json b/src/assets/locales/en/translation.json index 7c3932d6..b67c2f97 100644 --- a/src/assets/locales/en/translation.json +++ b/src/assets/locales/en/translation.json @@ -103,6 +103,7 @@ "Open url with built-in browser": "Open url with built-in browser", "Light Mode": "Light Mode", "Night Mode": "Night Mode", + "Turn on Bionic Reading": "Turn on Bionic Reading", "Follow OS": "Follow OS", "Use first page as PDF cover": "Use first page as PDF cover", "You may see this error when the book you're importing is not supported by Koodo Reader, try converting it with Calibre": "You may see this error when the book you're importing is not supported by Koodo Reader, try converting it with Calibre", diff --git a/src/components/deleteIcon/component.tsx b/src/components/deleteIcon/component.tsx index 42ef22a8..81a8825c 100644 --- a/src/components/deleteIcon/component.tsx +++ b/src/components/deleteIcon/component.tsx @@ -28,6 +28,7 @@ class DeleteIcon extends React.Component<DeleteIconProps, DeleteIconStates> { deleteItems.forEach((item: any, index: number) => { if (this.props.mode === "tags") { item === this.props.tagName && TagUtil.clear(item); + this.handleDeleteTagFromNote(item); return; } if (item.key === this.props.itemKey) { @@ -56,6 +57,17 @@ class DeleteIcon extends React.Component<DeleteIconProps, DeleteIconStates> { } }); }; + handleDeleteTagFromNote = (tagName: string) => { + let noteList = this.props.notes.map((item) => { + return { + ...item, + tag: item.tag.filter((subitem) => subitem !== tagName), + }; + }); + localforage.setItem("notes", noteList).then(() => { + this.props.handleFetchNotes(); + }); + }; handleDeletePopup = (isOpenDelete: boolean) => { this.setState({ isOpenDelete }); if (!isOpenDelete) { diff --git a/src/components/readerSettings/settingSwitch/component.tsx b/src/components/readerSettings/settingSwitch/component.tsx index 61ac360a..83ac22ca 100644 --- a/src/components/readerSettings/settingSwitch/component.tsx +++ b/src/components/readerSettings/settingSwitch/component.tsx @@ -20,6 +20,7 @@ class SettingSwitch extends React.Component< isShadow: StorageUtil.getReaderConfig("isShadow") === "yes", isItalic: StorageUtil.getReaderConfig("isItalic") === "yes", isInvert: StorageUtil.getReaderConfig("isInvert") === "yes", + isBionic: StorageUtil.getReaderConfig("isBionic") === "yes", isHideBackground: StorageUtil.getReaderConfig("isHideBackground") === "yes", isHideFooter: StorageUtil.getReaderConfig("isHideFooter") === "yes", @@ -99,6 +100,9 @@ class SettingSwitch extends React.Component< case "isInvert": this._handleChange("isInvert"); break; + case "isBionic": + this._handleChange("isBionic"); + break; case "isHideFooter": this.handleChange("isHideFooter"); break; diff --git a/src/components/readerSettings/settingSwitch/interface.tsx b/src/components/readerSettings/settingSwitch/interface.tsx index cc3d9b28..66e956ca 100644 --- a/src/components/readerSettings/settingSwitch/interface.tsx +++ b/src/components/readerSettings/settingSwitch/interface.tsx @@ -18,6 +18,7 @@ export interface SettingSwitchState { isUnderline: boolean; isItalic: boolean; isInvert: boolean; + isBionic: boolean; isHideHeader: boolean; isHidePageButton: boolean; isHideMenuButton: boolean; diff --git a/src/components/searchBox/searchBox.css b/src/components/searchBox/searchBox.css index 82e7da66..d14d75b1 100644 --- a/src/components/searchBox/searchBox.css +++ b/src/components/searchBox/searchBox.css @@ -1,7 +1,7 @@ .header-search-box { width: 150px; height: 38px; - border-radius: 19px; + border-radius: 22px; border-style: none; outline: none; padding-left: 20px; diff --git a/src/components/selectBook/component.tsx b/src/components/selectBook/component.tsx index 875bbd85..23922307 100644 --- a/src/components/selectBook/component.tsx +++ b/src/components/selectBook/component.tsx @@ -103,4 +103,4 @@ class SelectBook extends React.Component<BookListProps, BookListState> { } } -export default withRouter(SelectBook); +export default withRouter(SelectBook as any); diff --git a/src/components/textToSpeech/component.tsx b/src/components/textToSpeech/component.tsx index 3d67437d..4465365a 100644 --- a/src/components/textToSpeech/component.tsx +++ b/src/components/textToSpeech/component.tsx @@ -125,27 +125,44 @@ class TextToSpeech extends React.Component< } }; async handleRead() { - let text = this.state.nodeList[this.state.nodeIndex]; + let currentText = this.state.nodeList[this.state.nodeIndex]; + let style = "background: #f3a6a68c"; - this.props.htmlBook.rendition.highlightNode(text, style); - text = text + this.props.htmlBook.rendition.highlightNode(currentText, style); + currentText = currentText .replace(/\s\s/g, "") .replace(/\r/g, "") .replace(/\n/g, "") .replace(/\t/g, "") .replace(/\f/g, ""); + let nextText = ""; + if (this.state.nodeIndex < this.state.nodeList.length - 1) { + nextText = this.state.nodeList[this.state.nodeIndex + 1]; + nextText = nextText + .replace(/\s\s/g, "") + .replace(/\r/g, "") + .replace(/\n/g, "") + .replace(/\t/g, "") + .replace(/\f/g, ""); + } await this.handleSpeech( - text, + currentText, + nextText, StorageUtil.getReaderConfig("voiceIndex") || 0, StorageUtil.getReaderConfig("voiceSpeed") || 1 ); this.setState({ nodeIndex: this.state.nodeIndex + 1 }); } - handleSpeech = async (text: string, voiceIndex: number, speed: number) => { + handleSpeech = async ( + currentText: string, + nextText: string, + voiceIndex: number, + speed: number + ) => { if (voiceIndex > this.state.nativeVoices.length) { let edgeVoice = this.state.edgeVoices[voiceIndex - this.state.nativeVoices.length]; - await EdgeUtil.readAloud(text, edgeVoice.ShortName); + await EdgeUtil.readAloud(currentText, nextText, edgeVoice.ShortName); let player = EdgeUtil.getPlayer(); player.onended = async (event) => { @@ -157,7 +174,7 @@ class TextToSpeech extends React.Component< }; } else { var msg = new SpeechSynthesisUtterance(); - msg.text = text; + msg.text = currentText; msg.voice = window.speechSynthesis.getVoices()[voiceIndex]; msg.rate = speed; window.speechSynthesis.speak(msg); diff --git a/src/constants/settingList.tsx b/src/constants/settingList.tsx index b2f75d92..bf4dbb4f 100644 --- a/src/constants/settingList.tsx +++ b/src/constants/settingList.tsx @@ -168,6 +168,10 @@ export const readerSettingList = [ title: "Invert color", propName: "isInvert", }, + { + title: "Turn on Bionic Reading", + propName: "isBionic", + }, { title: "Hide footer", propName: "isHideFooter", diff --git a/src/containers/htmlViewer/component.tsx b/src/containers/htmlViewer/component.tsx index a8d7afbb..b2dd7aa8 100644 --- a/src/containers/htmlViewer/component.tsx +++ b/src/containers/htmlViewer/component.tsx @@ -21,6 +21,7 @@ import { removeExtraQuestionMark } from "../../utils/commonUtil"; import CFI from "epub-cfi-resolver"; import mhtml2html from "mhtml2html"; import rtfToHTML from "@iarna/rtf-to-html"; +import { binicReadingProcess } from "../../utils/serviceUtils/bionicUtil"; declare var window: any; let lock = false; //prevent from clicking too fasts @@ -184,6 +185,7 @@ class Viewer extends React.Component<ViewerProps, ViewerState> { }); StyleUtil.addDefaultCss(); tsTransform(); + binicReadingProcess(); rendition.setStyle( StyleUtil.getCustomCss( true, @@ -277,6 +279,7 @@ class Viewer extends React.Component<ViewerProps, ViewerState> { this.handleContentScroll(chapter, bookLocation.chapterHref); StyleUtil.addDefaultCss(); tsTransform(); + binicReadingProcess(); this.handleBindGesture(); lock = true; setTimeout(function () { @@ -294,7 +297,9 @@ class Viewer extends React.Component<ViewerProps, ViewerState> { let contentList = contentBody.getElementsByTagName("a"); let targetContent = Array.from(contentList).filter((item, index) => { item.setAttribute("style", ""); - return item.textContent === chapter && index === chapterIndex; + return ( + item.textContent === chapter && Math.abs(index - chapterIndex) <= 1 + ); }); if (targetContent.length > 0) { contentBody.scrollTo(0, targetContent[0].offsetTop); diff --git a/src/containers/lists/bookList/component.tsx b/src/containers/lists/bookList/component.tsx index 065808f4..ef420eb8 100644 --- a/src/containers/lists/bookList/component.tsx +++ b/src/containers/lists/bookList/component.tsx @@ -108,7 +108,7 @@ class BookList extends React.Component<BookListProps, BookListState> { //返回排序后的图书index SortUtil.sortBooks(this.props.books, this.props.bookSortCode) || [] ); - if (this.props.mode === "shelf" && books.length === 0) { + if (books.length === 0) { return ( <div style={{ @@ -183,7 +183,9 @@ class BookList extends React.Component<BookListProps, BookListState> { <> <ViewMode /> <SelectBook /> - {!this.props.isSelectBook && <ShelfSelector />} + <div style={this.props.isSelectBook ? { display: "none" } : {}}> + <ShelfSelector /> + </div> <div className="book-list-container-parent" style={ diff --git a/src/containers/lists/navList/component.tsx b/src/containers/lists/navList/component.tsx index 657a122b..7a403f89 100644 --- a/src/containers/lists/navList/component.tsx +++ b/src/containers/lists/navList/component.tsx @@ -5,7 +5,6 @@ import { NavListProps, NavListState } from "./interface"; import DeleteIcon from "../../../components/deleteIcon"; import toast from "react-hot-toast"; import CFI from "epub-cfi-resolver"; -import StorageUtil from "../../../utils/serviceUtils/storageUtil"; class NavList extends React.Component<NavListProps, NavListState> { constructor(props: NavListProps) { super(props); @@ -15,6 +14,7 @@ class NavList extends React.Component<NavListProps, NavListState> { } //跳转到图书的指定位置 async handleJump(cfi: string) { + //书签跳转 if (!cfi) { toast(this.props.t("Wrong bookmark")); return; @@ -59,9 +59,7 @@ class NavList extends React.Component<NavListProps, NavListState> { cfi: bookLocation.cfi, }) ); - let style = - "background: " + - (StorageUtil.getReaderConfig("backgroundColor") || "#f3a6a68c"); + let style = "background: #f3a6a68c"; this.props.htmlBook.rendition.highlightNode(bookLocation.text, style); } } diff --git a/src/containers/panels/navigationPanel/component.tsx b/src/containers/panels/navigationPanel/component.tsx index 0ebd5e5b..0f9f26ed 100644 --- a/src/containers/panels/navigationPanel/component.tsx +++ b/src/containers/panels/navigationPanel/component.tsx @@ -105,10 +105,7 @@ class NavigationPanel extends React.Component< cfi: bookLocation.cfi, }) ); - let style = - "background: " + - (StorageUtil.getReaderConfig("backgroundColor") || - "#f3a6a68c"); + let style = "background: #f3a6a68c"; this.props.htmlBook.rendition.highlightNode( bookLocation.text, style diff --git a/src/containers/sidebar/component.tsx b/src/containers/sidebar/component.tsx index 2352b3c5..29437bf0 100644 --- a/src/containers/sidebar/component.tsx +++ b/src/containers/sidebar/component.tsx @@ -89,7 +89,11 @@ class Sidebar extends React.Component<SidebarProps, SidebarState> { ? `icon-${item.icon} active-icon` : `icon-${item.icon}` } - style={this.props.isCollapsed ? { marginLeft: "-25px" } : {}} + style={ + this.props.isCollapsed + ? { position: "fixed", marginLeft: "-6px" } + : {} + } ></span> </div> diff --git a/src/pages/manager/component.tsx b/src/pages/manager/component.tsx index 0c19b473..bd2c8908 100644 --- a/src/pages/manager/component.tsx +++ b/src/pages/manager/component.tsx @@ -21,11 +21,6 @@ import LoadingDialog from "../../components/dialogs/loadingDialog"; import TipDialog from "../../components/dialogs/TipDialog"; import { Toaster } from "react-hot-toast"; -//判断是否为触控设备 -const is_touch_device = () => { - return "ontouchstart" in window || navigator.maxTouchPoints > 0; -}; - class Manager extends React.Component<ManagerProps, ManagerState> { timer!: NodeJS.Timeout; constructor(props: ManagerProps) { @@ -74,9 +69,6 @@ class Manager extends React.Component<ManagerProps, ManagerState> { this.props.handleFetchList(); } componentDidMount() { - if (is_touch_device() && !StorageUtil.getReaderConfig("isTouch")) { - StorageUtil.setReaderConfig("isTouch", "yes"); - } this.props.handleReadingState(false); } @@ -85,7 +77,7 @@ class Manager extends React.Component<ManagerProps, ManagerState> { }; render() { let { books } = this.props; - if (isMobile) { + if (isMobile && document.location.href.indexOf("192.168") === -1) { return ( <> <p className="waring-title"> diff --git a/src/utils/readUtils/linkUtil.tsx b/src/utils/readUtils/linkUtil.tsx index 3ab7bb82..8ef0b202 100644 --- a/src/utils/readUtils/linkUtil.tsx +++ b/src/utils/readUtils/linkUtil.tsx @@ -27,7 +27,7 @@ export const handleLinkJump = async (event: any, rendition: any = {}) => { } if (href.indexOf("/#") === -1) { let chapterInfo = rendition.resolveChapter(href); - rendition.goToChapter( + await rendition.goToChapter( chapterInfo.index, chapterInfo.href, chapterInfo.title @@ -38,7 +38,7 @@ export const handleLinkJump = async (event: any, rendition: any = {}) => { await rendition.goToNode(doc.body.querySelector("#" + id) || doc.body); } else if (href && rendition.resolveChapter(href)) { let chapterInfo = rendition.resolveChapter(href); - rendition.goToChapter( + await rendition.goToChapter( chapterInfo.index, chapterInfo.href, chapterInfo.title diff --git a/src/utils/serviceUtils/bionicUtil.tsx b/src/utils/serviceUtils/bionicUtil.tsx new file mode 100644 index 00000000..a2639b51 --- /dev/null +++ b/src/utils/serviceUtils/bionicUtil.tsx @@ -0,0 +1,90 @@ +import { getIframeDoc } from "./docUtil"; +import StorageUtil from "./storageUtil"; + +/* Insert one Node after another Node */ +const insertAfter = (newNode, existingNode) => { + if (existingNode.nextSibling !== undefined) + existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling); + else existingNode.parentNode.appendChild(newNode); +}; + +/* process all children of a Node*/ +const HalfBold = (parentElement) => { + /* iterating through all children of the parent*/ + for (var i = 0; parentElement.childNodes[i] !== undefined; i++) { + /* if the child is a text element*/ + if ( + parentElement.childNodes[i].nodeName === "#text" && + parentElement.childNodes[i].textContent.trim().length !== 0 + ) { + var recentNode = parentElement.childNodes[i]; + var newNodeCount = 0; + /* add bold and non-bold elements*/ + parentElement.childNodes[i].textContent + .split(/(\s+|\S+)/) + // eslint-disable-next-line + .forEach((word) => { + if (word.length === 0) return; + var trimmedWordLength = word.trim().length; + if (trimmedWordLength === 0) { + let textNode = document.createTextNode(word); + insertAfter(textNode, recentNode); + newNodeCount++; + recentNode = textNode; + return; + } + + var length = Math.floor(trimmedWordLength / 2); + if (length === 0) length = 1; + + const bold = document.createElement("b"); + bold.innerHTML = word.slice(0, length); + insertAfter(bold, recentNode); + newNodeCount++; + recentNode = bold; + + if (word.length === 1) return; + let textNode = document.createTextNode(word.slice(length)); + insertAfter(textNode, recentNode); + newNodeCount++; + recentNode = textNode; + }); + /* and remove the original text element*/ + parentElement.removeChild(parentElement.childNodes[i]); + i += newNodeCount - 1; + } + } +}; + +/* a way to stop from processing certain nodes*/ +var ignoreTags = { + B: true, + META: true, + LINK: true, + SCRIPT: true, + STYLE: true, +}; + +export const processDocumentBody = (element) => { + /* we check all Nodes in the body*/ + if (element === null) return; + if (element.body === undefined) return; + var collection = element.body.getElementsByTagName("*"); + for (var i = 0; collection[i] !== undefined; i++) { + if (ignoreTags[collection[i].nodeName]) continue; + if (collection[i].nodeType !== 1) continue; + if (collection[i].nodeName === "IFRAME") { + processDocumentBody(collection[i].contentDocument); + } else { + if (collection[i].childNodes.length === 0) continue; + HalfBold(collection[i]); + } + } +}; +export const binicReadingProcess = () => { + let doc = getIframeDoc(); + if (!doc) return; + if (StorageUtil.getReaderConfig("isBionic") === "yes") { + processDocumentBody(doc); + } +}; diff --git a/src/utils/serviceUtils/edgeUtil.tsx b/src/utils/serviceUtils/edgeUtil.tsx index 1bc30b8a..46866c19 100644 --- a/src/utils/serviceUtils/edgeUtil.tsx +++ b/src/utils/serviceUtils/edgeUtil.tsx @@ -2,20 +2,32 @@ import { voiceList } from "../../constants/voiceList"; class EdgeUtil { static player: AudioBufferSourceNode; - //`<speak xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="http://www.w3.org/2001/mstts" xmlns:emo="http://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="en-US"> <voice name="zh-CN-XiaoxiaoNeural"> <prosody rate="0%" pitch="0%">如果喜欢这个项目的话请点个 Star 吧。</prosody ></voice > </speak >` - static async readAloud(text: string, voiceName: string) { - let audioBuffer = await window - .require("electron") - .ipcRenderer.invoke("edge-tts", { - text: this.createSSML(text, voiceName), + static currentAudioBuffer: any; + static nextAudioBuffer: any; + static async readAloud( + currentText: string, + nextText: string, + voiceName: string + ) { + let audioBuffer = + this.nextAudioBuffer || + (await window.require("electron").ipcRenderer.invoke("edge-tts", { + text: this.createSSML(currentText, voiceName), format: "", - }); + })); + let ctx = new AudioContext(); let audio = await ctx.decodeAudioData(this.toArrayBuffer(audioBuffer)); this.player = ctx.createBufferSource(); this.player.buffer = audio; this.player.connect(ctx.destination); this.player.start(ctx.currentTime); + this.nextAudioBuffer = + nextText && + (await window.require("electron").ipcRenderer.invoke("edge-tts", { + text: this.createSSML(nextText, voiceName), + format: "", + })); } static pauseAudio() { if (this.player && this.player.stop) { diff --git a/src/utils/serviceUtils/mouseEvent.tsx b/src/utils/serviceUtils/mouseEvent.tsx index f9d71930..0b0642c8 100644 --- a/src/utils/serviceUtils/mouseEvent.tsx +++ b/src/utils/serviceUtils/mouseEvent.tsx @@ -21,17 +21,14 @@ export const getSelection = () => { }; let lock = false; //prevent from clicking too fasts const arrowKeys = async (rendition: any, keyCode: number, event: any) => { - if ( - document.querySelector(".editor-box") || - document.querySelector(".navigation-search-title") - ) { + if (document.querySelector(".editor-box")) { return; } if (keyCode === 37 || keyCode === 38) { event.preventDefault(); await rendition.prev(); } - if (keyCode === 39 || keyCode === 40 || keyCode === 32) { + if (keyCode === 39 || keyCode === 40) { event.preventDefault(); await rendition.next(); }