diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index fb5e73e2..7cd0b55e 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|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,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={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)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={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"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={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"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={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"]},MOBI_LANG={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"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={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"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],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",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|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,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={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)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();if(0===rect.width||0===rect.height)return!1;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={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"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={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"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={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"]},MOBI_LANG={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"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={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"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],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",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/utils/common.ts b/src/utils/common.ts index 3798dd48..59165020 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1586,10 +1586,15 @@ export const splitSentences = (text: string, maxLength?: number) => { if (sentence.length <= resolvedMaxLength) return [sentence]; // Try splitting by common punctuation marks (Chinese and Western) - const parts = sentence - .split(/(?<=[,,;;::、…])/) - .map((s) => s.trim()) - .filter((s) => s.length > 0); + // Avoid lookbehind (?<=) which is unsupported on low-version iOS Safari + const rawParts = sentence.split(/([,,;;::、…])/); + const parts = [] as string[]; + for (let i = 0; i < rawParts.length; i += 2) { + const merged = (rawParts[i] + (rawParts[i + 1] ?? "")).trim(); + if (merged.length > 0) { + parts.push(merged); + } + } if (parts.length > 1) { // Greedily merge parts to minimize the number of resulting chunks diff --git a/src/utils/reader/mouseEvent.ts b/src/utils/reader/mouseEvent.ts index 100b920b..61352ea1 100644 --- a/src/utils/reader/mouseEvent.ts +++ b/src/utils/reader/mouseEvent.ts @@ -72,7 +72,12 @@ export const getSelectionSentence = ( let fullText = (el as Element)?.textContent || ""; let selectedText = sel.toString().trim(); // Split on sentence-ending punctuation to find the sentence - let sentences = fullText.split(/(?<=[.!?。!?])\s*/); + // Avoid lookbehind (?<=) which is unsupported on low-version iOS Safari + const rawParts = fullText.split(/([.!?。!?])\s*/); + const sentences: string[] = []; + for (let i = 0; i < rawParts.length; i += 2) { + sentences.push(rawParts[i] + (rawParts[i + 1] ?? "")); + } for (let s of sentences) { if (s.includes(selectedText)) { return s.trim();