diff --git a/package.json b/package.json index 8fc06e07b8..e4efee51e5 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "asar": "latest", "discord-rpc": "latest", "electron": "8.3.4", - "eslint": "latest", + "eslint": "^8.57.0", "fs-extra": "latest", "innosetup-compiler": "latest", "jest": "latest", @@ -35,7 +35,7 @@ "start:build": "npm run build:web && electron . --update-url=DISABLED --cache-directory=./build/latest", "lint": "npm run lint:app && npm run lint:web", "lint:app": "eslint ./src/app --ignore-path .gitignore", - "lint:web": "eslint ./src/web/mjs/**/*.mjs --ignore-path .gitignore --ignore-pattern Connectors.mjs", + "lint:web": "eslint ./src/web/mjs/**/*.mjs --ignore-path .gitignore --parser-options ecmaVersion:2020", "format": "npm run format:app && npm run format:web", "format:app": "npm run lint:app -- --fix", "format:web": "npm run lint:web -- --fix", diff --git a/src/web/img/connectors/ascalon b/src/web/img/connectors/ascalon new file mode 100644 index 0000000000..6180f25e16 Binary files /dev/null and b/src/web/img/connectors/ascalon differ diff --git a/src/web/img/connectors/assortedscans b/src/web/img/connectors/assortedscans deleted file mode 100644 index 0055fa7cf1..0000000000 Binary files a/src/web/img/connectors/assortedscans and /dev/null differ diff --git a/src/web/img/connectors/comicride b/src/web/img/connectors/comicride new file mode 100644 index 0000000000..ecf8170a46 Binary files /dev/null and b/src/web/img/connectors/comicride differ diff --git a/src/web/img/connectors/cypherscans b/src/web/img/connectors/cypherscans new file mode 100644 index 0000000000..e7e5c159af Binary files /dev/null and b/src/web/img/connectors/cypherscans differ diff --git a/src/web/img/connectors/doujinku b/src/web/img/connectors/doujinku new file mode 100644 index 0000000000..9657870c1c Binary files /dev/null and b/src/web/img/connectors/doujinku differ diff --git a/src/web/img/connectors/lyrascans b/src/web/img/connectors/lyrascans index 8d849fd845..54653db563 100644 Binary files a/src/web/img/connectors/lyrascans and b/src/web/img/connectors/lyrascans differ diff --git a/src/web/img/connectors/mangasusuku b/src/web/img/connectors/mangasusuku new file mode 100644 index 0000000000..855b568e87 Binary files /dev/null and b/src/web/img/connectors/mangasusuku differ diff --git a/src/web/img/connectors/monzeekomik b/src/web/img/connectors/monzeekomik new file mode 100644 index 0000000000..07bec10de5 Binary files /dev/null and b/src/web/img/connectors/monzeekomik differ diff --git a/src/web/img/connectors/nyrax b/src/web/img/connectors/nyrax new file mode 100644 index 0000000000..a7ef45daf2 Binary files /dev/null and b/src/web/img/connectors/nyrax differ diff --git a/src/web/img/connectors/perfscan b/src/web/img/connectors/perfscan new file mode 100644 index 0000000000..890abb7bdd Binary files /dev/null and b/src/web/img/connectors/perfscan differ diff --git a/src/web/img/connectors/prismascans b/src/web/img/connectors/prismascans index 38b6d87ee3..26faa7111b 100644 Binary files a/src/web/img/connectors/prismascans and b/src/web/img/connectors/prismascans differ diff --git a/src/web/img/connectors/randomscan b/src/web/img/connectors/randomscan index 92ef37ba7b..b14c57066a 100644 Binary files a/src/web/img/connectors/randomscan and b/src/web/img/connectors/randomscan differ diff --git a/src/web/img/connectors/summertoon b/src/web/img/connectors/summertoon new file mode 100644 index 0000000000..4cbf226aab Binary files /dev/null and b/src/web/img/connectors/summertoon differ diff --git a/src/web/img/connectors/templescan b/src/web/img/connectors/templescan new file mode 100644 index 0000000000..7c5c51b531 Binary files /dev/null and b/src/web/img/connectors/templescan differ diff --git a/src/web/mjs/connectors/AGS.mjs b/src/web/mjs/connectors/AGS.mjs new file mode 100644 index 0000000000..1362f8c795 --- /dev/null +++ b/src/web/mjs/connectors/AGS.mjs @@ -0,0 +1,32 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class AGS extends WordPressMangastream { + + constructor() { + super(); + super.id = 'ags'; + super.label = 'AGS (Animated Glitched Scans)'; + this.tags = [ 'manga', 'english', 'scanlation' ]; + this.url = 'https://agscomics.com'; + this.path = '/series/?list'; + } + + get icon() { + return '/img/connectors/anigliscans'; + } + + async _getPages(chapter) { + const data = await super._getPages(chapter); + return data.map(element => this.createConnectorURI(element)); + } + + async _handleConnectorURI(payload) { + const request = new Request(payload, this.requestOptions); + request.headers.set('x-referer', this.url); + let response = await fetch(request); + let data = await response.blob(); + data = await this._blobToBuffer(data); + this._applyRealMime(data); + return data; + } +} diff --git a/src/web/mjs/connectors/Ainzscans.mjs b/src/web/mjs/connectors/Ainzscans.mjs index 2b871c532c..9192334b13 100644 --- a/src/web/mjs/connectors/Ainzscans.mjs +++ b/src/web/mjs/connectors/Ainzscans.mjs @@ -7,7 +7,16 @@ export default class Ainzscans extends WordPressMangastream { super.id = 'ainzscans'; super.label = 'Ainz Scans'; this.tags = [ 'webtoon', 'indonesian', 'scanlation' ]; - this.url = 'https://ainzscans.site'; + this.url = 'https://ainzscans.net'; this.path = '/series/list-mode'; } + + async _getMangas() { + return (await super._getMangas()).map(manga => { + return { + id : manga.id, + title : manga.title.replace('Bahasa Indonesia', '').trim() + }; + }); + } } diff --git a/src/web/mjs/connectors/AlliedFansub.mjs b/src/web/mjs/connectors/AlliedFansub.mjs index bddd3971e7..2e6e3652f0 100644 --- a/src/web/mjs/connectors/AlliedFansub.mjs +++ b/src/web/mjs/connectors/AlliedFansub.mjs @@ -1,14 +1,13 @@ -import WordPressMangastream from './templates/WordPressMangastream.mjs'; +import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class AlliedFansub extends WordPressMangastream { +export default class AlliedFansub extends WordPressMadara { constructor() { super(); super.id = 'alliedfansub'; super.label = 'Allied Fansub'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://alliedfansub.online'; - this.path = '/manga/list-mode/'; + this.url = 'https://alliedfansub.net'; this.requestOptions.headers.set('x-referer', this.url); } } diff --git a/src/web/mjs/connectors/Ascalon.mjs b/src/web/mjs/connectors/Ascalon.mjs new file mode 100644 index 0000000000..114f739c02 --- /dev/null +++ b/src/web/mjs/connectors/Ascalon.mjs @@ -0,0 +1,12 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Ascalon extends WordPressMangastream { + constructor() { + super(); + super.id = 'ascalon'; + super.label = 'Ascalon'; + this.tags = ['webtoon', 'english', 'scanlation']; + this.url = 'https://ascalonscans.com'; + this.path = '/manga/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/AssortedScans.mjs b/src/web/mjs/connectors/AssortedScans.mjs deleted file mode 100644 index ea33e58599..0000000000 --- a/src/web/mjs/connectors/AssortedScans.mjs +++ /dev/null @@ -1,78 +0,0 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; - -export default class AssortedScans extends Connector { - constructor() { - super(); - super.id = 'assortedscans'; - super.label = 'assortedscans'; - this.tags = ['manga', 'english']; - this.url = 'https://assortedscans.com'; - } - - async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, '#series-title'); - const title = data['0'].text.trim(); - const id = uri.pathname + uri.search; - return Manga(this, id, title); - } - - async _getMangas() { - const request = new Request(new URL('/reader/', this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'section.series h2.series-title a'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.text.trim(), - }; - }); - } - - async _getChapters(manga) { - const id = this.getId(manga.id); - const request = new Request(new URL(id, this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'div.chapter > a'); - return data - .map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.title - }; - }); - } - - getId(url) { - return url.match(/\/reader\/.*\/?/)[0]; - } - - async _getMaxSite(chapterId) { - const id = this.getId(chapterId); - const request = new Request(new URL(id + '1/', this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'li.dropdown-element.page-details:last-child a'); - const maxSite = data['0'].text.match(/Page (\d+)/)[1]; - return [id, parseInt(maxSite)]; - } - - async _getPages(chapter) { - - const id = this.getId(chapter.id); - const request = new Request(new URL(id + '1/', this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'li.dropdown-element.page-details a'); - return data.map(element => { - const maxPage = element.text.match(/Page (\d+)/)[1]; - return this.createConnectorURI(this.url + id + maxPage); - }); - } - - async _handleConnectorURI(payload) { - const request = new Request(payload, this.requestOptions); - const data = await this.fetchDOM(request, 'source#page-image'); - const link = this.getAbsolutePath(data[0], request.url); - const response = await fetch(link, this.requestOptions); - const blob = await response.blob(); - const buffer = await this._blobToBuffer(blob); - this._applyRealMime(buffer); - return buffer; - } -} \ No newline at end of file diff --git a/src/web/mjs/connectors/AsuraScans.mjs b/src/web/mjs/connectors/AsuraScans.mjs index cb2586ad35..1800051fae 100644 --- a/src/web/mjs/connectors/AsuraScans.mjs +++ b/src/web/mjs/connectors/AsuraScans.mjs @@ -36,7 +36,8 @@ export default class AsuraScans extends WordPressMangastream { /panda_gif_large/i, /2021\/04\/page100-10\.jpg/i, /2021\/03\/20-ending-page-\.jpg/i, - /ENDING-PAGE/i + /ENDING-PAGE/i, + /EndDesignPSD/i ]; let images = []; diff --git a/src/web/mjs/connectors/AsuraScansTR.mjs b/src/web/mjs/connectors/AsuraScansTR.mjs index b0d23e77a7..7dcc0c84bf 100644 --- a/src/web/mjs/connectors/AsuraScansTR.mjs +++ b/src/web/mjs/connectors/AsuraScansTR.mjs @@ -1,31 +1,16 @@ -import WordPressMangastream from './templates/WordPressMangastream.mjs'; +import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class AsuraScansTR extends WordPressMangastream { +export default class AsuraScansTR extends WordPressMadara { constructor() { super(); super.id = 'asurascans-tr'; super.label = 'Asura Scans (TR)'; this.tags = ['webtoon', 'turkish']; - this.url = 'https://armoniscans.com'; - this.path = '/manga/list-mode/'; - this.queryPages = 'div#readerarea p img'; - this.requestOptions.headers.set('x-user-agent', 'Mozilla/5.0 (Linux; Android 9; Pixel) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4026.0 Mobile Safari/537.36'); + this.url = 'https://asurascans.com.tr'; } get icon() { return '/img/connectors/asurascans'; } - - async _getPages(chapter) { - const excludes = [ - /panda_gif_large/i, - /2021\/04\/page100-10\.jpg/i, - /2021\/03\/20-ending-page-\.jpg/i, - /ENDING-PAGE/i - ]; - const images = await super._getPages(chapter); - return images.filter(link => !excludes.some(rgx => rgx.test(link))); - } - } diff --git a/src/web/mjs/connectors/AzoraManga.mjs b/src/web/mjs/connectors/AzoraManga.mjs index bd3480ca68..3f5bd6adf6 100644 --- a/src/web/mjs/connectors/AzoraManga.mjs +++ b/src/web/mjs/connectors/AzoraManga.mjs @@ -1,12 +1,11 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import AzoraWorld from './AzoraWorld.mjs'; -export default class AzoraManga extends WordPressMadara { +export default class AzoraManga extends AzoraWorld { constructor() { super(); super.id = 'azoramanga'; super.label = 'أزورا مانج (AZORA MANGA)'; this.tags = [ 'webtoon', 'arabic' ]; - this.url = 'https://azoramanga.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/BeeToon.mjs b/src/web/mjs/connectors/BeeToon.mjs index 3d026272de..7eda721c0f 100644 --- a/src/web/mjs/connectors/BeeToon.mjs +++ b/src/web/mjs/connectors/BeeToon.mjs @@ -14,7 +14,7 @@ export default class BeeToon extends WordPressZbulu { } canHandleURI(uri) { - return /(ww2\.)?beetoon\.net/.test(uri.hostname); + return /(ww\d+\.)?beetoon\.net/.test(uri.hostname); } async _initializeConnector() { @@ -37,4 +37,15 @@ export default class BeeToon extends WordPressZbulu { }; }); } -} \ No newline at end of file + + async _getPages(chapter) { + const pages = await super._getPages(chapter); + return pages + .map( page => { + let link = new URL(page); + link = link.searchParams.get('url') || link; //deproxify url if needed + return link.href; + }) + .filter(page => !page.includes('/gadgets/proxy?'));//remove fake images (that were not deproxified) + } +} diff --git a/src/web/mjs/connectors/CeriseScans.mjs b/src/web/mjs/connectors/CeriseScans.mjs index 361dcc07bc..1448e36d2f 100644 --- a/src/web/mjs/connectors/CeriseScans.mjs +++ b/src/web/mjs/connectors/CeriseScans.mjs @@ -7,6 +7,6 @@ export default class CeriseScans extends WordPressMadaraNovel { super.id = 'cerisescans'; super.label = 'Cerise Scans'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://cerisescan.com'; + this.url = 'https://cerisescan.net'; } } diff --git a/src/web/mjs/connectors/Cmoa.mjs b/src/web/mjs/connectors/Cmoa.mjs index 7801fcb637..ce92218d48 100644 --- a/src/web/mjs/connectors/Cmoa.mjs +++ b/src/web/mjs/connectors/Cmoa.mjs @@ -26,9 +26,10 @@ export default class Cmoa extends SpeedBinb { async _getChapters(manga) { const request = new Request(new URL(manga.id, this.url), this.requestOptions); - const pages = await this.fetchDOM(request, '#comic_list > .pagination:nth-child(1) li'); + const pages = await this.fetchDOM(request, '#comic_list > .pagination:nth-child(1) li:nth-last-child(2) a'); const chapters = []; - const totalPage = pages.length == 0 ? 1 : pages.length - 1; + const totalPage = pages.length == 0 ? 1 : parseInt(new URL(pages[0].href).searchParams.get('page')); + for (let i = 0; i < totalPage; i++) { const uri = new URL(manga.id, this.url); uri.searchParams.set('page', i + 1); diff --git a/src/web/mjs/connectors/ComicBushi.mjs b/src/web/mjs/connectors/ComicBushi.mjs index 69e8bd39c3..544a34b094 100644 --- a/src/web/mjs/connectors/ComicBushi.mjs +++ b/src/web/mjs/connectors/ComicBushi.mjs @@ -5,9 +5,9 @@ export default class ComicBushi extends CoreView { constructor() { super(); super.id = 'comicbushi'; - super.label = 'コミックブシロードWEB (Comic Bushiroad WEB)'; + super.label = 'コミックブシロードWEB (Comic Bushiroad WEB / Growl)'; this.tags = ['manga', 'japanese']; - this.url = 'https://comicbushi-web.com'; + this.url = 'https://comic-growl.com'; this.path = ['/']; this.queryManga = 'section#lineup ul.lineup-list div.lineup-item a'; this.queryMangaTitle = 'h5.title'; @@ -23,4 +23,4 @@ export default class ComicBushi extends CoreView { }; }); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ComicEarthStar.mjs b/src/web/mjs/connectors/ComicEarthStar.mjs index 2a582b0bf3..5e9da2024c 100644 --- a/src/web/mjs/connectors/ComicEarthStar.mjs +++ b/src/web/mjs/connectors/ComicEarthStar.mjs @@ -1,71 +1,94 @@ -import Publus from './templates/Publus.mjs'; -import Manga from '../engine/Manga.mjs'; +import CoreView from './templates/CoreView.mjs'; -export default class ComicEarthStar extends Publus { +export default class ComicEarthStar extends CoreView { constructor() { super(); super.id = 'comicearthstar'; super.label = 'コミック アース・スター (Comic Earth Star)'; this.tags = [ 'manga', 'japanese' ]; - this.url = 'https://www.comic-earthstar.jp'; + this.apiURL = 'https://comic-earthstar.com/graphql'; + this.url = 'https://comic-earthstar.com'; } - async _getMangaFromURI(uri) { - let id = uri.pathname.match(/\/([^/]+)\/?$/)[1]; - let request = new Request(this.url + '/json/contents/detail/' + id + '.json', this.requestOptions); - let data = await this.fetchJSON(request); - let title = data.categorys.comic_category_title; - return new Manga(this, id, title); - } + async _getMangas() { + const mangalist = []; - /** - * - */ - _getMangaList( callback ) { - let request = new Request( this.url + '/json/contents/top/default.json', this.requestOptions ); - this.fetchJSON( request ) - .then( data => { - let ongoingList = data.serial_comics.map( comic => { - return { - id: comic.comic_category_code, - title: comic.title - }; - } ); - let completedList = data.comple_comics.map( comic => { - return { - id: comic.comic_category_code, - title: comic.comic_category_code.toUpperCase() - }; - } ); - let mangaList = ongoingList.concat( completedList ); - callback( null, mangaList ); - } ) - .catch( error => { - console.error( error, this ); - callback( error, undefined ); - } ); - } + let operationName = 'Earthstar_Oneshot'; + let query = ` + query Earthstar_Oneshot { + seriesOneshot: serialGroup(groupName: "連載・読切:読切作品") { + seriesSlice { + seriesList { + id + title + firstEpisode { + permalink + } + } + } + } + } + `; + let uri = new URL(this.apiURL); + uri.searchParams.set('opname', operationName); + let request = new Request(uri, this.requestOptions); + let data = await this.fetchGraphQL(request, operationName, query, {} ); + data.seriesOneshot.seriesSlice.seriesList.forEach(manga => { + mangalist.push({ + id: new URL(manga.firstEpisode.permalink).pathname, + title: manga.title.trim() + }); + }); + + operationName = 'Earthstar_Series'; + query = ` + query Earthstar_Series { + seriesOngoing: serialGroup(groupName: "連載・読切:連載作品:連載中") { + seriesSlice { + seriesList { + ...Earthstar_SeriesListItem_Series + } + } + } + seriesFinished: serialGroup(groupName: "連載・読切:連載作品:連載終了") { + seriesSlice { + seriesList { + ...Earthstar_SeriesListItem_Series + } + } + } + } + + fragment Earthstar_SeriesListItem_Series on Series { + id + title + firstEpisode { + permalink + } + } + `; + uri = new URL(this.apiURL); + uri.searchParams.set('opname', operationName); + request = new Request(uri, this.requestOptions); + data = await this.fetchGraphQL(request, operationName, query, {} ); + + data.seriesOngoing.seriesSlice.seriesList.forEach(manga => { + mangalist.push({ + id: new URL(manga.firstEpisode.permalink).pathname, + title: manga.title.trim() + }); + }); + + data.seriesFinished.seriesSlice.seriesList.forEach(manga => { + mangalist.push({ + id: new URL(manga.firstEpisode.permalink).pathname, + title: manga.title.trim() + }); + }); + + return mangalist; - /** - * - */ - _getChapterList( manga, callback ) { - let request = new Request( this.url + '/json/contents/detail/' + manga.id + '.json', this.requestOptions ); - this.fetchJSON( request ) - .then( data => { - let chapterList = data.episodes.map( episode => { - return { - id: new URL( episode.page_url, request.url ).href, // episode.cid, - title: episode.comic_episode_title, - language: '' - }; - } ); - callback( null, chapterList ); - } ) - .catch( error => { - console.error( error, manga ); - callback( error, undefined ); - } ); } -} \ No newline at end of file + +} diff --git a/src/web/mjs/connectors/ComicExtra.mjs b/src/web/mjs/connectors/ComicExtra.mjs index 85f973816f..38c04fb575 100644 --- a/src/web/mjs/connectors/ComicExtra.mjs +++ b/src/web/mjs/connectors/ComicExtra.mjs @@ -8,7 +8,7 @@ export default class ComicExtra extends Connector { super.id = 'comicextra'; super.label = 'ComicExtra'; this.tags = ['comic', 'english']; - this.url = 'https://comicextra.me'; + this.url = 'https://comicextra.org'; this.path = '/comic-list/'; } diff --git a/src/web/mjs/connectors/ComicK.mjs b/src/web/mjs/connectors/ComicK.mjs index 25660da3a9..0f551da2a2 100644 --- a/src/web/mjs/connectors/ComicK.mjs +++ b/src/web/mjs/connectors/ComicK.mjs @@ -9,13 +9,17 @@ export default class ComicK extends Connector { super.id = 'comick'; super.label = 'ComicK'; this.tags = [ 'manga', 'english' ]; - this.url = 'https://comick.app'; - this.apiurl = 'https://api.comick.app'; + this.url = 'https://comick.io'; + this.apiurl = 'https://api.comick.io'; this.requestOptions.headers.set('x-origin', this.url ); this.requestOptions.headers.set('x-referer', this.apiurl ); } + canHandleURI(uri) { + return /https?:\/\/comick\.(app|ink|cc|io)/.test(uri.origin); + } + async _getEmbeddedJSON(uri) { const request = new Request(uri, this.requestOptions); request.headers.set('x-user-agent', HeaderGenerator.randomUA() ); @@ -40,7 +44,7 @@ export default class ComicK extends Connector { async _getMangasFromPage(page) { try { - const uri = new URL('/v1.0/search?page=' + page, this.apiurl); + const uri = new URL('/v1.0/search?limit=49&page=' + page, this.apiurl); const request = new Request(uri, this.requestOptions); request.headers.set('x-user-agent', HeaderGenerator.randomUA() ); await this.wait(500); diff --git a/src/web/mjs/connectors/ComicRide.mjs b/src/web/mjs/connectors/ComicRide.mjs new file mode 100644 index 0000000000..34d40f0028 --- /dev/null +++ b/src/web/mjs/connectors/ComicRide.mjs @@ -0,0 +1,24 @@ +import YoungChampion from './YoungChampion.mjs'; + +//ComiciViewer +export default class ComicRide extends YoungChampion { + constructor() { + super(); + super.id = 'comicride'; + super.label = 'ComicRide'; + this.tags = ['manga', 'japanese']; + this.url = 'https://comicride.jp'; + this.apiUrl = this.url; + this.links = { + login: 'https://comicride.jp/signin' + }; + } + async _getMangas() { + let mangaList = []; + for (let page = 0, run = true; run; page++) { + const mangas = await this._getMangasFromPage(page); + mangas.length > 0 ? mangaList.push(...mangas) : run = false; + } + return mangaList; + } +} diff --git a/src/web/mjs/connectors/ComicWalker.mjs b/src/web/mjs/connectors/ComicWalker.mjs index 89308021ba..5af7780866 100644 --- a/src/web/mjs/connectors/ComicWalker.mjs +++ b/src/web/mjs/connectors/ComicWalker.mjs @@ -6,114 +6,87 @@ export default class ComicWalker extends Connector { constructor() { super(); super.id = 'comicwalker'; - super.label = 'コミックウォーカー (ComicWalker)'; + super.label = 'カドコミ (KadoComi)'; this.tags = [ 'manga', 'japanese' ]; this.url = 'https://comic-walker.com'; + this.apiURL = 'https://comic-walker.com/api/'; } async _getMangaFromURI(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'div#mainContent div#detailIndex div.comicIndex-box h1'); - let id = uri.pathname + uri.search; - let title = data[0].textContent.trim(); - return Promise.resolve(new Manga(this, id, title)); + const workCode = uri.pathname.match(/\/detail\/([^/]+)/)[1]; //strip search + const apiCallUrl = new URL(`contents/details/work?workCode=${workCode}`, this.apiURL); + const { work } = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + return new Manga(this, workCode, work.title.trim()); } - async _getMangaListPage(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'div.comicPage ul.tileList li a p.tileTitle span'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.closest('a'), request.url), - title: element.textContent.replace(/^[^\s]+\s/, '').trim() - }; - }); + async _getMangas() { + const mangasList = []; + const apiCallUrl = new URL(`search/initial`, this.apiURL); + const data = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + for (const entry of data) { + mangasList.push(...entry.items.map(manga => { + return { + id: manga.code, + title: manga.title.trim() + }; + })); + } + return mangasList; } - async _getMangaList(callback) { - try { - let mangaList = []; - for(let language of ['en', 'tw', 'jp']) { - let uri = new URL('/contents/list/', this.url); - let request = new Request(`${this.url}/set_lang/${language}/`, this.requestOptions); - request.headers.set('x-referer', uri.href); - let data = await this.fetchDOM(request, 'div.comicPage div.pager ul.clearfix li:nth-last-of-type(2) a'); - let pageCount = parseInt(data[0].text.trim()); - for(let page = 1; page <= pageCount; page++) { - uri.searchParams.set('p', page); - let mangas = await this._getMangaListPage(uri); - mangaList.push(...mangas); - } - } - callback(null, mangaList); - } catch(error) { - console.error(error, this); - callback(error, undefined); + async _getChapters( manga ) { + const chapterList = []; + const apiCallUrl = new URL(`contents/details/work?workCode=${manga.id}`, this.apiURL); + const data = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + + for (const episodeType of ['firstEpisodes', 'latestEpisodes' ]) { + + chapterList.push(...data[episodeType].result.map(episode => { + const title = [episode.title, episode.subtitle].join(' ').trim(); + return { id: episode.id, title : title}; + })); } - } - _getChapterList( manga, callback ) { - let request = new Request( this.url + manga.id, this.requestOptions ); - this.fetchDOM( request, 'div#ulreversible ul#reversible li a' ) - .then( data => { - let chapterList = data.map( element => { - return { - id: this.getRootRelativeOrAbsoluteLink( element, request.url ), - title: element.title.replace( manga.title, '' ).trim(), - language: '' - }; - } ); - callback( null, chapterList ); - } ) - .catch( error => { - console.error( error, manga ); - callback( error, undefined ); - } ); + for (const comic of data.comics.result) { + chapterList.push(...comic.episodes.map(episode => { + return { + id: episode.id, + title : episode.title.trim() + }; + })); + } + + return chapterList.filter(chapter => chapter === chapterList.find(c => c.id === chapter.id)); + } - _getPageList( manga, chapter, callback ) { - let request = new Request( this.url + chapter.id, this.requestOptions ); - this.fetchDOM( request, 'main#app' ) - .then( data => { - const endpoints = data[0].dataset.apiEndpointUrl ? data[0].dataset.apiEndpointUrl : JSON.parse(data[0].dataset.apiEndpointUrls); - let uri = `${endpoints.nc || endpoints.cw || endpoints}/api/v1/comicwalker/episodes/${data[0].dataset.episodeId}/frames`; - request = new Request( uri, this.requestOptions ); - return this.fetchJSON( request ); - } ) - .then( data => { - let pageList = data.data.result.map( page => this.createConnectorURI( this.getAbsolutePath( page.meta.source_url, this.url ) ) ); - callback( null, pageList ); - } ) - .catch( error => { - console.error( error, chapter ); - callback( error, undefined ); - } ); + async _getPages( chapter ) { + const apiCallUrl = new URL(`contents/viewer?episodeId=${chapter.id}&imageSizeType=width:1284`, this.apiURL); + const { manuscripts } = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + return manuscripts.map(page => this.createConnectorURI({ ...page })); } async _handleConnectorURI(payload) { - /* - * TODO: only perform requests when from download manager - * or when from browser for preview and selected chapter matches - */ - let passphrase = payload.split('/').find(part => /^[\da-f]{16}/.test(part)); - if(passphrase) { - let request = new Request(payload, this.requestOptions); - let response = await fetch(request); - return this._decrypt(await response.arrayBuffer(), passphrase); - } else { - return super._handleConnectorURI(payload); + const uri = new URL(payload.drmImageUrl, this.url); + const request = new Request(uri, this.requestOptions); + const response = await fetch(request); + switch (payload.drmMode) { + case 'xor': { + const encrypted = await response.arrayBuffer(); + const data = { + mimeType: response.headers.get('content-type'), + data: this._xor(encrypted, this._generateKey(payload.drmHash)) + }; + this._applyRealMime(data); + return data; + } + case 'raw': { + const data = await response.blob(); + return this._blobToBuffer(data); + } } } - _decrypt(encrypted, passphrase) { - let key = this._generateKey(passphrase); - let decrypted = this._xor(encrypted, key); - return Promise.resolve({ - mimeType: 'image/jpeg', - data: decrypted - }); - } - /** ****************************** * ** COMIC-WALKER CODE BEGIN *** @@ -140,4 +113,4 @@ export default class ComicWalker extends Connector { * ** COMIC-WALKER CODE END *** *************************** */ -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/CovenScan.mjs b/src/web/mjs/connectors/CovenScan.mjs index 24b2e3e0b5..222eed9051 100644 --- a/src/web/mjs/connectors/CovenScan.mjs +++ b/src/web/mjs/connectors/CovenScan.mjs @@ -7,7 +7,7 @@ export default class CovenScan extends WordPressMadara { super.id = 'covenscan'; super.label = 'Coven Scan'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://cvenscan.com'; + this.url = 'https://cvnscan.com'; } } diff --git a/src/web/mjs/connectors/CypherScans.mjs b/src/web/mjs/connectors/CypherScans.mjs new file mode 100644 index 0000000000..530d9c5219 --- /dev/null +++ b/src/web/mjs/connectors/CypherScans.mjs @@ -0,0 +1,13 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class CypherScans extends WordPressMangastream { + + constructor() { + super(); + super.id = 'cypherscans'; + super.label = 'Cypher Scans'; + this.tags = [ 'manga', 'manhwa', 'manhua', 'english' ]; + this.url = 'https://cypherscans.xyz'; + this.path = '/manga/list-mode/'; + } +} \ No newline at end of file diff --git a/src/web/mjs/connectors/DiskusScan.mjs b/src/web/mjs/connectors/DiskusScan.mjs index 576b6bc4c7..a8588beeb3 100644 --- a/src/web/mjs/connectors/DiskusScan.mjs +++ b/src/web/mjs/connectors/DiskusScan.mjs @@ -1,6 +1,6 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import WordPressMangastream from './templates/WordPressMangastream.mjs'; -export default class DiskusScan extends WordPressMadara { +export default class DiskusScan extends WordPressMangastream { constructor() { super(); @@ -8,5 +8,6 @@ export default class DiskusScan extends WordPressMadara { super.label = 'Diskus Scan'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; this.url = 'https://diskusscan.com'; + this.path = '/manga/list-mode'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Doujinku.mjs b/src/web/mjs/connectors/Doujinku.mjs new file mode 100644 index 0000000000..d4edf87974 --- /dev/null +++ b/src/web/mjs/connectors/Doujinku.mjs @@ -0,0 +1,13 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Doujinku extends WordPressMangastream { + + constructor() { + super(); + super.id = 'doujinku'; + super.label = 'Doujinku'; + this.tags = ['manga', 'hentai', 'indonesian']; + this.url = 'https://doujinku.xyz'; + this.path = '/manga/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/EvaScans.mjs b/src/web/mjs/connectors/EvaScans.mjs index 7721610213..fe480c489e 100644 --- a/src/web/mjs/connectors/EvaScans.mjs +++ b/src/web/mjs/connectors/EvaScans.mjs @@ -5,9 +5,9 @@ export default class EvaScans extends WordPressMadara { constructor() { super(); super.id = 'evascans'; - super.label = 'EvaScans'; + super.label = 'ManWe'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://evascans.com'; + this.url = 'https://manwe.pro'; this.requestOptions.headers.set('x-referer', this.url); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/FirstKiss.mjs b/src/web/mjs/connectors/FirstKiss.mjs index 69b840330f..c4f7e394ff 100644 --- a/src/web/mjs/connectors/FirstKiss.mjs +++ b/src/web/mjs/connectors/FirstKiss.mjs @@ -71,8 +71,19 @@ export default class FirstKiss extends Connector { async _getPages(chapter) { const uri = new URL(chapter.id, this.url); const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.reading-detail div.page-chapter source'); - return data.filter(image => !image.src.match(/\/logos\/|pic_999/)). - map(image => this.createConnectorURI(this.getAbsolutePath(image, request.url))); + + const script = ` + new Promise(resolve => { + const tokenElement = document.querySelector("div.reading input#next_img_token"); + if (tokenElement != null) { + const imgCdnUrl = document.querySelector("div.reading #currentlink").getAttribute("value"); + const imgdata = JSON.parse(atob(parseJwt(tokenElement.getAttribute('value')).data)); + resolve(imgdata.map(image => new URL(image, imgCdnUrl).href)); + } + const images = [...document.querySelectorAll("div.reading-detail.box_doc img")].filter(element => element.dataset.index); + resolve(images.map(image => image.getAttribute('src'))); + }); + `; + return (await Engine.Request.fetchUI(request, script)).map(image => this.createConnectorURI(image)); } } diff --git a/src/web/mjs/connectors/GekkouScans.mjs b/src/web/mjs/connectors/GekkouScans.mjs index b41a96a8b2..7b1b882b05 100644 --- a/src/web/mjs/connectors/GekkouScans.mjs +++ b/src/web/mjs/connectors/GekkouScans.mjs @@ -7,6 +7,6 @@ export default class GekkouScans extends WordPressMadara { super.id = 'gekkouscans'; super.label = 'Gekkou Scans'; this.tags = [ 'manga', 'webtoon', 'portuguese' ]; - this.url = 'https://gekkou.com.br'; + this.url = 'https://gekkou.site'; } } diff --git a/src/web/mjs/connectors/GourmetScans.mjs b/src/web/mjs/connectors/GourmetScans.mjs index 2487907afc..7d6beb58a1 100644 --- a/src/web/mjs/connectors/GourmetScans.mjs +++ b/src/web/mjs/connectors/GourmetScans.mjs @@ -7,7 +7,7 @@ export default class GourmetScans extends WordPressMadara { super.id = 'gourmetscans'; super.label = 'Gourmet Scans'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://gourmetscans.net'; + this.url = 'https://gourmetsupremacy.com'; } async _getPages(chapter) { @@ -15,13 +15,20 @@ export default class GourmetScans extends WordPressMadara { const request = new Request(url, this.requestOptions); const script = ` new Promise((resolve, reject) => { - var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { - format: CryptoJSAesJson - }).toString(CryptoJS.enc.Utf8)); - resolve(JSON.parse(imgdata)); + try { + let rocketscript = new RocketLazyLoadScripts; + rocketscript._loadEverythingNow(); + } catch (error) {} + + setTimeout(() => { + var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { + format: CryptoJSAesJson + }).toString(CryptoJS.enc.Utf8)); + resolve(JSON.parse(imgdata)); + }, 2500); }); `; const data = await Engine.Request.fetchUI(request, script); return data.map(picture => this.createConnectorURI({url : picture, referer : url})); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/GuncelManga.mjs b/src/web/mjs/connectors/GuncelManga.mjs index 913a2dcb53..5179731f6e 100644 --- a/src/web/mjs/connectors/GuncelManga.mjs +++ b/src/web/mjs/connectors/GuncelManga.mjs @@ -7,6 +7,6 @@ export default class GuncelManga extends WordPressMadara { super.id = 'guncelmanga'; super.label = 'Güncel Manga'; this.tags = [ 'manga', 'turkish' ]; - this.url = 'https://guncelmanga.com'; + this.url = 'https://guncelmanga.net'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Hayalistic.mjs b/src/web/mjs/connectors/Hayalistic.mjs index 837636ceb5..1a50da1a07 100644 --- a/src/web/mjs/connectors/Hayalistic.mjs +++ b/src/web/mjs/connectors/Hayalistic.mjs @@ -7,6 +7,6 @@ export default class Hayalistic extends WordPressMadara { super.id = 'hayalistic'; super.label = 'Hayalistic'; this.tags = [ 'webtoon', 'turkish' ]; - this.url = 'https://hayalistic.com'; + this.url = 'https://hayalistic.com.tr'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/HentaiRead.mjs b/src/web/mjs/connectors/HentaiRead.mjs index 77493a2f4f..c76d543a11 100644 --- a/src/web/mjs/connectors/HentaiRead.mjs +++ b/src/web/mjs/connectors/HentaiRead.mjs @@ -10,19 +10,36 @@ export default class HentaiRead extends WordPressMadara { this.url = 'https://hentairead.com'; } - // very similar to tritiniascans except that this websites uses an array instead of an object + async _getChapters(manga) { + const request = new Request(new URL(manga.id, this.url), this.requestOptions); + const [ data ] = await this.fetchDOM(request, 'a.btn-read-now'); + return [{ + id : data.pathname, + title : manga.title + }]; + } + async _getPages(chapter) { - let request = new Request(this.url + chapter.id, this.requestOptions); - let response = await fetch(request); - let data = await response.text(); - let chapterImages = data.match(/chapImages\s*=\s*(\[[^\]]+\])/); - let preloadedImages = data.match(/chapter_preloaded_images\s*=\s*(\[[^\]]+\])/); - let pageList = JSON.parse((chapterImages || preloadedImages)[1]); - return pageList.map(link => { - let uri = new URL(link); - uri.searchParams.set('quality', '100'); - uri.searchParams.delete('w'); - return uri.href; - }); + const request = new Request(this.url + chapter.id, this.requestOptions); + const script = ` + new Promise((resolve, reject) => { + setTimeout(() => { + try { + const pagelist = (window.chapterImages ?? window.chapter_preloaded_images); + resolve( pagelist.map(image=> { + const uri = new URL(image.src); + uri.searchParams.set('quality', '100'); + uri.searchParams.delete('w'); + return uri.href; + })); + } catch (error) { + reject(error); + } + }, + 500); + }); + `; + const pages = await Engine.Request.fetchUI(request, script); + return pages.map(page => page.replace(/\/i\d+\.wp\.com/, '')); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/InfernalVoidScans.mjs b/src/web/mjs/connectors/InfernalVoidScans.mjs index 5d4b589ae5..c6c75d1867 100644 --- a/src/web/mjs/connectors/InfernalVoidScans.mjs +++ b/src/web/mjs/connectors/InfernalVoidScans.mjs @@ -9,5 +9,6 @@ export default class InfernalVoidScans extends WordPressMangastream { this.tags = [ 'webtoon', 'scanlation', 'english' ]; this.url = 'https://void-scans.com'; this.path = '/manga/list-mode/'; + this.requestOptions.headers.set('x-referer', this.url); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/KomikAV.mjs b/src/web/mjs/connectors/KomikAV.mjs index aff1e8a4fe..0d5c2b6b6e 100644 --- a/src/web/mjs/connectors/KomikAV.mjs +++ b/src/web/mjs/connectors/KomikAV.mjs @@ -5,9 +5,9 @@ export default class KomikAV extends WordPressMangastream { constructor() { super(); super.id = 'komikav'; - super.label = 'KomikAV'; + super.label = 'APKomik'; this.tags = [ 'manga', 'indonesian' ]; - this.url = 'https://komikav.com'; + this.url = 'https://apkomik.cc'; this.path = '/manga/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/KomikNesia.mjs b/src/web/mjs/connectors/KomikNesia.mjs index 7a490a1462..84c7c2e7e5 100644 --- a/src/web/mjs/connectors/KomikNesia.mjs +++ b/src/web/mjs/connectors/KomikNesia.mjs @@ -7,12 +7,7 @@ export default class KomikNesia extends WordPressMangastream { super.id = 'komiknesia'; super.label = 'KomikNesia'; this.tags = [ 'manga', 'webtoon', 'indonesian' ]; - this.url = 'https://komiknesia.com'; - this.path = '/latest-update/?list'; - - this.queryMangas = 'div.listttl ul li a'; - this.queryChapters = 'div#chapter_list span.eps a'; - this.queryChaptersTitle = undefined; - this.queryPages = 'div.reader-area img[src]:not([src=""])'; + this.url = 'https://komiknesia.xyz'; + this.path = '/manga/list-mode'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/KomikTap.mjs b/src/web/mjs/connectors/KomikTap.mjs index 5364c35d37..512c2b188c 100644 --- a/src/web/mjs/connectors/KomikTap.mjs +++ b/src/web/mjs/connectors/KomikTap.mjs @@ -10,18 +10,4 @@ export default class KomikTap extends WordPressMangastream { this.url = 'https://komiktap.me'; this.path = '/manga/list-mode/'; } - - async _initializeConnector() { - const response = await fetch(this.url); - const newUrl = new URL(response.url); - this.url = newUrl.origin; - this.hostPattern = newUrl.host; - console.log(`Assigned URL '${this.url}' to ${this.label}`); - } - canHandleURI(uri) { - super.initialize() - .then(() => { - return uri.href.includes(this.url); - }); - } } diff --git a/src/web/mjs/connectors/LezhinEN.mjs b/src/web/mjs/connectors/LezhinEN.mjs index 447ca28bb3..54dd39a4ab 100644 --- a/src/web/mjs/connectors/LezhinEN.mjs +++ b/src/web/mjs/connectors/LezhinEN.mjs @@ -12,7 +12,7 @@ export default class LezhinEN extends Lezhin { login: this.url + '/login#email' }; this.requestOptions.headers.set( 'x-cookie', 'x-lz-locale=en_US' ); - this.requestOptions.headers.set( 'x-lz-locale', 'en_US' ); + this.requestOptions.headers.set( 'x-lz-locale', 'en-US' ); this.locale = 'en-US'; } } \ No newline at end of file diff --git a/src/web/mjs/connectors/LezhinJA.mjs b/src/web/mjs/connectors/LezhinJA.mjs index dd7cdb383d..fc475552e2 100644 --- a/src/web/mjs/connectors/LezhinJA.mjs +++ b/src/web/mjs/connectors/LezhinJA.mjs @@ -12,7 +12,7 @@ export default class LezhinJA extends Lezhin { login: this.url + '/login#email' }; this.requestOptions.headers.set( 'x-cookie', 'x-lz-locale=ja_JP' ); - this.requestOptions.headers.set( 'x-lz-locale', 'ja_JP' ); + this.requestOptions.headers.set( 'x-lz-locale', 'ja-JP' ); this.locale = 'ja-JP'; } } \ No newline at end of file diff --git a/src/web/mjs/connectors/LezhinKO.mjs b/src/web/mjs/connectors/LezhinKO.mjs index bc4d89953d..253cf1fb68 100644 --- a/src/web/mjs/connectors/LezhinKO.mjs +++ b/src/web/mjs/connectors/LezhinKO.mjs @@ -12,7 +12,7 @@ export default class LezhinKO extends Lezhin { login: this.url + '/login#email' }; this.requestOptions.headers.set( 'x-cookie', 'x-lz-locale=ko_KR' ); - this.requestOptions.headers.set( 'x-lz-locale', 'ko_KR' ); + this.requestOptions.headers.set( 'x-lz-locale', 'ko-KR' ); this.locale = 'ko-KR'; } } \ No newline at end of file diff --git a/src/web/mjs/connectors/LoveHug.mjs b/src/web/mjs/connectors/LoveHug.mjs index f3c29857d9..bf099462b8 100644 --- a/src/web/mjs/connectors/LoveHug.mjs +++ b/src/web/mjs/connectors/LoveHug.mjs @@ -72,22 +72,10 @@ export default class WeLoveManga extends FlatManga { async _getPages(chapter) { const uri = new URL(chapter.id, this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, this.queryPages); - return data.map(element => { - const link = [ ...element.attributes] - .filter(attribute => !['src', 'class', 'alt'].includes(attribute.name)) - .map(attribute => { - try { - return atob(attribute.value.trim()); - } catch(_) { - return attribute.value.trim(); - } - }) - .find(value => { - return /^http/.test(value); - }); - return this.createConnectorURI(this.getAbsolutePath(link || element, request.url)); - }); + let request = new Request(uri, this.requestOptions); + const chapterid = (await this.fetchDOM(request, 'input#chapter'))[0].value; + request = new Request(new URL(`/app/manga/controllers/cont.listImg.php?cid=${chapterid}`, this.url), this.requestOptions); + const nodes = await this.fetchDOM(request, 'source.chapter-img:not([alt*="nicoscan"])'); + return nodes.map(image => this.createConnectorURI(image.dataset.original.replace(/\n/g, ''))); } } diff --git a/src/web/mjs/connectors/Luscious.mjs b/src/web/mjs/connectors/Luscious.mjs index 5545f22346..84f9a6a309 100644 --- a/src/web/mjs/connectors/Luscious.mjs +++ b/src/web/mjs/connectors/Luscious.mjs @@ -9,15 +9,14 @@ export default class Luscious extends Connector { super.label = 'Luscious'; this.tags = [ 'hentai', 'multi-lingual' ]; this.url = 'https://www.luscious.net'; - this.apiURL = 'https://api.luscious.net/graphql/nobatch/'; + this.apiURL = 'https://apicdn.luscious.net/graphql/nobatch/'; } async _getMangaFromURI(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'head title'); - let id = uri.pathname; - let title = data[0].textContent.split('|')[0].trim() + ` [${data[0].lang}]`; - return new Manga(this, id, title); + const id = uri.pathname.match(/_(\d+)\/?$/)[1]; + const request = new Request(uri); + const name = (await this.fetchDOM(request, 'main h1.album-heading')).pop().textContent.trim(); + return new Manga(this, id, name); } async _getMangas() { @@ -30,18 +29,49 @@ export default class Luscious extends Connector { } async _getMangasFromPage(page) { - let gql = `{ - album { - list(input: { display: date_newest, page: ${page} }) { - items { url, title } + const url = new URL(this.apiURL); + url.searchParams.set('operationName', 'AlbumList'); + const query = ` + query AlbumList($input: AlbumListInput!) { + album { + list(input: $input) { + items { + id + title + slug + language { + id + title + url + } + } + } } } - }`; - let data = await this.fetchGraphQL(this.apiURL, undefined, gql, undefined); - return data.album.list.items.map(item => { + `; + url.searchParams.set('query', query); + const variables = { + input: { + display: 'date_trending', + filters: [{ name: 'album_type', value: 'manga' }, { name: 'restrict_genres', value: 'loose' }], + page: page, + items_per_page: 30//dont change items_per_page to more than 30 + } + }; + + url.searchParams.set('variables', JSON.stringify(variables)); + const request = new Request(url, { + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json', + }, + }); + + const data = await this.fetchJSON(request); + return data.data.album.list.items.map(manga => { return { - id: this.getRootRelativeOrAbsoluteLink(item.url, this.url), - title: item.title.trim() + id: manga.id, + title: manga.title.trim() }; }); } @@ -55,36 +85,50 @@ export default class Luscious extends Connector { } async _getPages(chapter) { + const pagelist = []; + for (let page = 1, run = true; run; page++) { + const pagesResults = await this._getPagesFromChapterPage(page, chapter); + if (pagesResults.data.picture.list.items.length > 0) { + pagesResults.data.picture.list.items.forEach(element => pagelist.push(element.url_to_original)); + } + run = pagesResults.data.picture.list.info.has_next_page; + } + return pagelist; + } + + async _getPagesFromChapterPage(page, chapter) { + const url = new URL(this.apiURL); + url.searchParams.set('operationName', 'AlbumListOwnPictures'); const query = ` - query AlbumListOwnPictures($input: PictureListInput!) { - picture { + query AlbumListOwnPictures($input: PictureListInput!) { + picture { list(input: $input) { - items { - url_to_original - } + info { + has_next_page + } + items { + url_to_original + } } + } } - } `; + url.searchParams.set('query', query); const variables = { input: { - filters: [ - { - name: 'album_id', - value: chapter.id.match(/_(\d+)\/?$/)[1] - } - ], - display : 'date_newest', - page: 0 + filters: [{ name: 'album_id', value: chapter.id }], + display: 'position', + items_per_page: 50, //dont change items_per_page to more than 50 + page: page } }; - let pageList = []; - for(let page = 1, run = true; run; page++) { - variables.input.page = page; - const data = await this.fetchGraphQL(this.apiURL, 'AlbumListOwnPictures', query, variables); - const pages = data.picture.list.items.map(item => item.url_to_original); - pages.length > 0 ? pageList.push(...pages) : run = false; - } - return pageList; + url.searchParams.set('variables', JSON.stringify(variables)); + const request = new Request(url, { + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json', + }, + }); + return this.fetchJSON(request); } } diff --git a/src/web/mjs/connectors/LxHentai.mjs b/src/web/mjs/connectors/LxHentai.mjs index a51937b102..21cd3abf48 100644 --- a/src/web/mjs/connectors/LxHentai.mjs +++ b/src/web/mjs/connectors/LxHentai.mjs @@ -7,7 +7,7 @@ export default class LxHentai extends MojoPortalComic { super.id = 'lxhentai'; super.label = 'LXHENTAI'; this.tags = [ 'manga', 'hentai', 'vietnamese' ]; - this.url = 'https://lxmanga.net'; + this.url = 'https://lxmanga.cc'; this.queryMangaTitle = 'head title'; this.queryChapter = 'div.justify-between ul.overflow-y-auto a'; diff --git a/src/web/mjs/connectors/LyraScans.mjs b/src/web/mjs/connectors/LyraScans.mjs index cabac34399..a22d1f8d9f 100644 --- a/src/web/mjs/connectors/LyraScans.mjs +++ b/src/web/mjs/connectors/LyraScans.mjs @@ -5,9 +5,9 @@ export default class LyraScans extends WordPressMangastream { constructor() { super(); super.id = 'lyrascans'; - super.label = 'Lyra Scans'; + super.label = 'Quantum Scans'; this.tags = [ 'manga', 'english', 'scanlation' ]; - this.url = 'https://lyrascans.com'; - this.path = '/manga/list-mode/'; + this.url = 'https://readers-point.space'; + this.path = '/series/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MagKan.mjs b/src/web/mjs/connectors/MagKan.mjs index f4a26fc0f1..1dd16884c5 100644 --- a/src/web/mjs/connectors/MagKan.mjs +++ b/src/web/mjs/connectors/MagKan.mjs @@ -1,59 +1,12 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; +import YoungChampion from './YoungChampion.mjs'; -export default class MagKan extends Connector { +export default class MagKan extends YoungChampion { constructor() { super(); super.id = 'magkan'; super.label = 'MagKan'; this.tags = [ 'manga', 'japanese' ]; - this.url = 'http://kansai.mag-garden.co.jp'; + this.url = 'https://kansai.mag-garden.co.jp'; } - - async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'meta[property="og:title"]'); - return new Manga(this, uri.pathname, data[0].content.trim()); - } - - async _getMangas() { - const uri = new URL(this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div#main div.panel div.box div.inner'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.querySelector('a'), this.url), - title: element.querySelector('h2.comic_name').textContent.trim() - }; - }); - } - - async _getChapters(manga) { - const uri = new URL(manga.id, this.url); - const request = new Request(uri, this.requestOptions); - const body = await this.fetchDOM(request); - const current = [...body.querySelectorAll('div#main div.update_summary div.exp ul.btn li a[href*="/assets/files/"]')].map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url).replace(/\/HTML5\/?$/i, ''), - title: element.text.replace('を読む', '').trim() - }; - }); - const previous = [...body.querySelectorAll('div#main div.sam_exp div.exp')].map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.querySelector('ul.btn li a[href*="/assets/files/"]'), this.url).replace(/\/HTML5\/?$/i, ''), - title: element.querySelector('div.back_number_summary div.ttl').textContent.trim() - }; - }); - return [ ...current, ...previous ]; - } - - async _getPages(chapter) { - const uri = new URL(chapter.id + '/iPhone/ibook.xml', this.url); - const request = new Request(uri, this.requestOptions); - const response = await fetch(request); - const data = await response.text(); - const pages = parseInt(data.match(/(\d+)<\/total>/)[1]); - return new Array(pages).fill().map((_, index) => this.getAbsolutePath(`${chapter.id}/books/images/2/${index + 1}.jpg`, request.url)); - } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ManHuaGui.mjs b/src/web/mjs/connectors/ManHuaGui.mjs index acf67d310b..0e837313b6 100644 --- a/src/web/mjs/connectors/ManHuaGui.mjs +++ b/src/web/mjs/connectors/ManHuaGui.mjs @@ -27,8 +27,8 @@ export default class ManHuaGui extends SinMH { this.queryPagesScript =` new Promise(resolve => { ${this.api}.imgData = function(data) { - let origin = 'https://' + servs[pVars.curServ].hosts[pVars.curHost].h + '.hamreus.com'; - let pageLinks = data.files.map(file => origin + data.path + file + '?cid=' + data.cid + '&md5=' + data.sl.md5); + let origin = pVars.manga.filePath; + let pageLinks = data.files.map(file => origin + file + '?e=' + data.sl.e + '&m=' + data.sl.m); return { preInit: () => resolve(pageLinks) }; diff --git a/src/web/mjs/connectors/MangaBat.mjs b/src/web/mjs/connectors/MangaBat.mjs index 9d195f8dd8..5a421b9c67 100644 --- a/src/web/mjs/connectors/MangaBat.mjs +++ b/src/web/mjs/connectors/MangaBat.mjs @@ -7,7 +7,7 @@ export default class MangaBat extends MangaNel { super.id = 'mangabat'; super.label = 'MangaBat'; this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://m.mangabat.com'; + this.url = 'https://h.mangabat.com'; this.path = '/manga-list-all/'; this.queryMangas = 'div.panel-list-story div.list-story-item h3 a.item-title'; @@ -16,6 +16,6 @@ export default class MangaBat extends MangaNel { canHandleURI(uri) { // Test: https://regex101.com/r/GlzAw2/2/tests - return /^(m\.|read\.)?mangabat\.com$/.test(uri.hostname); + return /^(m\.|read\.|h\.)?mangabat\.com$/.test(uri.hostname); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaDex.mjs b/src/web/mjs/connectors/MangaDex.mjs index df3cc538e8..ba13e5be18 100644 --- a/src/web/mjs/connectors/MangaDex.mjs +++ b/src/web/mjs/connectors/MangaDex.mjs @@ -69,98 +69,14 @@ export default class MangaDex extends Connector { } async _getMangas() { - const mangaList = []; - const limit = 100; - let lastCreatedAt = '2000-01-01T00:00:00'; - let throttle = Promise.resolve(); - - while(lastCreatedAt) { - await throttle; - throttle = new Promise(resolve => setTimeout(resolve, this.config.throttleRequests.value)); - - const uri = new URL('/manga', this.api); - uri.searchParams.set('limit', `${limit}`); - uri.searchParams.set('order[createdAt]', 'asc'); - uri.searchParams.set('createdAtSince', lastCreatedAt); - uri.searchParams.append('contentRating[]', 'safe'); - uri.searchParams.append('contentRating[]', 'suggestive'); - uri.searchParams.append('contentRating[]', 'erotica'); - uri.searchParams.append('contentRating[]', 'pornographic'); - - const request = new Request(uri, { - headers: { - 'Referer': this.url, - }}); - const { data } = await this.fetchJSON(request); - - lastCreatedAt = data.length === limit ? data.pop().attributes.createdAt.split('+').shift() : null; - if(data.length) { - const mangas = data.map(manga => { - const title = manga.attributes.title.en || Object.values(manga.attributes.title).shift(); - return { - id : manga.id, - title : title, - }; - }); - mangaList.push(...mangas); - } - } - - return mangaList; - } - - /* - async _getMangas() { - - let mangaList = []; - let first10k = await this._getMangasFromPages(0, 99); - mangaList = [...mangaList, ...first10k.data]; - let nextAt = first10k.nextAt; - - for (let i = 1; i <= first10k.total / 10000; i += 1) { - let first100of10k = await this._getMangasFromPages(0, 0, nextAt); - mangaList = [...mangaList, ...first100of10k.data.slice(1)]; - let pages = Math.min(Math.floor(first100of10k.total / 100), 99); - if (pages > 0) { - let data = await this._getMangasFromPages(1, pages, nextAt); - mangaList = [...mangaList, ...data.data]; - nextAt = data.nextAt; - } - } - return mangaList.map(ele => { + return (await this.fetchJSON('https://websites.hakuneko.download/mangadex.json')).map(manga => { return { - id: ele.id, - title: (ele.attributes.title.en || Object.values(ele.attributes.title).shift()).trim() + id: manga.id, + title: manga.title, }; }); - } - async _getMangasFromPages(start, pages, nextAt) { - let tmp = []; - let data100; - for (let page = start; page <= pages; page += 1) { - const uri = new URL('/manga', this.api); - uri.searchParams.set('limit', 100); - uri.searchParams.set('offset', 100 * page); - uri.searchParams.set('order[createdAt]', 'asc'); - uri.searchParams.append('contentRating[]', 'safe'); - uri.searchParams.append('contentRating[]', 'suggestive'); - uri.searchParams.append('contentRating[]', 'erotica'); - uri.searchParams.append('contentRating[]', 'pornographic'); - if (nextAt) uri.searchParams.set('createdAtSince', nextAt); - const request = new Request(uri, this.requestOptions); - data100 = await this.fetchJSON(request, 3); - await this.wait(this.config.throttleRequests.value); - tmp = [...tmp, ...data100.data]; - } - return { - data: tmp, - nextAt: data100.data.pop().attributes.createdAt.replace('+00:00', ''), - total: data100.total - }; - } -*/ async _getChapters(manga) { let chapterList = []; for(let page = 0, run = true; run; page++) { diff --git a/src/web/mjs/connectors/MangaDig.mjs b/src/web/mjs/connectors/MangaDig.mjs index 1ee4d5d79f..bfad131d58 100644 --- a/src/web/mjs/connectors/MangaDig.mjs +++ b/src/web/mjs/connectors/MangaDig.mjs @@ -1,91 +1,4 @@ /* eslint-disable */ import ZYMK from './templates/ZYMK.mjs'; -class MangaDig extends ZYMK { - - constructor() { - super(); - super.id = 'mangadig'; - super.label = 'MangaDig'; - this.tags = [ 'webtoon', 'english', 'manga' ]; - this.url = 'https://mangadig.com'; - this.path = '/show?page='; - this.pathSuffix = ''; - this.queryMangas = 'ul.fed-list-info li.fed-list-item a.fed-list-title'; - this.queryMangasPageCount = 'div.fed-page-info a.fed-show-sm-inline'; - this.queryChapters = 'div.all_data_list ul li a'; - this.queryMangaTitle = 'dl.fed-deta-info dd.fed-deta-content h1.fed-part-eone'; - } - - async _getPages(chapter) { - const script = (() => { return require('electron').remote.BrowserWindow.getFocusedWindow().isDevToolsOpened() && require('electron').remote.BrowserWindow.getFocusedWindow().closeDevTools(), atob('KGZ1bmN0aW9uKF8weDUyNzU3YixfMHgyMWIzMjQpe2NvbnN0IF8weDNkOTEzZT1fMHg1YThhLF8weDM2OGQzMz1fMHg1Mjc1N2IoKTt3aGlsZSghIVtdKXt0cnl7Y29uc3QgXzB4M2Q2MzRkPXBhcnNlSW50KF8weDNkOTEzZSgweDEwYywnQVYpXicpKS8oLTB4MioweDk1YSsweGY2NSsweDM1MCkrcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTFmLCc1YypIJykpLygweDcwMCoweDUrLTB4YjY1Ky0weDE3OTkpKihwYXJzZUludChfMHgzZDkxM2UoMHgxNTEsJzVjKkgnKSkvKDB4YjRhKzB4MTJiKy0weDIxMyoweDYpKSstcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTQzLCdkZSNHJykpLygweDFjZTEqLTB4MSstMHg1ZistMHg0Ki0weDc1MSkqKC1wYXJzZUludChfMHgzZDkxM2UoMHgxMGUsJ0ZkVWcnKSkvKDB4NjUyKzB4MyotMHg3ZisweDcwKi0weGIpKSstcGFyc2VJbnQoXzB4M2Q5MTNlKDB4ZmUsJ05yeFknKSkvKDB4MSoweDFhZWUrLTB4M2QwKy0weDE3MTgpK3BhcnNlSW50KF8weDNkOTEzZSgweGZmLCdKc3d5JykpLygweDEqLTB4MjFlKy0weDE5OTcqLTB4MSstMHgyKjB4YmI5KSooLXBhcnNlSW50KF8weDNkOTEzZSgweGZiLCdKc3d5JykpLygtMHgxODk5Ky0weGEqLTB4MmYwKzB4MTk1Ki0weDMpKSstcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTMxLCdwMjA5JykpLygtMHgxZjcxKy0weDNjYiotMHgyKzB4MTdlNCkrcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTE1LCdtSiV5JykpLygweDJlNSstMHhhYioweDMrLTB4ZGEpO2lmKF8weDNkNjM0ZD09PV8weDIxYjMyNClicmVhaztlbHNlIF8weDM2OGQzM1sncHVzaCddKF8weDM2OGQzM1snc2hpZnQnXSgpKTt9Y2F0Y2goXzB4MTgzMjJlKXtfMHgzNjhkMzNbJ3B1c2gnXShfMHgzNjhkMzNbJ3NoaWZ0J10oKSk7fX19KF8weDVhZWIsLTB4MjlkNyotMHg1ZisweDE2YzA3Ky0weDZhNmFkKSk7ZnVuY3Rpb24gXzB4NWFlYigpe2NvbnN0IF8weDU1ZmRkMj1bJ3NXOFdXNVZkT0NrcmY4bzBtYScsJ1c3cGNITm1SVzUwJywnV1FaZFJJckJGYScsJ1dRTmRWTnVzYXEnLCdXNWxkSUc0VmZTb2x4U29EVzZLcGxDa2wnLCdXTzNkUDNEekZxJywnV08zZFVTa3ZXN0pkSVNvM0Ftb2dqQ296YThrdm84b0hXNmUnLCdXN0pjTEh5U21xJywnejhvTVc2ajJyOG85V1BUVycsJ2x4UmRKU29KV1JqSycsJ2g4a2NpdWlHJywnVzVOY0czSzBXNU8nLCdubW9vVzQzY0pHeGNVRycsJ2YyWmRNQ29QV1I0JywnVzVSZFZNMGtwcScsJ1c3eGNPTjBiVzdsZEd4OERXUjQ2VzR6YVdPcVFEdHhkSXEnLCdGU2src0xTZHZjTmNPOGt1V1A4RycsJ0RmckVlMk8nLCdXUjdkR1NrVFdQaGNKQ29aVzV4Y1ZxdlJXN0JkUzhvVnphJywnV1FtT1c2MHRkbW9PZFd0Y1RkdUlXUlcnLCdqMnJYVzZaZFJXJywnVzQ3Y1VZcGNKU2tTJywnV080Vlc0UzNXUTAnLCdXN2xjU1l1NGhKYScsJ1c0RmRHQ2t1anhEbldQRmNISVMnLCdFQ2tpVzVwY0pta1knLCdtcjNjTUwvY0hta2VDbW9Ca2VxZicsJ2JidTlzdFZkVXgzZExjZkZXN0dsJywnVzdkY1VaMCcsJ1dSN2NNMERZV1JTJywnZ21rZ2Vta0lXUGVJVzVMTldPL2NKMlJkSW1rUmhhJywnbTBCY1Zta2ZXNnBkR2EnLCdXUHhjUHNDWFc3cScsJ1dSbGRLQ2tpZXZ1JywnaXhLYVdRVmRWcScsJ294UmRNOG9iV1JIVlc1T3NFYScsJ1dRbGRWTksxVzczZE94dXknLCdXNFJjSlk4Z2FXJywnV1B4Y05nTFJ2OGtzRjhvRicsJ1dPaGNTWkdNVzZpJywnd21rbFc3dGNNU2tqJywnVzVTSXFtb0NXNnUnLCdpU29uVzdOZE1XJywnYlNrVmQ4a0JXUGEnLCdXNlgvclNveicsJ2hTa3RmbWtuV09DJywnV1FGY09KV0MnLCdwY0x4V1A1TicsJ1dSdGNKcTRYVzdXJywnVzROY1JjQzZocScsJ3NHOFhXUkpkUVNrYW5Tb3RnTjAnLCdod3JGRjhraicsJ29Db0RXN20nLCdXNFpjT0NvQldRdGNKU2taZFNrb3lta3hzQ29KJywnd0NrUWZHR1RXN0NpV09XJywnd1Nrclc0TmNWOGtMJywnVzdSY1VLODFhcUZjSmc0Jywnc1NrR210OFdXN2VuV09pdFc3WG56WmI3JywnRW1rQXJ2R3InLCdXUmxjU2RHM1c1UycsJ1c1ZGNHMXFsVzd5JywnRWJkZFFTb2dXUnhkSGRWY1BTa0F0Q29lJywnb1NrSFc2dnR0bW85V1IxR244b1FGeEdBQXFpJywnbWdMRnRta1huR05jVGEnLCdXN0JjUEdSY1VDay8nLCdydmIwYWh4Y09XJywnRkNra1c0N2NLOGt6JywnY3ZkY1E4a3BXNjgnLCdXUnVWVzZ5eldRZScsJ1dQbGRKOGtzVzdsZFZXJywnRFNrQlc2ZGNPYnhjUEs3ZE1XJywnaXJGY0x2N2NLOGtFJywnVzVwZElHNE9lOG9sajhraVc0Q1dibWt4V09sZE1HJywnQ1p1K2RDbzFBTC9jUUNrR2FDb2dvZTQnLCdEQ2t6V1AvZEtMTmRSWGRkUVNrM2gzalR0cScsJ2hDa2Vjd2kzJywneDNYM3B1RycsJ1c1VmNJd1NmVzVHJywndEdXV1dSVmNJU28wc1Nrc2swRmRLQ2tmd21rUCcsJ25nRFJ4Q2tRb1cnLCdqU294VzVOZEhaVmNLd2ExJywnV1JubFc1aGRJMEMnLCdXNm1mQzhvdVc0VycsJ29MaGRKU29OV1JTJywnV1B0ZE5keGRNWlMnLCdXNFpkTHY4Qm5hJywnaThva1c1N2NSVzNjUUtOZE5Da1NwZTFQJywnVzZUTFdSTHBXNVcyV1BlS1dSYUdXUUtWJywnV1F0Y1NJNGdXN3hjR3EnLCdBU2tsV1IzY0dOWmNMZzBDVzdSY0xNaScsJ1c0WmNLSDhmYmY0JywnVzV0Y1ZZN2NTU2tUJywnV09PeVc0R3FuYScsJ1dRcGNVYldhVzZ0Y0doYXAnLCdqQ2szV1FaZFZIcXpkbWtPdG1rRHZkTmNLYScsJ3VOaVpXUDVvVzY0QWZnNCcsJ1c0eGRLcXU5VzZsY09iZGNRWFJkVnJGZEdta3BXNTgnLCdXUGRjSnV2QVdSM2RTM3BkUXNlJywnaENrQ1dQSmRJZVMnLCdXNmRkUzFlTWhTa2snLCdXUVpkVThrRGNNQycsJ1dReGRSWHZReUtxOVdPZGRPbWszVzQzY0tTbzlXUTRGVzRhMicsJ2hta1pXNHhjUWRGY1JyZlJ3Q29OJywnVzZHa0FTb1VXNU8nLCdCbWttZVl1QycsJ1c2QmRPeFBuV1FwZE1jeXBwTXVLV1JmSSddO18weDVhZWI9ZnVuY3Rpb24oKXtyZXR1cm4gXzB4NTVmZGQyO307cmV0dXJuIF8weDVhZWIoKTt9Y29uc3QgXzB4NGIzODA2PShmdW5jdGlvbigpe2NvbnN0IF8weDI0ODMwZD1fMHg1YThhLF8weDQ3MGM1Mz17J1hpS3R6JzpfMHgyNDgzMGQoMHgxM2EsJ3YwcFEnKSwnVnNGSEInOmZ1bmN0aW9uKF8weDFiZjhmMyxfMHg0MjdhOTEpe3JldHVybiBfMHgxYmY4ZjMrXzB4NDI3YTkxO30sJ3ZFZmtGJzpmdW5jdGlvbihfMHg1OTc0NWUsXzB4MTNkZjE5KXtyZXR1cm4gXzB4NTk3NDVlKF8weDEzZGYxOSk7fSwnaXNmWWInOmZ1bmN0aW9uKF8weDExOGRiYSxfMHgzZTNlYzMpe3JldHVybiBfMHgxMThkYmE8PV8weDNlM2VjMzt9LCdNSlNNUyc6XzB4MjQ4MzBkKDB4MTJlLCdkZSNHJyksJ2NIUnNKJzpmdW5jdGlvbihfMHg0MmZjMGYsXzB4MzdkMjAxKXtyZXR1cm4gXzB4NDJmYzBmPT09XzB4MzdkMjAxO30sJ2pkUlNaJzpfMHgyNDgzMGQoMHgxNGYsJ2F5dlEnKSwnZlVQQ3InOl8weDI0ODMwZCgweDEyMSwnKiNAMycpLCdYWXdjVCc6ZnVuY3Rpb24oXzB4MjlmNTFlLF8weGY3ODFlYSl7cmV0dXJuIF8weDI5ZjUxZSE9PV8weGY3ODFlYTt9LCdKQnNLaCc6XzB4MjQ4MzBkKDB4MTRlLCdANTFrJyksJ05VUUdZJzpfMHgyNDgzMGQoMHgxNjEsJ0ckRTQnKSwnVmR3UnQnOl8weDI0ODMwZCgweGZhLCcpcDYjJyl9O2xldCBfMHgzZTNjOWU9ISFbXTtyZXR1cm4gZnVuY3Rpb24oXzB4MWY2NTNmLF8weDQ0NzE4OSl7Y29uc3QgXzB4YjBiMzNmPV8weDI0ODMwZCxfMHgzOGM2ZWM9eydZYlNHSic6XzB4NDcwYzUzW18weGIwYjMzZigweDEzMCwndjBwUScpXSwndE5HSGgnOmZ1bmN0aW9uKF8weDU3NjIzMixfMHg1Yzk2ODYpe2NvbnN0IF8weDFiMTk4Mz1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHgxYjE5ODMoMHgxMzUsJ0FWKV4nKV0oXzB4NTc2MjMyLF8weDVjOTY4Nik7fSwnRklMaW8nOmZ1bmN0aW9uKF8weDNkNzg4MSxfMHgyNTE5NzMpe2NvbnN0IF8weDU0NjUwYT1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHg1NDY1MGEoMHgxNDgsJ2M4N2MnKV0oXzB4M2Q3ODgxLF8weDI1MTk3Myk7fSwnTUNzZ0EnOmZ1bmN0aW9uKF8weDM3ZTdiYyxfMHgxMjAxMjEpe2NvbnN0IF8weDUwOTdmMj1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHg1MDk3ZjIoMHgxMTAsJ3dtMmsnKV0oXzB4MzdlN2JjLF8weDEyMDEyMSk7fSwnZWd3Q00nOl8weDQ3MGM1M1tfMHhiMGIzM2YoMHgxMDYsJ2tMSlInKV0sJ21za2ZOJzpmdW5jdGlvbihfMHgxYzgyNWEsXzB4ZTgzNTQ5KXtjb25zdCBfMHg0YjQ5MzY9XzB4YjBiMzNmO3JldHVybiBfMHg0NzBjNTNbXzB4NGI0OTM2KDB4MTE3LCdIRFhoJyldKF8weDFjODI1YSxfMHhlODM1NDkpO30sJ2VLYXBmJzpfMHg0NzBjNTNbXzB4YjBiMzNmKDB4MTQwLCdaRzZPJyldLCdlTGtJRCc6XzB4NDcwYzUzW18weGIwYjMzZigweDEwMCwnYmFNYicpXSwnRW1MWXknOmZ1bmN0aW9uKF8weDFhZGY4NCxfMHgzMTliOGIpe2NvbnN0IF8weDI4NGJlZT1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHgyODRiZWUoMHgxMzMsJzVjKkgnKV0oXzB4MWFkZjg0LF8weDMxOWI4Yik7fSwnT0lhVkMnOl8weDQ3MGM1M1tfMHhiMGIzM2YoMHgxMjQsJ0s4dTYnKV19O2lmKF8weDQ3MGM1M1tfMHhiMGIzM2YoMHgxMjYsJ15JNVAnKV0oXzB4NDcwYzUzW18weGIwYjMzZigweDExMSwnUkNOZScpXSxfMHg0NzBjNTNbXzB4YjBiMzNmKDB4MTQ2LCdheXZRJyldKSlyZXR1cm4gXzB4MTgyZjIwW18weGIwYjMzZigweDExMiwnYXl2UScpXSgpW18weGIwYjMzZigweDEwZCwnYXl2UScpXShfMHgzOGM2ZWNbXzB4YjBiMzNmKDB4MTUyLCdOcnhZJyldKVtfMHhiMGIzM2YoMHgxNDUsJ0pbY1QnKV0oKVtfMHhiMGIzM2YoMHgxMzksJ01vOFonKV0oXzB4NTBmNjBkKVtfMHhiMGIzM2YoMHhmYywnTW84WicpXShfMHgzOGM2ZWNbXzB4YjBiMzNmKDB4MTJkLCcyZyhBJyldKTtlbHNle2NvbnN0IF8weDExNDA0OT1fMHgzZTNjOWU/ZnVuY3Rpb24oKXtjb25zdCBfMHhlNmRiMTY9XzB4YjBiMzNmLF8weDQ1MThhMT17J2ROYXZqJzpmdW5jdGlvbihfMHg0NDBiN2UsXzB4YmE1NzEyKXtjb25zdCBfMHgxMjVlZjY9XzB4NWE4YTtyZXR1cm4gXzB4MzhjNmVjW18weDEyNWVmNigweDExOSwnWkc2TycpXShfMHg0NDBiN2UsXzB4YmE1NzEyKTt9LCd5TGt6bic6ZnVuY3Rpb24oXzB4MzFlODk3LF8weDI1ZGIzMCl7Y29uc3QgXzB4NmI3NDkxPV8weDVhOGE7cmV0dXJuIF8weDM4YzZlY1tfMHg2Yjc0OTEoMHgxNWIsJ2RlI0cnKV0oXzB4MzFlODk3LF8weDI1ZGIzMCk7fSwnRFNxTEMnOmZ1bmN0aW9uKF8weDFkNTIyMixfMHgyZDM1NzYpe2NvbnN0IF8weDRmYmEzZT1fMHg1YThhO3JldHVybiBfMHgzOGM2ZWNbXzB4NGZiYTNlKDB4MTAyLCdkZSNHJyldKF8weDFkNTIyMixfMHgyZDM1NzYpO30sJ0FJVllDJzpfMHgzOGM2ZWNbXzB4ZTZkYjE2KDB4MTVhLCdheXZRJyldLCdzd2tlYyc6ZnVuY3Rpb24oXzB4MzA2MzU3LF8weDExYTZkNil7Y29uc3QgXzB4ZWQzYWU9XzB4ZTZkYjE2O3JldHVybiBfMHgzOGM2ZWNbXzB4ZWQzYWUoMHgxNTYsJ0ckRTQnKV0oXzB4MzA2MzU3LF8weDExYTZkNik7fX07aWYoXzB4MzhjNmVjW18weGU2ZGIxNigweGY5LCdBVileJyldKF8weDM4YzZlY1tfMHhlNmRiMTYoMHgxNTksJ04qVWYnKV0sXzB4MzhjNmVjW18weGU2ZGIxNigweDEyMCwnZGUjRycpXSkpe2NvbnN0IF8weDU0YWJkMj1fMHgyYzIxZGRbXzB4ZTZkYjE2KDB4MTIyLCdSN3JYJyldKF8weDUwMTA1OSxhcmd1bWVudHMpO3JldHVybiBfMHg1MDFmZWM9bnVsbCxfMHg1NGFiZDI7fWVsc2V7aWYoXzB4NDQ3MTg5KXtpZihfMHgzOGM2ZWNbXzB4ZTZkYjE2KDB4MTFjLCdjODdjJyldKF8weDM4YzZlY1tfMHhlNmRiMTYoMHgxMmEsJ2RlI0cnKV0sXzB4MzhjNmVjW18weGU2ZGIxNigweDEwYSwnMmcoQScpXSkpe2xldCBfMHgyZjhjYWM9JycsXzB4MjE4ODEzPV8weDQ1MThhMVtfMHhlNmRiMTYoMHgxMDgsJ0c2VSknKV0oXzB4MmQ4ODI1W18weGU2ZGIxNigweDE1OCwnRXlCWycpXSgpWzB4MWM3KjB4MSstMHgxYmE4KzB4MTllMioweDFdLF8weDIwMjU5MltfMHhlNmRiMTYoMHgxMmIsJ0pzd3knKV1bXzB4ZTZkYjE2KDB4MTA1LCdGZFVnJyldKCkpO18weDJmOGNhYz1fMHg1OTJkNmJbXzB4ZTZkYjE2KDB4MTE4LCcyZyhBJyldKF8weDIxODgxMyksXzB4MmY4Y2FjPV8weDQ1MThhMVtfMHhlNmRiMTYoMHgxNGEsJ2YwYzknKV0oXzB4NDY1YTIxLF8weDJmOGNhYyk7bGV0IF8weDMwOWVjNj1bXTtmb3IobGV0IF8weDMxZDkyMD0tMHgxN2I5KzB4ODU0KjB4MSstMHgxMiotMHhkYjtfMHg0NTE4YTFbXzB4ZTZkYjE2KDB4MTQ3LCdHJEU0JyldKF8weDMxZDkyMCxfMHgyZjhjYWMpO18weDMxZDkyMCsrKXtfMHgzMDllYzZbXzB4ZTZkYjE2KDB4MTRkLCdheXZRJyldKF8weDFlYzczNFtfMHhlNmRiMTYoMHgxMTYsJ21KJXknKV0oXzB4MzFkOTIwKSk7fV8weDE2OTdlZltfMHhlNmRiMTYoMHgxNWQsJ0hpWzMnKV09XzB4NDUxOGExW18weGU2ZGIxNigweDExZCwnRXlCWycpXTtsZXQgXzB4NTljNTgyPV8weDUwZTJkZFtfMHhlNmRiMTYoMHgxMzIsJ1JDTmUnKV0oKTtjb25zdCBfMHgzMTg4Mjc9e307XzB4MzE4ODI3W18weGU2ZGIxNigweDEzNiwnXkk1UCcpXT1fMHgzMDllYzYsXzB4MzE4ODI3W18weGU2ZGIxNigweDEzYiwnXkk1UCcpXT1fMHg1OWM1ODIsXzB4NDUxOGExW18weGU2ZGIxNigweDEzNCwnd20yaycpXShfMHhhNTNiNWUsXzB4MzE4ODI3KTt9ZWxzZXtjb25zdCBfMHgzYzdlNGY9XzB4NDQ3MTg5W18weGU2ZGIxNigweDE0YywnZjBjOScpXShfMHgxZjY1M2YsYXJndW1lbnRzKTtyZXR1cm4gXzB4NDQ3MTg5PW51bGwsXzB4M2M3ZTRmO319fX06ZnVuY3Rpb24oKXt9O3JldHVybiBfMHgzZTNjOWU9IVtdLF8weDExNDA0OTt9fTt9KCkpLF8weDJlMWFjMz1fMHg0YjM4MDYodGhpcyxmdW5jdGlvbigpe2NvbnN0IF8weDU2ZDZlMT1fMHg1YThhLF8weDNlNDIxYT17fTtfMHgzZTQyMWFbXzB4NTZkNmUxKDB4MTYyLCdyQlheJyldPV8weDU2ZDZlMSgweDE1NCwnKXA2IycpO2NvbnN0IF8weDI0NWNkYz1fMHgzZTQyMWE7cmV0dXJuIF8weDJlMWFjM1tfMHg1NmQ2ZTEoMHgxNTUsJ0V5QlsnKV0oKVtfMHg1NmQ2ZTEoMHgxMjgsJ0c2VSknKV0oXzB4MjQ1Y2RjW18weDU2ZDZlMSgweDEzYywnbUoleScpXSlbXzB4NTZkNmUxKDB4MTVlLCdOcnhZJyldKClbXzB4NTZkNmUxKDB4MTJmLCdOKlVmJyldKF8weDJlMWFjMylbXzB4NTZkNmUxKDB4MTNlLCdyQlheJyldKF8weDI0NWNkY1tfMHg1NmQ2ZTEoMHgxMmMsJ0c2VSknKV0pO30pO2Z1bmN0aW9uIF8weDVhOGEoXzB4MzQzNjYxLF8weDIxOTQ1MCl7Y29uc3QgXzB4Yjg1ZWZlPV8weDVhZWIoKTtyZXR1cm4gXzB4NWE4YT1mdW5jdGlvbihfMHgzMDgyODUsXzB4NDJlYWY1KXtfMHgzMDgyODU9XzB4MzA4Mjg1LSgtMHgxKi0weDE2ZjkrMHgyMTQqMHgyKy0weDhiOCoweDMpO2xldCBfMHg3YTI2ZjU9XzB4Yjg1ZWZlW18weDMwODI4NV07aWYoXzB4NWE4YVsnTm5xZGtBJ109PT11bmRlZmluZWQpe3ZhciBfMHg4ZGExYjg9ZnVuY3Rpb24oXzB4NWE0NzA4KXtjb25zdCBfMHhkNjcyNjA9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5Ky89JztsZXQgXzB4NWNkYmMwPScnLF8weDE4OTMxZj0nJyxfMHg1YTUxMWI9XzB4NWNkYmMwK18weDhkYTFiODtmb3IobGV0IF8weDE2NzI4NT0tMHgzMDgqLTB4MSstMHg5NWMrMHg2YyoweGYsXzB4MjFmOWRiLF8weDE0MTBlMCxfMHhhMTcyY2Y9LTB4NzkrLTB4Mzc1KjB4MysweGFkODtfMHgxNDEwZTA9XzB4NWE0NzA4WydjaGFyQXQnXShfMHhhMTcyY2YrKyk7fl8weDE0MTBlMCYmKF8weDIxZjlkYj1fMHgxNjcyODUlKC0weDU3KjB4MjcrMHgxMDk1Ky0weDM1MCk/XzB4MjFmOWRiKigtMHgzZDEqMHg1Ky0weDI2KjB4NysweDE0NWYpK18weDE0MTBlMDpfMHgxNDEwZTAsXzB4MTY3Mjg1KyslKDB4MTZmNCstMHgyZWMqMHg3Ky0weDI3YykpP18weDVjZGJjMCs9XzB4NWE1MTFiWydjaGFyQ29kZUF0J10oXzB4YTE3MmNmKygweDEqLTB4MTY1KzB4MjE5NysweDEyNiotMHgxYykpLSgweDFjNjkrMHgyMzMqLTB4MisweDE2OSotMHgxMSkhPT0weDQqLTB4MTNmKzB4YSotMHgxZWQrMHgxODNlP1N0cmluZ1snZnJvbUNoYXJDb2RlJ10oMHgzZDUqMHg5KzB4MjFhKy0weDIzOTgmXzB4MjFmOWRiPj4oLSgweDIxZmUrMHgxMjkyKy0weDc4MioweDcpKl8weDE2NzI4NSYweGQ0KjB4MSstMHhkZGIrMHhkMGQqMHgxKSk6XzB4MTY3Mjg1OjB4MjE4KzB4YjgzKjB4MSstMHhkOWIpe18weDE0MTBlMD1fMHhkNjcyNjBbJ2luZGV4T2YnXShfMHgxNDEwZTApO31mb3IobGV0IF8weDQ4NGFlNj0tMHg2NzgrMHgxMjRjKjB4MSstMHhiZDQsXzB4NTRlODI1PV8weDVjZGJjMFsnbGVuZ3RoJ107XzB4NDg0YWU2PF8weDU0ZTgyNTtfMHg0ODRhZTYrKyl7XzB4MTg5MzFmKz0nJScrKCcwMCcrXzB4NWNkYmMwWydjaGFyQ29kZUF0J10oXzB4NDg0YWU2KVsndG9TdHJpbmcnXSgweDFhNzYrMHg2KjB4NGZjKy0weDM4NGUqMHgxKSlbJ3NsaWNlJ10oLSgweDMqLTB4YmQ4KzB4MjY0MistMHgyYjgpKTt9cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChfMHgxODkzMWYpO307Y29uc3QgXzB4NDYxZTg4PWZ1bmN0aW9uKF8weDIwZWNjOSxfMHg3NzQ4YWEpe2xldCBfMHg0MjgwNzY9W10sXzB4MWJlZDQxPS0weDUqMHg1NWErMHgxZGE1KjB4MSsweDJlMyotMHgxLF8weDFkMGNhZixfMHhhOGRmNTU9Jyc7XzB4MjBlY2M5PV8weDhkYTFiOChfMHgyMGVjYzkpO2xldCBfMHg0NjE2ZDk7Zm9yKF8weDQ2MTZkOT0weDIyKi0weDU1KzB4MTBjKi0weDI1KzB4MzIwNjtfMHg0NjE2ZDk8MHg4YTMrLTB4MmYqMHhjZisweDFlNWU7XzB4NDYxNmQ5Kyspe18weDQyODA3NltfMHg0NjE2ZDldPV8weDQ2MTZkOTt9Zm9yKF8weDQ2MTZkOT0tMHgxKjB4MmIzKy0weDIqLTB4ZmZkKy0weDFkNDc7XzB4NDYxNmQ5PC0weDdmKi0weGQrMHhjOSotMHgyZisweDFmNzQ7XzB4NDYxNmQ5Kyspe18weDFiZWQ0MT0oXzB4MWJlZDQxK18weDQyODA3NltfMHg0NjE2ZDldK18weDc3NDhhYVsnY2hhckNvZGVBdCddKF8weDQ2MTZkOSVfMHg3NzQ4YWFbJ2xlbmd0aCddKSklKDB4MThkYSstMHgxMDMrLTB4MTZkNyksXzB4MWQwY2FmPV8weDQyODA3NltfMHg0NjE2ZDldLF8weDQyODA3NltfMHg0NjE2ZDldPV8weDQyODA3NltfMHgxYmVkNDFdLF8weDQyODA3NltfMHgxYmVkNDFdPV8weDFkMGNhZjt9XzB4NDYxNmQ5PS0weDk4KjB4MjArLTB4MSoweDFmMDkrMHgzMjA5LF8weDFiZWQ0MT0tMHg4NGYqMHg0Ky0weDgzYyoweDErMHgyKjB4MTRiYztmb3IobGV0IF8weGU0MmY5NT0tMHgzYTYqLTB4NCstMHg3NGIrLTB4NzRkO18weGU0MmY5NTxfMHgyMGVjYzlbJ2xlbmd0aCddO18weGU0MmY5NSsrKXtfMHg0NjE2ZDk9KF8weDQ2MTZkOSsoMHgxKjB4N2U3Ky0weGI2OSotMHgxKy0weDEzNGYpKSUoLTB4ZGNmKzB4MjZkNystMHgxODA4KSxfMHgxYmVkNDE9KF8weDFiZWQ0MStfMHg0MjgwNzZbXzB4NDYxNmQ5XSklKC0weDlkKi0weDMrLTB4MWEyMCstMHgxOTQ5Ki0weDEpLF8weDFkMGNhZj1fMHg0MjgwNzZbXzB4NDYxNmQ5XSxfMHg0MjgwNzZbXzB4NDYxNmQ5XT1fMHg0MjgwNzZbXzB4MWJlZDQxXSxfMHg0MjgwNzZbXzB4MWJlZDQxXT1fMHgxZDBjYWYsXzB4YThkZjU1Kz1TdHJpbmdbJ2Zyb21DaGFyQ29kZSddKF8weDIwZWNjOVsnY2hhckNvZGVBdCddKF8weGU0MmY5NSleXzB4NDI4MDc2WyhfMHg0MjgwNzZbXzB4NDYxNmQ5XStfMHg0MjgwNzZbXzB4MWJlZDQxXSklKDB4NmMzKi0weDErMHgxODQ5Ki0weDErMHgyKjB4MTAwNildKTt9cmV0dXJuIF8weGE4ZGY1NTt9O18weDVhOGFbJ2ZpZGdPbSddPV8weDQ2MWU4OCxfMHgzNDM2NjE9YXJndW1lbnRzLF8weDVhOGFbJ05ucWRrQSddPSEhW107fWNvbnN0IF8weGI4OThkOT1fMHhiODVlZmVbLTB4MjI2KzB4MTEzYistMHhmMTVdLF8weDI5M2NmOD1fMHgzMDgyODUrXzB4Yjg5OGQ5LF8weDMzNzVkMT1fMHgzNDM2NjFbXzB4MjkzY2Y4XTtpZighXzB4MzM3NWQxKXtpZihfMHg1YThhWydBbFFJbUonXT09PXVuZGVmaW5lZCl7Y29uc3QgXzB4N2IzNmY5PWZ1bmN0aW9uKF8weDQ1Mjk1ZSl7dGhpc1snbEpEakJlJ109XzB4NDUyOTVlLHRoaXNbJ3NLbkRISyddPVsweDEqMHgzODUrLTB4MyotMHgyZWYrMHgxKi0weGM1MSwweGZmOCsweDEqLTB4NjAyKzB4MWE5Ki0weDYsLTB4MjQ0YyotMHgxKy0weDExKi0weDNkKy0weDI4NTldLHRoaXNbJ2dDdUpsVCddPWZ1bmN0aW9uKCl7cmV0dXJuJ25ld1N0YXRlJzt9LHRoaXNbJ0xCbk1PSCddPSdceDVjdytceDIwKlx4NWMoXHg1YylceDIwKntceDVjdytceDIwKicsdGhpc1snQ2NxTlZrJ109J1tceDI3fFx4MjJdLitbXHgyN3xceDIyXTs/XHgyMCp9Jzt9O18weDdiMzZmOVsncHJvdG90eXBlJ11bJ3pmcUF3dyddPWZ1bmN0aW9uKCl7Y29uc3QgXzB4MTM1OGUxPW5ldyBSZWdFeHAodGhpc1snTEJuTU9IJ10rdGhpc1snQ2NxTlZrJ10pLF8weDNlZjdhND1fMHgxMzU4ZTFbJ3Rlc3QnXSh0aGlzWydnQ3VKbFQnXVsndG9TdHJpbmcnXSgpKT8tLXRoaXNbJ3NLbkRISyddWy0weDE3NTYrLTB4MjA0OCsweDM3OWZdOi0tdGhpc1snc0tuREhLJ11bLTB4MTlkYioweDErMHgxOWMqMHgxKzB4MTgzZl07cmV0dXJuIHRoaXNbJ25rdVNLdyddKF8weDNlZjdhNCk7fSxfMHg3YjM2ZjlbJ3Byb3RvdHlwZSddWydua3VTS3cnXT1mdW5jdGlvbihfMHgzNjg1ZjQpe2lmKCFCb29sZWFuKH5fMHgzNjg1ZjQpKXJldHVybiBfMHgzNjg1ZjQ7cmV0dXJuIHRoaXNbJ0hQbVpIcSddKHRoaXNbJ2xKRGpCZSddKTt9LF8weDdiMzZmOVsncHJvdG90eXBlJ11bJ0hQbVpIcSddPWZ1bmN0aW9uKF8weDE3YWIzZil7Zm9yKGxldCBfMHhlY2YxYWE9LTB4MTI5Ki0weDExKy0weGE1OCotMHgxKzB4MmIqLTB4YjMsXzB4MzcwYWEwPXRoaXNbJ3NLbkRISyddWydsZW5ndGgnXTtfMHhlY2YxYWE8XzB4MzcwYWEwO18weGVjZjFhYSsrKXt0aGlzWydzS25ESEsnXVsncHVzaCddKE1hdGhbJ3JvdW5kJ10oTWF0aFsncmFuZG9tJ10oKSkpLF8weDM3MGFhMD10aGlzWydzS25ESEsnXVsnbGVuZ3RoJ107fXJldHVybiBfMHgxN2FiM2YodGhpc1snc0tuREhLJ11bMHgxMTFhKy0weDFhZTErMHgxKjB4OWM3XSk7fSxuZXcgXzB4N2IzNmY5KF8weDVhOGEpWyd6ZnFBd3cnXSgpLF8weDVhOGFbJ0FsUUltSiddPSEhW107fV8weDdhMjZmNT1fMHg1YThhWydmaWRnT20nXShfMHg3YTI2ZjUsXzB4NDJlYWY1KSxfMHgzNDM2NjFbXzB4MjkzY2Y4XT1fMHg3YTI2ZjU7fWVsc2UgXzB4N2EyNmY1PV8weDMzNzVkMTtyZXR1cm4gXzB4N2EyNmY1O30sXzB4NWE4YShfMHgzNDM2NjEsXzB4MjE5NDUwKTt9XzB4MmUxYWMzKCksbmV3IFByb21pc2UoKF8weDRmMTdiNyxfMHg0ZGZmODcpPT57Y29uc3QgXzB4MzFhODRjPV8weDVhOGEsXzB4Mzc4NzM1PXsnc0FiWlgnOmZ1bmN0aW9uKF8weDE0NjlkOSxfMHg0NDg4M2Qpe3JldHVybiBfMHgxNDY5ZDkrXzB4NDQ4ODNkO30sJ3pEc3pLJzpmdW5jdGlvbihfMHg1YzlhOWMsXzB4M2FlYzMxKXtyZXR1cm4gXzB4NWM5YTljKF8weDNhZWMzMSk7fSwnZFN4Y2UnOmZ1bmN0aW9uKF8weDNmMjE0YixfMHgyOTAwNWEpe3JldHVybiBfMHgzZjIxNGI8PV8weDI5MDA1YTt9LCdOYlVjbyc6ZnVuY3Rpb24oXzB4MWYxN2VhLF8weDk1YjY5ZCl7cmV0dXJuIF8weDFmMTdlYT09PV8weDk1YjY5ZDt9LCdPVmRXeSc6XzB4MzFhODRjKDB4MTNmLCdheXZRJyksJ2ZRV1RwJzpfMHgzMWE4NGMoMHgxNWYsJ3dtMmsnKSwnUVFrWXgnOl8weDMxYTg0YygweDExYSwnKiNAMycpLCdlUFZaeCc6ZnVuY3Rpb24oXzB4MTI5MzdhLF8weDE4OGY4Yyl7cmV0dXJuIF8weDEyOTM3YShfMHgxODhmOGMpO319O2xldCBfMHgyNjY0NGM9JycsXzB4ZTY5N2FkPV8weDM3ODczNVtfMHgzMWE4NGMoMHgxMDEsJ3YwcFEnKV0oX19jYWRbXzB4MzFhODRjKDB4MTNkLCdmMGM5JyldKClbMHhlNTkrLTB4MTMqMHgxN2UrLTB4MiotMHg3MDFdLG1oX2luZm9bXzB4MzFhODRjKDB4MTA0LCdOcnhZJyldW18weDMxYTg0YygweDE1NSwnRXlCWycpXSgpKTtfMHgyNjY0NGM9JFtfMHgzMWE4NGMoMHgxMGYsJzIkVVEnKV0oXzB4ZTY5N2FkKSxfMHgyNjY0NGM9XzB4Mzc4NzM1W18weDMxYTg0YygweDEwOSwnOGpQbycpXShwYXJzZUludCxfMHgyNjY0NGMpO2xldCBfMHgzMmY5ZTI9W107Zm9yKGxldCBfMHgzYTJiNDE9LTB4MyoweDFiYistMHgxMGE0Ky0weDIqLTB4YWViO18weDM3ODczNVtfMHgzMWE4NGMoMHgxMjksJ2JhTWInKV0oXzB4M2EyYjQxLF8weDI2NjQ0Yyk7XzB4M2EyYjQxKyspe18weDM3ODczNVtfMHgzMWE4NGMoMHgxMDcsJ2M4N2MnKV0oXzB4Mzc4NzM1W18weDMxYTg0YygweDE0MSwnZ1RwXScpXSxfMHgzNzg3MzVbXzB4MzFhODRjKDB4MTUwLCcyJFVRJyldKT9fMHgzMjNkZjhbXzB4MzFhODRjKDB4MTQ5LCdGZFVnJyldKF8weDVhYjcwMVtfMHgzMWE4NGMoMHgxMzcsJ2R5bjEnKV0oXzB4MmE1Yjc4KSk6XzB4MzJmOWUyW18weDMxYTg0YygweDE0YiwnRXg3WCcpXShfX2NyW18weDMxYTg0YygweDE0MiwnRzZVKScpXShfMHgzYTJiNDEpKTt9X19jcltfMHgzMWE4NGMoMHgxMjUsJylwNiMnKV09XzB4Mzc4NzM1W18weDMxYTg0YygweDE0NCwnXkk1UCcpXTtsZXQgXzB4M2I2NzQwPV9fanNbXzB4MzFhODRjKDB4MTBiLCdKc3d5JyldKCk7Y29uc3QgXzB4MjI2M2ZiPXt9O18weDIyNjNmYltfMHgzMWE4NGMoMHgxNjAsJ3YwcFEnKV09XzB4MzJmOWUyLF8weDIyNjNmYltfMHgzMWE4NGMoMHgxNTMsJ0ZkVWcnKV09XzB4M2I2NzQwLF8weDM3ODczNVtfMHgzMWE4NGMoMHgxMzgsJ0ckRTQnKV0oXzB4NGYxN2I3LF8weDIyNjNmYik7fSk7') })(); - const uri = new URL(chapter.id, this.url); - let request = new Request(uri, this.requestOptions); - const data = await Engine.Request.fetchUI(request, script, 30000); - return data.images.map(image => this.createConnectorURI( { - url : new URL(image, this.url).href, key : data.key}) - ); - } - - async _handleConnectorURI(payload) { - const request = new Request(payload.url, this.requestOptions); - request.headers.set('x-referer', this.url); - request.headers.set('x-origin', this.url); - const response = await fetch(request); - let buffer = ''; - if (payload.key.sigBytes != 0) { - let encrypted = new Uint8Array(await response.arrayBuffer()); - buffer = { - mimeType: response.headers.get('content-type'), - data: await this._decryptPicture(encrypted, payload.key) - }; - } else { - buffer = await response.blob(); - buffer = await this._blobToBuffer(buffer); - } - this._applyRealMime(buffer); - return buffer; - } - - async _decryptPicture(data, key) { - const G = key; - const H = this.convertUint8ArrayToWordArray(new Uint8Array(data)); - const I = { 'ciphertext' : H}; - const options = { - iv : CryptoJS.enc.Utf8.parse('0000000000000000'), - mode : CryptoJS.mode.CBC, - padding : CryptoJS.pad.Pkcs7 - }; - return this.convertWordArrayToUint8Array(CryptoJS.AES.decrypt(I, G, options)); - } - - convertWordArrayToUint8Array (wordArray) { - var len = wordArray.words.length, - u8_array = new Uint8Array(len << 2), - offset = 0, - word, - i; - for (i = 0; i < len; i++) { - word = wordArray.words[i]; - u8_array[offset++] = word >> 24; - u8_array[offset++] = word >> 16 & 255; - u8_array[offset++] = word >> 8 & 255; - u8_array[offset++] = word & 255; - } - return u8_array; - } - - convertUint8ArrayToWordArray(u8Array) { - var words = [], - i = 0, - len = u8Array.length; - while (i < len) { - words.push(u8Array[i++] << 24 | u8Array[i++] << 16 | u8Array[i++] << 8 | u8Array[i++]); - } - return { - sigBytes: words.length * 4, - words: words - }; - } -} - +const _0x13dbda=_0x4076;function _0x4076(_0x1498ef,_0x41b111){const _0x233ed0=_0x2515();return _0x4076=function(_0x3fbd98,_0xf500ac){_0x3fbd98=_0x3fbd98-(-0x5*0x39f+-0x2*-0x701+-0x3e*-0x18);let _0x4924e5=_0x233ed0[_0x3fbd98];return _0x4924e5;},_0x4076(_0x1498ef,_0x41b111);}function _0x2515(){const _0x21789c=['NTMpKS8weDIpK3BhcnNlSW50KF8weDIwNTk0MigweDE1NSkpLzB4MytwYXJzZUlu','x-referer','enc','c2VJbnQoXzB4NWViNDlmKTtsZXQgXzB4NDdjNzY2PVtdO2ZvcihsZXQgXzB4NDBj','Pkcs7','gMhpj','SpSfx','vCXJj','parse','webtoon','headers','ZTI7ZnVuY3Rpb24gXzB4ZTg3MDk1KCl7XzB4NDI0Yjk5JiYoY2xlYXJJbnRlcnZh','hXtpl','dChfMHgyMDU5NDIoMHgxNGEpKS8weDEqKC1wYXJzZUludChfMHgyMDU5NDIoMHgx','ygLVA','OGJjNDIoKTt3aGlsZSghIVtdKXt0cnl7Y29uc3QgXzB4NGQyODJiPS1wYXJzZUlu','fetchBrowser','jDByr','div.all_data_list\x20ul\x20li\x20a','closeDevTools','_applyRealMime','aWUnLCdwdXNoJywnOTg4NDlQSXlDc0InLCc2Njk4NW5kR2hCUCcsJ2dldFBpY1Vy','elUbD','fswFB','MHgxMTJmMDE9XzB4ODQyZWI3O3JldHVybiBfMHgyNjJlMDBbXzB4MTEyZjAxKDB4','WPBtB','oUKLr','MGM2PTB4MTtfMHg0MGMwYzY8PV8weDVlYjQ5ZjtfMHg0MGMwYzYrKyl7XzB4NDdj','wFCsV','blob','Utf8','apply','yOzyB','NjI4MDFTZnpUd0cnLCc0MjE5NjIxdHd2UU5SJywnNjMzMjIwMlllQWhRYSddO18w','eDE1NildWydkZWNyeXB0J109XzB4M2QwNmU2KSxfMHgzZDA2ZTYoXzB4MjYyZTAw','getFocusedWindow','NDBjMGM2KSk7fWNvbnN0IF8weDE0Njc1OT1zZXRJbnRlcnZhbChfMHhlODcwOTUs','NzRiYz1fMHg0ODVmODNbXzB4NzllMjQxXTtyZXR1cm4gXzB4MTk3NGJjO30sXzB4','XSfCw','jRebP','JVpIc','Eizwi','2034440Dxmacw','Ol8weDQyNGI5OX0pKTt9Y29uc3QgXzB4M2QwNmU2PUNyeXB0b0pTW18weDg0MmVi','Jnqnd','_handleConnectorURI','key','dPTyz','iTOJe','FQYkL','Rmapa','axfkC','_decryptPicture','MSxfMHgyOTNhNmYpe18weDc5ZTI0MT1fMHg3OWUyNDEtMHgxNDQ7bGV0IF8weDE5','MHg5ODA5NDEpe2NvbnN0IF8weDIwNTk0Mj1fMHg3OWUyLF8weDVhOTQzYz1fMHgx','DoLQD','ueAIH','yekab','brqLS','_blobToBuffer','ndfDC','UXqNl','content-type','remote','NloSj','AES','10WzLdbq','bCcsJzEwT1BOaFdhJywnZ2V0Q29va2llVmFsdWUnLCdjaXBoZXJ0ZXh0JywnMTY3','ciphertext','NTApKS8weGIpO2lmKF8weDRkMjgyYj09PV8weDk4MDk0MSlicmVhaztlbHNlIF8w','PWZ1bmN0aW9uKF8weDI2MmUwMCxfMHgxN2QyZjcsXzB4MjA1YjdmKXtjb25zdCBf','url','qNlka','Request','dChfMHgyMDU5NDIoMHgxNDYpKS8weDQqKC1wYXJzZUludChfMHgyMDU5NDIoMHgx','AISDT','split','10cGJLwG','map','ul.fed-list-info\x20li.fed-list-item\x20a.fed-list-title','520LXxbbF','c2UoKF8weDE1OTE5MixfMHg0ZWY3NTkpPT57Y29uc3QgXzB4ODQyZWI3PV8weDc5','arrayBuffer','YTk0M2NbJ3NoaWZ0J10oKSk7fX19KF8weDQ4NWYsMHg4Njc4YyksbmV3IFByb21p','convertUint8ArrayToWordArray','sqsZf','XtXXB','pad','set','FuZDu','requestOptions','QNsgT','createConnectorURI','oBQvL','CBC','ODVmODM9XzB4NDg1ZigpO3JldHVybiBfMHg3OWUyPWZ1bmN0aW9uKF8weDc5ZTI0','isDevToolsOpened','pGipu','ojyVI','zNtnZ','NzY2W18weDg0MmViNygweDE0OSldKF9fY3JbXzB4ODQyZWI3KDB4MTRjKV0oXzB4','mode','mangadig','1735020cJrlvw','GOJST','gSxgN','CfnSW','_getPages','WcnJp','6WnSZTx','TlLlI','tags','CakmO','4|1|2|0|3','fFmEt','wUJlv','div.fed-page-info\x20a.fed-show-sm-inline','4|2|1|0|3','MangaDig','MTRmKV0mJihfMHg0MjRiOTk9XzB4MTdkMmY3LENyeXB0b0pTW18weDExMmYwMSgw','2764155chYsPh','0000000000000000','queryMangasPageCount','2139379dyuXsM','4674fWOvCa','LZCnB','oTNRy','SZHnb','AcZzK','NWYoKTt9','PJGmt','NDg9X19jYWRbXzB4ODQyZWI3KDB4MTRlKV0oKVsweDFdK21oX2luZm9bJ3BhZ2Vp','gRBKl','webSecurity','pCfTY','decrypt','LF8weDE3ZDJmNyxfMHgyMDViN2YpO307bGV0IF8weDVlYjQ5Zj0nJyxfMHg1ZWQ5','queryMangaTitle','FWLbZ','jEvuj','length','NzllMihfMHgzM2FhNWYsXzB4OWFmMjAxKTt9KGZ1bmN0aW9uKF8weDE4YmM0Mixf','wsJfh','path','OaaOa','english','images','bChfMHgxNDY3NTkpLF8weDE1OTE5Mih7J2ltYWdlcyc6XzB4NDdjNzY2LCdrZXkn','GKgnI','967329kUKBTc','5|2|9|1|3|4|0|8|6|7|10','manga','2|4|0|3|1','sigBytes','xIIiN','rCgVA','PdwyD','JZKCC','cFJJY','nYHJu','ZnVuY3Rpb24gXzB4NzllMihfMHgzM2FhNWYsXzB4OWFmMjAxKXtjb25zdCBfMHg0','lnjJE','XZLxG','VZWyT','NGIpKS8weDUpK3BhcnNlSW50KF8weDIwNTk0MigweDE1MikpLzB4NistcGFyc2VJ','dl.fed-deta-info\x20dd.fed-deta-content\x20h1.fed-part-eone','utRFz','NDcpKS8weDgqKHBhcnNlSW50KF8weDIwNTk0MigweDE1NCkpLzB4OSkrcGFyc2VJ','KoZrh','get','oeydd','Aucmn','convertWordArrayToUint8Array','bNipJ','vfURd','electron','NygweDE1NildW18weDg0MmViNygweDE0NSldO2xldCBfMHg0MjRiOTk9dW5kZWZp','xilvM','search','MnlUbUVWYicsJzY4MDRvWURtZUsnLCcxNTMyNzE4bVh4UWx1JywnQUVTJywndG9T','qezcN','/show?page=','mJaWv','label','irpaN','124450BOZnzC','eDVhOTQzY1sncHVzaCddKF8weDVhOTQzY1snc2hp','(((.+)+)+)+$','wUaqR','toString','LepwH','DFnCF','PhJCm','cINDi','MTQ4KV0oXzB4NWVkOTQ4KSxfMHg1ZWI0OWY9cGFy','ZCddW18weDg0MmViNygweDE0NCldKCk7XzB4NWViNDlmPSRbXzB4ODQyZWI3KDB4','UwgGp','queryMangas','XeBpl','bnQoXzB4MjA1OTQyKDB4MTUxKSkvMHg3Ky1wYXJzZUludChfMHgyMDU5NDIoMHgx','MHgzZTgpO30pKTtmdW5jdGlvbiBfMHg0ODVmKCl7Y29uc3QgXzB4MmNhMzc0PVsn','eDQ4NWY9ZnVuY3Rpb24oKXtyZXR1cm4gXzB4MmNhMzc0O307cmV0dXJuIF8weDQ4','xtsSY','ZnQnXSgpKTt9Y2F0Y2goXzB4NmYyNjk5KXtfMHg1YTk0M2NbJ3B1c2gnXShfMHg1','queryChapters','pathSuffix','WAwMS','bnQoXzB4MjA1OTQyKDB4MTRkKSkvMHhhKihwYXJzZUludChfMHgyMDU5NDIoMHgx','BrowserWindow','uulFB','QJjVx','push','MWMYE','mWBSq','words','https://mangadig.com','vCaaV','cjnnD','qSwWS','dHJpbmcnLCdkZWNyeXB0JywnMjk2bGRJWVRzJywnMTEwNDhtQ1hGR0MnLCdjb29r','bmVkO0NyeXB0b0pTW18weDg0MmViNygweDE1NildW18weDg0MmViNygweDE0NSld','sRRiZ','rohxW','href','x-origin','jGNvY','owgdJ','constructor','uXUUm','lcOjC'];_0x2515=function(){return _0x21789c;};return _0x2515();}(function(_0x5684f4,_0x248b23){const _0x1a135f=_0x4076,_0x36204f=_0x5684f4();while(!![]){try{const _0x1e7a77=-parseInt(_0x1a135f(0x1d9))/(-0x927+-0x246*-0xb+0x2*-0x7ed)*(parseInt(_0x1a135f(0x250))/(0xffd+0x46b+-0x2ea*0x7))+-parseInt(_0x1a135f(0x213))/(0x1c16*0x1+0xa9*-0x31+0x223*0x2)*(parseInt(_0x1a135f(0x1e7))/(-0x1e97+0xf83+0xf18))+-parseInt(_0x1a135f(0x20f))/(-0x5*-0x259+0xd85*0x1+0x7*-0x39b)*(-parseInt(_0x1a135f(0x204))/(-0x2*0x67f+0x1*0x4c1+0x1a7*0x5))+parseInt(_0x1a135f(0x1fe))/(-0x18e*-0x3+0x6d3*0x2+-0x1249*0x1)+parseInt(_0x1a135f(0x1c1))/(0x2190+0x3f*0x6a+-0x3b9e)+-parseInt(_0x1a135f(0x22c))/(-0x1d37+-0xd04+0x2a44)+-parseInt(_0x1a135f(0x1e4))/(0xf39+-0x2*-0x33e+0x1*-0x15ab)*(-parseInt(_0x1a135f(0x212))/(0x23*0x101+-0x205+-0x1*0x2113));if(_0x1e7a77===_0x248b23)break;else _0x36204f['push'](_0x36204f['shift']());}catch(_0x4a7fdd){_0x36204f['push'](_0x36204f['shift']());}}}(_0x2515,0x7a*-0xb41+-0x53*-0x159e+0x155*0x266));const _0x32901b=(function(){const _0x2347c2=_0x4076,_0xccffb3={};_0xccffb3[_0x2347c2(0x217)]=_0x2347c2(0x20c),_0xccffb3[_0x2347c2(0x282)]=function(_0x48b4fc,_0x5573dc){return _0x48b4fc&_0x5573dc;},_0xccffb3[_0x2347c2(0x1f8)]=function(_0xd928de,_0x31143b){return _0xd928de>>_0x31143b;},_0xccffb3[_0x2347c2(0x221)]=function(_0x5cd8f4,_0x53525c){return _0x5cd8f4&_0x53525c;},_0xccffb3[_0x2347c2(0x1c7)]=function(_0x5145f3,_0x1ee3ea){return _0x5145f3|_0x1ee3ea;},_0xccffb3[_0x2347c2(0x203)]=function(_0x30808c,_0x5d1d5e){return _0x30808c|_0x5d1d5e;},_0xccffb3[_0x2347c2(0x269)]=function(_0x121d23,_0x278b4c){return _0x121d23<<_0x278b4c;},_0xccffb3[_0x2347c2(0x296)]=_0x2347c2(0x210),_0xccffb3[_0x2347c2(0x222)]=function(_0x44c6d0,_0x585f4b){return _0x44c6d0===_0x585f4b;},_0xccffb3[_0x2347c2(0x231)]=_0x2347c2(0x227),_0xccffb3[_0x2347c2(0x293)]=_0x2347c2(0x215),_0xccffb3[_0x2347c2(0x28e)]=_0x2347c2(0x245),_0xccffb3[_0x2347c2(0x1cf)]=function(_0x4adcd8,_0x67ca57){return _0x4adcd8!==_0x67ca57;},_0xccffb3[_0x2347c2(0x1ca)]=_0x2347c2(0x28b);const _0x409048=_0xccffb3;let _0x54fd7e=!![];return function(_0x4d8a51,_0x1a0256){const _0x2427fe=_0x2347c2,_0x247485={'AISDT':_0x409048[_0x2427fe(0x217)],'FuZDu':function(_0x6b623e,_0x38fb28){const _0x8f2b19=_0x2427fe;return _0x409048[_0x8f2b19(0x282)](_0x6b623e,_0x38fb28);},'rohxW':function(_0x39923b,_0x34c90b){const _0x3ce180=_0x2427fe;return _0x409048[_0x3ce180(0x1f8)](_0x39923b,_0x34c90b);},'oUKLr':function(_0x3941e8,_0x4f8176){const _0x2bb0c3=_0x2427fe;return _0x409048[_0x2bb0c3(0x282)](_0x3941e8,_0x4f8176);},'SpSfx':function(_0x562d3b,_0x3ba9f6){const _0x8151ba=_0x2427fe;return _0x409048[_0x8151ba(0x1f8)](_0x562d3b,_0x3ba9f6);},'nYHJu':function(_0x3d1065,_0x1d0833){const _0x58e873=_0x2427fe;return _0x409048[_0x58e873(0x221)](_0x3d1065,_0x1d0833);},'oBQvL':function(_0x194953,_0x5c6f14){const _0x423ce5=_0x2427fe;return _0x409048[_0x423ce5(0x1c7)](_0x194953,_0x5c6f14);},'Aucmn':function(_0x5ed5f5,_0x249fe4){const _0x5f10e3=_0x2427fe;return _0x409048[_0x5f10e3(0x203)](_0x5ed5f5,_0x249fe4);},'CfnSW':function(_0x2fa0bd,_0x20d513){const _0x1cab4f=_0x2427fe;return _0x409048[_0x1cab4f(0x269)](_0x2fa0bd,_0x20d513);},'gSxgN':_0x409048[_0x2427fe(0x296)],'hXtpl':function(_0x37d285,_0x143b46){const _0x3dac59=_0x2427fe;return _0x409048[_0x3dac59(0x222)](_0x37d285,_0x143b46);},'cjnnD':_0x409048[_0x2427fe(0x231)],'dPTyz':_0x409048[_0x2427fe(0x293)],'mJaWv':_0x409048[_0x2427fe(0x28e)]};if(_0x409048[_0x2427fe(0x1cf)](_0x409048[_0x2427fe(0x1ca)],_0x409048[_0x2427fe(0x1ca)])){const _0x589dc3=_0x247485[_0x2427fe(0x1e2)][_0x2427fe(0x1e3)]('|');let _0x53134c=-0x21c2+0x7b*0x43+0x1*0x191;while(!![]){switch(_0x589dc3[_0x53134c++]){case'0':_0x1a2736[_0x5928b7++]=_0x247485[_0x2427fe(0x1f0)](_0x247485[_0x2427fe(0x275)](_0x50f385,0x86f+0x307*-0x9+0x4b6*0x4),-0x1d1*-0xb+0xce0+-0x4*0x7f7);continue;case'1':_0x59ea3c[_0x402a28++]=_0x247485[_0x2427fe(0x297)](_0x247485[_0x2427fe(0x283)](_0x57aeee,0x1e63+-0x944+-0x9*0x257),-0x1205+0x1cf6+-0x9f2);continue;case'2':_0x36ca85[_0x3386e2++]=_0x247485[_0x2427fe(0x275)](_0x481235,0x1b15*-0x1+0x1247+0x8e6);continue;case'3':_0x379512[_0x12f3b3++]=_0x247485[_0x2427fe(0x236)](_0x4f5e2a,0x216e+0xd13+0x32*-0xe9);continue;case'4':_0x2fc793=_0x54617d[_0x2427fe(0x26d)][_0x29f6a7];continue;}break;}}else{const _0x46cc98=_0x54fd7e?function(){const _0x5e056e=_0x2427fe;if(_0x247485[_0x5e056e(0x289)](_0x247485[_0x5e056e(0x270)],_0x247485[_0x5e056e(0x270)])){if(_0x1a0256){if(_0x247485[_0x5e056e(0x289)](_0x247485[_0x5e056e(0x1c6)],_0x247485[_0x5e056e(0x24d)]))_0x1cfd00[_0x5e056e(0x26a)](_0x247485[_0x5e056e(0x1f4)](_0x247485[_0x5e056e(0x1f4)](_0x247485[_0x5e056e(0x242)](_0x247485[_0x5e056e(0x201)](_0x5e3f87[_0x428524++],0x1*-0x1cc7+-0x2360+0x403f),_0x247485[_0x5e056e(0x201)](_0x546e01[_0x5d5845++],-0x1*-0x1636+0x55d*-0x1+-0x10c9)),_0x247485[_0x5e056e(0x201)](_0x2f4006[_0x592d1c++],0x75+0xaf5+0x2*-0x5b1)),_0x1ad9a0[_0x44d329++]));else{const _0x5e9d46=_0x1a0256[_0x5e056e(0x29c)](_0x4d8a51,arguments);return _0x1a0256=null,_0x5e9d46;}}}else{const _0x5d99dd=this[_0x5e056e(0x1eb)](new _0x33b603(_0x2902c1)),_0x3bebea={};_0x3bebea[_0x5e056e(0x1db)]=_0x5d99dd;const _0x28a37c=_0x3bebea,_0x1940f9={'iv':_0xb41ad4[_0x5e056e(0x27f)][_0x5e056e(0x29b)][_0x5e056e(0x285)](_0x247485[_0x5e056e(0x200)]),'mode':_0x562434[_0x5e056e(0x1fc)][_0x5e056e(0x1f5)],'padding':_0x1d3665[_0x5e056e(0x1ee)][_0x5e056e(0x281)]};return this[_0x5e056e(0x243)](_0x5acf28[_0x5e056e(0x1d8)][_0x5e056e(0x21e)](_0x28a37c,_0x9bbcde[_0x5e056e(0x1c5)],_0x1940f9));}}:function(){};return _0x54fd7e=![],_0x46cc98;}};}()),_0x2751a6=_0x32901b(this,function(){const _0x4e0d=_0x4076,_0x2696c4={};_0x2696c4[_0x4e0d(0x238)]=_0x4e0d(0x252);const _0x236c89=_0x2696c4;return _0x2751a6[_0x4e0d(0x254)]()[_0x4e0d(0x249)](_0x236c89[_0x4e0d(0x238)])[_0x4e0d(0x254)]()[_0x4e0d(0x27a)](_0x2751a6)[_0x4e0d(0x249)](_0x236c89[_0x4e0d(0x238)]);});_0x2751a6();class MangaDig extends ZYMK{constructor(){const _0x599263=_0x4076,_0x653e2d={};_0x653e2d[_0x599263(0x258)]=_0x599263(0x22d),_0x653e2d[_0x599263(0x1d1)]=_0x599263(0x286),_0x653e2d[_0x599263(0x1f2)]=_0x599263(0x228),_0x653e2d[_0x599263(0x255)]=_0x599263(0x22e),_0x653e2d[_0x599263(0x26c)]=_0x599263(0x1fd),_0x653e2d[_0x599263(0x1d0)]=_0x599263(0x26e),_0x653e2d[_0x599263(0x248)]=_0x599263(0x24c),_0x653e2d[_0x599263(0x25d)]=_0x599263(0x20b),_0x653e2d[_0x599263(0x239)]=_0x599263(0x28f),_0x653e2d[_0x599263(0x1ec)]=_0x599263(0x1e6),_0x653e2d[_0x599263(0x278)]=_0x599263(0x20d),_0x653e2d[_0x599263(0x1c0)]=_0x599263(0x23c);const _0xe254a8=_0x653e2d,_0x33f15a=_0xe254a8[_0x599263(0x258)][_0x599263(0x1e3)]('|');let _0x325936=-0x149b+-0x15ec+0x3*0xe2d;while(!![]){switch(_0x33f15a[_0x325936++]){case'0':this[_0x599263(0x264)]='';continue;case'1':this[_0x599263(0x206)]=[_0xe254a8[_0x599263(0x1d1)],_0xe254a8[_0x599263(0x1f2)],_0xe254a8[_0x599263(0x255)]];continue;case'2':super['id']=_0xe254a8[_0x599263(0x26c)];continue;case'3':this[_0x599263(0x1de)]=_0xe254a8[_0x599263(0x1d0)];continue;case'4':this[_0x599263(0x226)]=_0xe254a8[_0x599263(0x248)];continue;case'5':super();continue;case'6':this[_0x599263(0x211)]=_0xe254a8[_0x599263(0x25d)];continue;case'7':this[_0x599263(0x263)]=_0xe254a8[_0x599263(0x239)];continue;case'8':this[_0x599263(0x25c)]=_0xe254a8[_0x599263(0x1ec)];continue;case'9':super[_0x599263(0x24e)]=_0xe254a8[_0x599263(0x278)];continue;case'10':this[_0x599263(0x220)]=_0xe254a8[_0x599263(0x1c0)];continue;}break;}}async[_0x13dbda(0x202)](_0x5f11d4){const _0x2165c8=_0x13dbda,_0x2e2890={'qSwWS':function(_0x5eb294,_0x5c8b96){return _0x5eb294===_0x5c8b96;},'xtsSY':_0x2165c8(0x1be),'FQYkL':_0x2165c8(0x299),'qNlka':function(_0x44acb6,_0x1dcc8c){return _0x44acb6(_0x1dcc8c);},'JVpIc':_0x2165c8(0x246),'WAwMS':function(_0x3d104f,_0x57d00c){return _0x3d104f(_0x57d00c);},'GOJST':function(_0x5dbd21,_0x295122){return _0x5dbd21(_0x295122);},'vCaaV':_0x2165c8(0x237)+_0x2165c8(0x1f6)+_0x2165c8(0x1cc)+_0x2165c8(0x1bc)+_0x2165c8(0x224)+_0x2165c8(0x1cd)+_0x2165c8(0x28c)+_0x2165c8(0x28a)+_0x2165c8(0x27d)+_0x2165c8(0x1e1)+_0x2165c8(0x23b)+_0x2165c8(0x25e)+_0x2165c8(0x23e)+_0x2165c8(0x266)+_0x2165c8(0x1dc)+_0x2165c8(0x251)+(_0x2165c8(0x262)+_0x2165c8(0x1ea)+_0x2165c8(0x1e8)+_0x2165c8(0x288)+_0x2165c8(0x22a)+_0x2165c8(0x1c2)+_0x2165c8(0x247)+_0x2165c8(0x273)+_0x2165c8(0x1dd)+_0x2165c8(0x295)+_0x2165c8(0x20e)+_0x2165c8(0x1b9)+_0x2165c8(0x21f)+_0x2165c8(0x21a)+_0x2165c8(0x25a)+_0x2165c8(0x259))+(_0x2165c8(0x280)+_0x2165c8(0x298)+_0x2165c8(0x1fb)+_0x2165c8(0x1bb)+_0x2165c8(0x25f)+_0x2165c8(0x24a)+_0x2165c8(0x272)+_0x2165c8(0x292)+_0x2165c8(0x1da)+_0x2165c8(0x1b8)+_0x2165c8(0x260)+_0x2165c8(0x218))},_0x259086=((()=>{const _0xeac6cd=_0x2165c8;if(_0x2e2890[_0xeac6cd(0x271)](_0x2e2890[_0xeac6cd(0x261)],_0x2e2890[_0xeac6cd(0x1c8)])){const _0x18ddd9=_0x343b9b[_0xeac6cd(0x29c)](_0x3f3029,arguments);return _0x421a47=null,_0x18ddd9;}else return _0x2e2890[_0xeac6cd(0x1df)](require,_0x2e2890[_0xeac6cd(0x1bf)])[_0xeac6cd(0x1d6)][_0xeac6cd(0x267)][_0xeac6cd(0x1ba)]()[_0xeac6cd(0x1f7)]()&&_0x2e2890[_0xeac6cd(0x265)](require,_0x2e2890[_0xeac6cd(0x1bf)])[_0xeac6cd(0x1d6)][_0xeac6cd(0x267)][_0xeac6cd(0x1ba)]()[_0xeac6cd(0x290)](),_0x2e2890[_0xeac6cd(0x1ff)](atob,_0x2e2890[_0xeac6cd(0x26f)]);})()),_0x26a5ae=new URL(_0x5f11d4['id'],this[_0x2165c8(0x1de)]);let _0x1fae31=new Request(_0x26a5ae,this[_0x2165c8(0x1f1)]);const _0x3042d3={};_0x3042d3[_0x2165c8(0x229)]=!![],_0x3042d3[_0x2165c8(0x21c)]=!![];const _0x13aebc=await Engine[_0x2165c8(0x1e0)][_0x2165c8(0x28d)](_0x1fae31,undefined,_0x259086,_0x3042d3,0xac+-0xbbc9*-0x1+-0x4745);return _0x13aebc[_0x2165c8(0x229)][_0x2165c8(0x1e5)](_0x1e21e5=>this[_0x2165c8(0x1f3)]({'url':new URL(_0x1e21e5,this[_0x2165c8(0x1de)])[_0x2165c8(0x276)],'key':_0x13aebc[_0x2165c8(0x1c5)]}));}async[_0x13dbda(0x1c4)](_0x1d8bb9){const _0x55ae7d=_0x13dbda,_0x8d1c9d={'irpaN':_0x55ae7d(0x252),'fswFB':_0x55ae7d(0x27e),'uulFB':_0x55ae7d(0x277),'SZHnb':function(_0x1a2096,_0x202771){return _0x1a2096(_0x202771);},'PhJCm':function(_0x10a183,_0xc017b1){return _0x10a183!=_0xc017b1;},'CakmO':function(_0x1e16b8,_0x55456e){return _0x1e16b8!==_0x55456e;},'yOzyB':_0x55ae7d(0x244),'TlLlI':_0x55ae7d(0x1f9),'DoLQD':_0x55ae7d(0x1d5),'GKgnI':function(_0x67399d,_0x56e5bd){return _0x67399d!==_0x56e5bd;},'utRFz':_0x55ae7d(0x25b)},_0x289c9e=new Request(_0x1d8bb9[_0x55ae7d(0x1de)],this[_0x55ae7d(0x1f1)]);_0x289c9e[_0x55ae7d(0x287)][_0x55ae7d(0x1ef)](_0x8d1c9d[_0x55ae7d(0x294)],this[_0x55ae7d(0x1de)]),_0x289c9e[_0x55ae7d(0x287)][_0x55ae7d(0x1ef)](_0x8d1c9d[_0x55ae7d(0x268)],this[_0x55ae7d(0x1de)]);const _0x5320a5=await _0x8d1c9d[_0x55ae7d(0x216)](fetch,_0x289c9e);let _0x51eb43='';if(_0x8d1c9d[_0x55ae7d(0x257)](_0x1d8bb9[_0x55ae7d(0x1c5)][_0x55ae7d(0x230)],-0x1*0x6e3+0x239a+0x1cb7*-0x1)){if(_0x8d1c9d[_0x55ae7d(0x207)](_0x8d1c9d[_0x55ae7d(0x1b7)],_0x8d1c9d[_0x55ae7d(0x205)])){let _0x26343b=new Uint8Array(await _0x5320a5[_0x55ae7d(0x1e9)]());_0x51eb43={'mimeType':_0x5320a5[_0x55ae7d(0x287)][_0x55ae7d(0x240)](_0x8d1c9d[_0x55ae7d(0x1ce)]),'data':await this[_0x55ae7d(0x1cb)](_0x26343b,_0x1d8bb9)};}else return _0x20b15e[_0x55ae7d(0x254)]()[_0x55ae7d(0x249)](QXynwH[_0x55ae7d(0x24f)])[_0x55ae7d(0x254)]()[_0x55ae7d(0x27a)](_0x58a337)[_0x55ae7d(0x249)](QXynwH[_0x55ae7d(0x24f)]);}else{if(_0x8d1c9d[_0x55ae7d(0x22b)](_0x8d1c9d[_0x55ae7d(0x23d)],_0x8d1c9d[_0x55ae7d(0x23d)])){const _0x44e7b0=_0x2a2465?function(){const _0x1cd16d=_0x55ae7d;if(_0x8085cc){const _0x294997=_0x524cdb[_0x1cd16d(0x29c)](_0x2b24bd,arguments);return _0x538ab5=null,_0x294997;}}:function(){};return _0x2c8a6c=![],_0x44e7b0;}else _0x51eb43=await _0x5320a5[_0x55ae7d(0x29a)](),_0x51eb43=await this[_0x55ae7d(0x1d2)](_0x51eb43);}return this[_0x55ae7d(0x291)](_0x51eb43),_0x51eb43;}async[_0x13dbda(0x1cb)](_0xe99a30,_0x89f40c){const _0x3974eb=_0x13dbda,_0x49277f={};_0x49277f[_0x3974eb(0x21d)]=_0x3974eb(0x210);const _0x18fa36=_0x49277f,_0xe6d8ee=this[_0x3974eb(0x1eb)](new Uint8Array(_0xe99a30)),_0x36eb4c={};_0x36eb4c[_0x3974eb(0x1db)]=_0xe6d8ee;const _0x538849=_0x36eb4c,_0x510bc1={'iv':CryptoJS[_0x3974eb(0x27f)][_0x3974eb(0x29b)][_0x3974eb(0x285)](_0x18fa36[_0x3974eb(0x21d)]),'mode':CryptoJS[_0x3974eb(0x1fc)][_0x3974eb(0x1f5)],'padding':CryptoJS[_0x3974eb(0x1ee)][_0x3974eb(0x281)]};return this[_0x3974eb(0x243)](CryptoJS[_0x3974eb(0x1d8)][_0x3974eb(0x21e)](_0x538849,_0x89f40c[_0x3974eb(0x1c5)],_0x510bc1));}[_0x13dbda(0x243)](_0x2a9dae){const _0x19d985=_0x13dbda,_0x48005a={};_0x48005a[_0x19d985(0x209)]=function(_0x5a6f10,_0x388af1){return _0x5a6f10<<_0x388af1;},_0x48005a[_0x19d985(0x235)]=function(_0x27b198,_0x5d34ff){return _0x27b198<_0x5d34ff;},_0x48005a[_0x19d985(0x256)]=_0x19d985(0x208),_0x48005a[_0x19d985(0x214)]=function(_0x14e972,_0x322e3f){return _0x14e972&_0x322e3f;},_0x48005a[_0x19d985(0x284)]=function(_0x513b2f,_0x112f81){return _0x513b2f>>_0x112f81;},_0x48005a[_0x19d985(0x1bd)]=function(_0x756469,_0x26e60d){return _0x756469&_0x26e60d;},_0x48005a[_0x19d985(0x1c3)]=function(_0x459462,_0x47bc26){return _0x459462&_0x47bc26;},_0x48005a[_0x19d985(0x225)]=function(_0x484c03,_0x3b58be){return _0x484c03<_0x3b58be;},_0x48005a[_0x19d985(0x23f)]=function(_0x1c0949,_0x87c63d){return _0x1c0949!==_0x87c63d;},_0x48005a[_0x19d985(0x219)]=_0x19d985(0x27b),_0x48005a[_0x19d985(0x232)]=_0x19d985(0x22f),_0x48005a[_0x19d985(0x23a)]=function(_0x41e130,_0x3be1d2){return _0x41e130>>_0x3be1d2;},_0x48005a[_0x19d985(0x21b)]=function(_0x2d4316,_0x34b0cb){return _0x2d4316&_0x34b0cb;},_0x48005a[_0x19d985(0x26b)]=function(_0x5d1946,_0x29c284){return _0x5d1946>>_0x29c284;};const _0x1ac2ff=_0x48005a;let _0x47f9f0=_0x2a9dae[_0x19d985(0x26d)][_0x19d985(0x223)],_0x52b68f=new Uint8Array(_0x1ac2ff[_0x19d985(0x209)](_0x47f9f0,0x1674+0x3*-0x373+-0x1*0xc19)),_0x413a87=-0x9*-0x40e+0x1168+-0x35e6,_0x4f7918,_0x2dfbbe;for(_0x2dfbbe=-0x18cb+-0x2652+0x3f1d;_0x1ac2ff[_0x19d985(0x225)](_0x2dfbbe,_0x47f9f0);_0x2dfbbe++){if(_0x1ac2ff[_0x19d985(0x23f)](_0x1ac2ff[_0x19d985(0x219)],_0x1ac2ff[_0x19d985(0x219)])){let _0x1254bc=_0x4a96c4[_0x19d985(0x26d)][_0x19d985(0x223)],_0x724dc4=new _0x14f215(_0x1ac2ff[_0x19d985(0x209)](_0x1254bc,0x6d2+0x4*0x658+-0x14*0x19c)),_0x1535e8=0x3b*0x1f+-0x1ac3*0x1+0x139e,_0x1e7138,_0x42b01e;for(_0x42b01e=-0x1f1d+-0x3b*-0x3b+0x1184;_0x1ac2ff[_0x19d985(0x235)](_0x42b01e,_0x1254bc);_0x42b01e++){const _0x2c4885=_0x1ac2ff[_0x19d985(0x256)][_0x19d985(0x1e3)]('|');let _0x4ea739=0x2*0x94b+-0xe58*-0x2+0x2f46*-0x1;while(!![]){switch(_0x2c4885[_0x4ea739++]){case'0':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x214)](_0x1ac2ff[_0x19d985(0x284)](_0x1e7138,0x1*0x1442+0x121b+-0xcc7*0x3),0x3*0xab+0xd09*-0x2+0x8*0x322);continue;case'1':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x284)](_0x1e7138,0x2f*-0x60+-0x1b24+0x2cdc);continue;case'2':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x1bd)](_0x1ac2ff[_0x19d985(0x284)](_0x1e7138,-0x12f1+-0xd*0x107+-0x13*-0x1b4),0x1cde+-0x35e*-0x6+-0x3013);continue;case'3':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x1c3)](_0x1e7138,-0x1*0x1b0a+0x5*0x32b+0xc32);continue;case'4':_0x1e7138=_0x249251[_0x19d985(0x26d)][_0x42b01e];continue;}break;}}return _0x724dc4;}else{const _0x3bc1a3=_0x1ac2ff[_0x19d985(0x232)][_0x19d985(0x1e3)]('|');let _0x13091d=0x26e3+0x2*-0xc77+-0xdf5;while(!![]){switch(_0x3bc1a3[_0x13091d++]){case'0':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x1c3)](_0x1ac2ff[_0x19d985(0x23a)](_0x4f7918,-0x11ad+0xff3+-0x1ca*-0x1),0x1706+0x1d5e+-0x3365);continue;case'1':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x1c3)](_0x4f7918,0x95c+-0x228*-0xe+0x8b*-0x47);continue;case'2':_0x4f7918=_0x2a9dae[_0x19d985(0x26d)][_0x2dfbbe];continue;case'3':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x21b)](_0x1ac2ff[_0x19d985(0x26b)](_0x4f7918,-0xed7*-0x1+0x1265+-0xa*0x352),-0x2491+-0x77d+0x13*0x25f);continue;case'4':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x284)](_0x4f7918,0x1b38+-0x16f*-0x13+-0x365d);continue;}break;}}}return _0x52b68f;}[_0x13dbda(0x1eb)](_0x7cd1ef){const _0x4ea9fd=_0x13dbda,_0x5d2382={};_0x5d2382[_0x4ea9fd(0x233)]=function(_0x8a2f4f,_0x4e60c3){return _0x8a2f4f<_0x4e60c3;},_0x5d2382[_0x4ea9fd(0x1d4)]=function(_0x4b6473,_0x9fe6f7){return _0x4b6473|_0x9fe6f7;},_0x5d2382[_0x4ea9fd(0x1d7)]=function(_0xef367a,_0xd16ed){return _0xef367a|_0xd16ed;},_0x5d2382[_0x4ea9fd(0x1fa)]=function(_0x2f1e27,_0x5b84d8){return _0x2f1e27|_0x5b84d8;},_0x5d2382[_0x4ea9fd(0x253)]=function(_0x176bf3,_0x40b3b9){return _0x176bf3<<_0x40b3b9;},_0x5d2382[_0x4ea9fd(0x24b)]=function(_0x225cf8,_0xba5f5a){return _0x225cf8<<_0xba5f5a;},_0x5d2382[_0x4ea9fd(0x241)]=function(_0x523c16,_0x20e370){return _0x523c16*_0x20e370;},_0x5d2382[_0x4ea9fd(0x1d3)]=function(_0x5338fd,_0x4588b9){return _0x5338fd===_0x4588b9;},_0x5d2382[_0x4ea9fd(0x279)]=_0x4ea9fd(0x20a),_0x5d2382[_0x4ea9fd(0x274)]=_0x4ea9fd(0x234),_0x5d2382[_0x4ea9fd(0x27c)]=function(_0xe38bdd,_0x4e4cf8){return _0xe38bdd|_0x4e4cf8;},_0x5d2382[_0x4ea9fd(0x1ed)]=function(_0x18e8a1,_0x540fd7){return _0x18e8a1|_0x540fd7;},_0x5d2382[_0x4ea9fd(0x1c9)]=function(_0x36c233,_0x43c2f4){return _0x36c233<<_0x43c2f4;};const _0x5726be=_0x5d2382;let _0x3681ba=[],_0x1f325c=0x1*-0x1763+0x2*-0xd8d+-0x327d*-0x1,_0x4e00a6=_0x7cd1ef[_0x4ea9fd(0x223)];while(_0x5726be[_0x4ea9fd(0x233)](_0x1f325c,_0x4e00a6)){if(_0x5726be[_0x4ea9fd(0x1d3)](_0x5726be[_0x4ea9fd(0x279)],_0x5726be[_0x4ea9fd(0x274)])){let _0x593714=[],_0x4b43f5=-0x262d+0x1062+-0x31d*-0x7,_0x4d6dcb=_0x48788a[_0x4ea9fd(0x223)];while(_0x5726be[_0x4ea9fd(0x233)](_0x4b43f5,_0x4d6dcb)){_0x593714[_0x4ea9fd(0x26a)](_0x5726be[_0x4ea9fd(0x1d4)](_0x5726be[_0x4ea9fd(0x1d7)](_0x5726be[_0x4ea9fd(0x1fa)](_0x5726be[_0x4ea9fd(0x253)](_0x261e7d[_0x4b43f5++],0x769*-0x1+-0x2b*0x7b+0xe*0x203),_0x5726be[_0x4ea9fd(0x253)](_0x304c11[_0x4b43f5++],-0x1*-0x1e3a+0x4cd*0x1+-0x22f7*0x1)),_0x5726be[_0x4ea9fd(0x24b)](_0x2dd2b4[_0x4b43f5++],0xc37*-0x1+0x149b+-0x85c)),_0x1815ae[_0x4b43f5++]));}return{'sigBytes':_0x5726be[_0x4ea9fd(0x241)](_0x593714[_0x4ea9fd(0x223)],-0xa6*-0x12+-0x2*-0x642+-0x182c),'words':_0x593714};}else _0x3681ba[_0x4ea9fd(0x26a)](_0x5726be[_0x4ea9fd(0x1d7)](_0x5726be[_0x4ea9fd(0x27c)](_0x5726be[_0x4ea9fd(0x1ed)](_0x5726be[_0x4ea9fd(0x24b)](_0x7cd1ef[_0x1f325c++],0x161*-0x2+0xca4+-0x9ca*0x1),_0x5726be[_0x4ea9fd(0x253)](_0x7cd1ef[_0x1f325c++],0x1*-0x7b2+-0x18d6*0x1+0x7*0x4a8)),_0x5726be[_0x4ea9fd(0x1c9)](_0x7cd1ef[_0x1f325c++],0x6d*0x26+0x22a6+0xcb3*-0x4)),_0x7cd1ef[_0x1f325c++]));}return{'sigBytes':_0x5726be[_0x4ea9fd(0x241)](_0x3681ba[_0x4ea9fd(0x223)],0x26d8+0x62a*0x3+-0x2e*0x13f),'words':_0x3681ba};}} export default MangaDig; diff --git a/src/web/mjs/connectors/MangaEffect.mjs b/src/web/mjs/connectors/MangaEffect.mjs index 49b449cf73..2090f6eb2d 100644 --- a/src/web/mjs/connectors/MangaEffect.mjs +++ b/src/web/mjs/connectors/MangaEffect.mjs @@ -12,21 +12,4 @@ export default class MangaEffect extends WordPressMadara { _createMangaRequest(page) { return new Request(new URL(`/manga/page/${page}/`, this.url), this.requestOptions); } - - async _getPages(chapter) { - const url = new URL(chapter.id, this.url); - const request = new Request(url, this.requestOptions); - const script = ` - new Promise((resolve, reject) => { - setTimeout(() => { - var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { - format: CryptoJSAesJson - }).toString(CryptoJS.enc.Utf8)); - resolve(JSON.parse(imgdata)); - },3000); - }); - `; - const data = await Engine.Request.fetchUI(request, script); - return data.map(picture => this.createConnectorURI({url : picture, referer : url})); - } } diff --git a/src/web/mjs/connectors/MangaHub.mjs b/src/web/mjs/connectors/MangaHub.mjs index 7067870aae..7931e78671 100644 --- a/src/web/mjs/connectors/MangaHub.mjs +++ b/src/web/mjs/connectors/MangaHub.mjs @@ -11,8 +11,8 @@ export default class MangaHub extends Connector { super.label = 'MangaHub'; this.tags = [ 'manga', 'english' ]; this.url = 'https://mangahub.io'; - this.apiURL = 'https://api.mghubcdn.com/graphql'; - this.cdnURL = 'https://img.mghubcdn.com/file/imghub/'; + this.apiURL = 'https://api2.mangahub.io/graphql'; + this.cdnURL = 'https://imgx.mghcdn.com'; this.path = 'm01'; this.requestOptions.headers.set('x-origin', this.url); diff --git a/src/web/mjs/connectors/MangaNel.mjs b/src/web/mjs/connectors/MangaNel.mjs index a79af47956..8677e83e0d 100644 --- a/src/web/mjs/connectors/MangaNel.mjs +++ b/src/web/mjs/connectors/MangaNel.mjs @@ -33,7 +33,7 @@ export default class MangaNel extends Connector { canHandleURI(uri) { // Test: https://regex101.com/r/aPR3zy/3/tests - return /^(chap|read)?manganato\.com$/.test(uri.hostname); + return /^(chap|read)?manganato\.(com|to)$/.test(uri.hostname); } async _getMangaFromURI(uri) { diff --git a/src/web/mjs/connectors/MangaPill.mjs b/src/web/mjs/connectors/MangaPill.mjs index 263a0d20d9..b66898994f 100644 --- a/src/web/mjs/connectors/MangaPill.mjs +++ b/src/web/mjs/connectors/MangaPill.mjs @@ -9,6 +9,7 @@ export default class MangaPill extends Connector { super.label = 'Mangapill'; this.tags = [ 'manga', 'english' ]; this.url = 'https://mangapill.com'; + this.requestOptions.headers.set('x-referer', this.url); } async _getMangaFromURI(uri) { @@ -54,6 +55,6 @@ export default class MangaPill extends Connector { async _getPages(chapter) { let request = new Request(new URL(chapter.id, this.url), this.requestOptions); let data = await this.fetchDOM(request, 'source'); - return data.map(element => this.getAbsolutePath(element.dataset.src, request.url)); + return data.map(element => this.createConnectorURI(this.getAbsolutePath(element.dataset.src, request.url))); } } diff --git a/src/web/mjs/connectors/MangaRaw.mjs b/src/web/mjs/connectors/MangaRaw.mjs index 46f44f7c86..6603c9facb 100644 --- a/src/web/mjs/connectors/MangaRaw.mjs +++ b/src/web/mjs/connectors/MangaRaw.mjs @@ -8,7 +8,7 @@ export default class MangaRaw extends Connector { super.id = 'mangaraw'; super.label = 'MangaGeko'; this.tags = ['multi-lingual', 'manga', 'webtoon']; - this.url = 'https://www.mangageko.com'; + this.url = 'https://www.mgeko.com'; } async _getMangaFromURI(uri) { diff --git a/src/web/mjs/connectors/MangaSail.mjs b/src/web/mjs/connectors/MangaSail.mjs index bfc66ad6a4..a022e6e596 100644 --- a/src/web/mjs/connectors/MangaSail.mjs +++ b/src/web/mjs/connectors/MangaSail.mjs @@ -7,7 +7,7 @@ export default class MangaSail extends Connector { super.id = 'mangasail'; super.label = 'MangaSail'; this.tags = [ 'manga', 'english' ]; - this.url = 'https://www.mangasail.net'; + this.url = 'https://sailmg.com'; this.config = { username: { diff --git a/src/web/mjs/connectors/MangaSect.mjs b/src/web/mjs/connectors/MangaSect.mjs index f5945dac76..9605bc3459 100644 --- a/src/web/mjs/connectors/MangaSect.mjs +++ b/src/web/mjs/connectors/MangaSect.mjs @@ -1,70 +1,40 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; +import MojoPortalComic from './templates/MojoPortalComic.mjs'; -export default class MangaSect extends Connector { +export default class MangaSect extends MojoPortalComic { constructor() { super(); super.id = 'mangasect'; super.label = 'MangaSect'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://mangasect.com'; + this.url = 'https://mangasect.net'; this.path = '/all-manga/'; } - async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'header h1'); - return new Manga(this, uri.pathname, data[0].textContent.trim()); - } + async _getPages(chapter) { + const request = new Request(new URL(chapter.id, this.url), this.requestOptions); + const script = ` + new Promise(resolve => { - async _getMangas() { - let mangaList = []; - const uri = new URL(this.path, this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.blog-pager span:last-of-type a'); - const pageCount = parseInt(data[0].href.match(/\/(\d)+\//)[1]); - for(let page = 1; page <= pageCount; page++) { - const mangas = await this._getMangasFromPage(page); - mangaList.push(...mangas); - } - return mangaList; - } + function parseResults(data) { + const dom = new DOMParser().parseFromString(data, 'text/html'); + let nodes = [...dom.querySelectorAll('img')]; + resolve(nodes.map(element => element.dataset.original)); + } - async _getMangasFromPage(page) { - const uri = new URL(this.path + page, this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.grid div.text-center > a'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.text.trim() - }; - }); + const ajaxendpoint = new URL('/ajax/image/list/chap/' + CHAPTER_ID, window.location.href); + fetch(ajaxendpoint, { + headers: { + 'X-Requested-With': 'XMLHttpRequest', + } + }) + .then(response => response.json()) + .then(jsonData => { + parseResults(jsonData.html); + }); + }); + `; + return Engine.Request.fetchUI(request, script); } - async _getChapters(manga) { - const uri = new URL(manga.id, this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'li.chapter > a'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.text.trim() - }; - }); - } - - async _getPages(chapter) { - const referer = new URL(chapter.id, this.url); - const chapterid = chapter.id.match(/\/([\d]+)$/)[1]; - const uri = new URL ('/ajax/image/list/chap/' + chapterid, this.url); - const request = new Request(uri, this.requestOptions); - request.headers.set('x-referer', referer); - request.headers.set('X-Requested-With', 'XMLHttpRequest'); - const response = await this.fetchJSON(request); - const dom = this.createDOM(response.html); - const data = dom.querySelectorAll('source[data-src]'); - return Array.from(data).map(image => this.getAbsolutePath(image.dataset['src'], request.url)); - } } diff --git a/src/web/mjs/connectors/MangaSehri.mjs b/src/web/mjs/connectors/MangaSehri.mjs index d72fdef946..7924aedec1 100644 --- a/src/web/mjs/connectors/MangaSehri.mjs +++ b/src/web/mjs/connectors/MangaSehri.mjs @@ -7,13 +7,15 @@ export default class MangaSehri extends WordPressMadara { super.id = 'mangasehri'; super.label = 'Manga Şehri'; this.tags = [ 'manga', 'webtoon', 'turkish' ]; - this.url = 'https://mangasehri.com'; + this.url = 'https://manga-sehri.com'; + this.requestOptions.headers.set('x-referer', this.url); } async _getPages(chapter) { const uri = new URL(chapter.id, this.url); const request = new Request(uri, this.requestOptions); const data = await this.fetchDOM(request, this.queryPages); - return data.map(element => this.getAbsolutePath(element.dataset.src || element, request.url)).filter(image => !/grumpybumpers/.test(image)); + const images = data.map(element =>this.getAbsolutePath(element.dataset.src || element, request.url)).filter(image => !/grumpybumpers/.test(image)); + return images.map(image => this.createConnectorURI({url : image, referer : this.url})); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaStarz.mjs b/src/web/mjs/connectors/MangaStarz.mjs index 22e895a838..7e6dca81c5 100644 --- a/src/web/mjs/connectors/MangaStarz.mjs +++ b/src/web/mjs/connectors/MangaStarz.mjs @@ -7,6 +7,6 @@ export default class MangaStarz extends WordPressMadara { super.id = 'mangastarz'; super.label = 'مانجا ستارز (Mangastarz)'; this.tags = [ 'manga', 'webtoon', 'arabic' ]; - this.url = 'https://mangastarz.org'; + this.url = 'https://manga-starz.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaSusuku.mjs b/src/web/mjs/connectors/MangaSusuku.mjs new file mode 100644 index 0000000000..bcab1eccf1 --- /dev/null +++ b/src/web/mjs/connectors/MangaSusuku.mjs @@ -0,0 +1,13 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class MangaSusuku extends WordPressMangastream { + + constructor() { + super(); + super.id = 'mangasusuku'; + super.label = 'MangaSusuku'; + this.tags = ['manga', 'indonesian']; + this.url = 'https://mangasusuku.xyz '; + this.path = '/komik/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/MangaSwat.mjs b/src/web/mjs/connectors/MangaSwat.mjs index 4fc61961f3..e772229c6a 100644 --- a/src/web/mjs/connectors/MangaSwat.mjs +++ b/src/web/mjs/connectors/MangaSwat.mjs @@ -7,7 +7,7 @@ export default class MangaSwat extends WordPressMangastream { super.id = 'mangaswat'; super.label = 'Goldragon (SWAT Manga)'; this.tags = ['webtoon', 'arabic']; - this.url = 'https://goldragon.me'; + this.url = 'https://swatmanhua.com'; this.path = '/manga/list-mode'; this.queryChapters = 'div.bxcl ul li span.lchx a'; diff --git a/src/web/mjs/connectors/MangaTR.mjs b/src/web/mjs/connectors/MangaTR.mjs index ee9f49a212..baa5929866 100644 --- a/src/web/mjs/connectors/MangaTR.mjs +++ b/src/web/mjs/connectors/MangaTR.mjs @@ -8,7 +8,7 @@ export default class MangaTR extends FlatManga { super.label = 'Manga-TR'; this.tags = [ 'manga', 'turkish' ]; this.url = 'https://manga-tr.com'; - + this.path = '/manga-list.html'; this.queryMangaTitle = 'meta[property="og:title"]'; this.queryMangas = 'div.container a[data-toggle="mangapop"]'; this.requestOptions.headers.set('x-referer', this.url); @@ -62,4 +62,4 @@ export default class MangaTR extends FlatManga { }; }); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaTX.mjs b/src/web/mjs/connectors/MangaTX.mjs index 8857e45e7b..43fb39a6ec 100644 --- a/src/web/mjs/connectors/MangaTX.mjs +++ b/src/web/mjs/connectors/MangaTX.mjs @@ -7,6 +7,6 @@ export default class MangaTX extends WordPressMadara { super.id = 'mangatx'; super.label = 'Mangatx'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://mangatx.com'; + this.url = 'https://mangatx.to'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaWOW.mjs b/src/web/mjs/connectors/MangaWOW.mjs index 1cff3d9cb4..9a084984e9 100644 --- a/src/web/mjs/connectors/MangaWOW.mjs +++ b/src/web/mjs/connectors/MangaWOW.mjs @@ -7,6 +7,6 @@ export default class MangaWOW extends WordPressMadara { super.id = 'mangawow'; super.label = 'MangaWOW'; this.tags = [ 'webtoon', 'turkish' ]; - this.url = 'https://mangawow.net'; + this.url = 'https://mangawow.org'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Mangalek.mjs b/src/web/mjs/connectors/Mangalek.mjs index 319f0a2306..2950438b50 100644 --- a/src/web/mjs/connectors/Mangalek.mjs +++ b/src/web/mjs/connectors/Mangalek.mjs @@ -7,7 +7,7 @@ export default class Mangalek extends WordPressMadara { super.id = 'mangalek'; super.label = 'مانجا ليك (Mangalek)'; this.tags = [ 'manga', 'webtoon', 'arabic' ]; - this.url = 'https://mangaleku.com'; + this.url = 'https://lekmanga.net'; this.queryTitleForURI = 'div.profile-manga div.post-title h1'; this.requestOptions.headers.set('x-referer', this.url); } diff --git a/src/web/mjs/connectors/MangasChan.mjs b/src/web/mjs/connectors/MangasChan.mjs index d31f302390..e179276222 100644 --- a/src/web/mjs/connectors/MangasChan.mjs +++ b/src/web/mjs/connectors/MangasChan.mjs @@ -7,7 +7,7 @@ export default class MangasChan extends WordPressMangastream { super.id = 'mangaschan'; super.label = 'Mangás Chan'; this.tags = [ 'manga', 'webtoon', 'portuguese' ]; - this.url = 'https://mangaschan.com'; + this.url = 'https://mangaschan.net'; this.path = '/manga/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ManhuaPlus.mjs b/src/web/mjs/connectors/ManhuaPlus.mjs index 7458e8e5d0..74ea28d2d8 100644 --- a/src/web/mjs/connectors/ManhuaPlus.mjs +++ b/src/web/mjs/connectors/ManhuaPlus.mjs @@ -1,40 +1,98 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; -export default class ManhuaPlus extends WordPressMadara { +export default class ManhuaPlus extends Connector { constructor() { super(); super.id = 'manhuaplus'; super.label = 'ManhuaPlus'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://manhuaplus.com'; + this.url = 'https://manhuaplus.org'; + this.path = '/all-manga/'; - this.queryPages = 'figure source, div.page-break source, div.chapter-video-frame source, div.reading-content p source'; - this.requestOptions.headers.set('x-referer', this.url); - this.requestOptions.headers.set('x-origin', this.url); - this.requestOptions.headers.set('x-user-agent', 'Mozilla/5.0 (Windows NT 10.0; rv:111.0) Gecko/20100101 Firefox/111.0'); + } + + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'header h1'); + return new Manga(this, uri.pathname, data[0].textContent.trim()); } async _getMangas() { let mangaList = []; - let request = new Request(new URL('', this.url), this.requestOptions); - let data = await this.fetchDOM(request, 'div.wp-pagenavi a.last'); - let pageCount = parseInt(data[0].href.match(/\d+/)[0]); - for(let page = 0; page <= pageCount; page++) { - let mangas = await this._getMangasFromPage(page); + const uri = new URL(this.path, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.blog-pager span:last-of-type a'); + const pageCount = parseInt(data[0].href.match(/\/(\d)+\//)[1]); + for(let page = 1; page <= pageCount; page++) { + const mangas = await this._getMangasFromPage(page); mangaList.push(...mangas); } return mangaList; } async _getMangasFromPage(page) { - let request = new Request(new URL('/page/' + page+'/', this.url), this.requestOptions); - let data = await this.fetchDOM(request, 'div.item-thumb a'); + const uri = new URL(this.path + page, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.grid div.text-center > a'); return data.map(element => { return { - id: this.getRootRelativeOrAbsoluteLink(element, request.url), - title: element.title.trim() + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.text.trim() }; }); } + + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'li.chapter > a'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.text.trim() + }; + }); + } + + async _getPages(chapter) { + const script = ` + new Promise((resolve, reject) => { + + function parseResults(data) { + const dom = new DOMParser().parseFromString(data, 'text/html'); + let nodes = [...dom.querySelectorAll('div.separator')]; + if (nodes.length == 0) reject(); + + //sort if needed + if (nodes[0].hasAttribute('data-index')) { + nodes = nodes.sort(function (a, b) { + const za = parseInt(a.dataset.index); + const zb = parseInt(b.dataset.index); + return za - zb; + }); + } + resolve(nodes.map(element => { + const anchorElement = element.querySelector('a.readImg'); + return anchorElement.href ; + })); + } + + const ajaxendpoint = new URL('/ajax/image/list/chap/'+ CHAPTER_ID, window.location.href); + fetch(ajaxendpoint, { + headers: { + 'X-Requested-With' : 'XMLHttpRequest', + }}) + .then(response => response.json()) + .then(jsonData => { + parseResults(jsonData.html); + }); + }); + `; + + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + return Engine.Request.fetchUI(request, script); + } } diff --git a/src/web/mjs/connectors/ManhwaFreak.mjs b/src/web/mjs/connectors/ManhwaFreak.mjs index a919c3b417..1c49f18d72 100644 --- a/src/web/mjs/connectors/ManhwaFreak.mjs +++ b/src/web/mjs/connectors/ManhwaFreak.mjs @@ -7,7 +7,7 @@ export default class ManhwaFreak extends WordPressMangastream { super.id = 'manhwafreak'; super.label = 'ManhwaFreak'; this.tags = [ 'manga', 'english', 'webtoon']; - this.url = 'https://manhwa-freak.com'; + this.url = 'https://freakcomic.com'; this.path = '/manga/'; this.queryMangas = 'div.lastest-serie > a'; this.queryChapters = 'div.chapter-li > a'; @@ -15,6 +15,7 @@ export default class ManhwaFreak extends WordPressMangastream { } async _getPages(chapter) { - return (await super._getPages(chapter)).filter(page => !page.includes('ajax-loader')); + return (await super._getPages(chapter)) + .filter(page => !page.includes('ajax-loader') && !page.endsWith('/100.5.gif')); } } diff --git a/src/web/mjs/connectors/ManhwaLatino.mjs b/src/web/mjs/connectors/ManhwaLatino.mjs index 9840356cfd..9050403804 100644 --- a/src/web/mjs/connectors/ManhwaLatino.mjs +++ b/src/web/mjs/connectors/ManhwaLatino.mjs @@ -8,5 +8,36 @@ export default class ManhwaLatino extends WordPressMadara { super.label = 'Manhwa-Latino'; this.tags = [ 'webtoon', 'hentai', 'spanish' ]; this.url = 'https://manhwa-latino.com'; + this.requestOptions.headers.set('x-referer', this.url); + + } + + _createMangaRequest(page) { + return new Request(new URL(`/manga/page/${page}/`, this.url), this.requestOptions); + } + + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'li.wp-manga-chapter div.mini-letters > a'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.text.trim() + }; + }); + } + + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.page-break source.img-responsive'); + return data.map(image => { + const payload = { + url : image.getAttribute('data-src'), + referer : request.url + }; + return this.createConnectorURI(payload); + }); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Miauscan.mjs b/src/web/mjs/connectors/Miauscan.mjs index 06b88d291a..ff3d1ba892 100644 --- a/src/web/mjs/connectors/Miauscan.mjs +++ b/src/web/mjs/connectors/Miauscan.mjs @@ -7,7 +7,59 @@ export default class MiauScan extends WordPressMangastream { super.id = 'miauscan'; super.label = 'MiauScan'; this.tags = [ 'manga', 'spanish', 'portuguese', 'scanlation' ]; - this.url = 'https://miauscans.com'; + this.url = 'https://miaucomics.org'; this.path = '/manga/list-mode/'; + + this.novelContainer = 'div.entry-content'; + this.novelContent = 'div#readerarea.rdminimal'; + this.novelFormat = 'image/png'; + this.novelWidth = '56em';// parseInt(1200 / window.devicePixelRatio) + 'px'; + this.novelPadding = '1.5em'; + } + + async _getPages(chapter) { + let request = new Request(new URL(chapter.id, this.url), this.requestOptions); + const data = await this.fetchDOM(request, 'div#readerarea.rdminimal'); + //reader for novel have this class. When its a manga there is no class at all so we call super. + if (data.length == 0) { + return await super._getPages(chapter).filter(image => !/dis2\.jpg/.test(image)); + } + const darkmode = Engine.Settings.NovelColorProfile(); + const script = ` + new Promise((resolve, reject) => { + document.body.style.width = '${this.novelWidth}'; + document.body.style.backgroundColor = '${darkmode.background}'; + let container = document.querySelector('${this.novelContainer}'); + container.style.maxWidth = '${this.novelWidth}'; + container.style.padding = '0'; + container.style.margin = '0'; + container.style.backgroundColor = '${darkmode.background}'; + + let novel = document.querySelector('${this.novelContent}'); + novel.style.padding = '${this.novelPadding}'; + [...novel.querySelectorAll(":not(:empty)")].forEach(ele => { + ele.style.backgroundColor = '${darkmode.background}' + ele.style.color = '${darkmode.text}' + }) + + novel.style.backgroundColor = '${darkmode.background}' + novel.style.color = '${darkmode.text}'; + + let script = document.createElement('script'); + script.onerror = error => reject(error); + script.onload = async function() { + try { + let canvas = await html2canvas(novel); + resolve(canvas.toDataURL('${this.novelFormat}')); + } + catch (error){ + reject(error) + } + } + script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'; + document.body.appendChild(script); + }); + `; + return [await Engine.Request.fetchUI(request, script, 30000, true)]; } } diff --git a/src/web/mjs/connectors/MonzeeKomik.mjs b/src/web/mjs/connectors/MonzeeKomik.mjs new file mode 100644 index 0000000000..3ad2366838 --- /dev/null +++ b/src/web/mjs/connectors/MonzeeKomik.mjs @@ -0,0 +1,19 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class MonzeeKomik extends WordPressMangastream { + + constructor() { + super(); + super.id = 'monzeekomik'; + super.label = 'MonzeeKomik'; + this.tags = ['manga', 'manhwa', 'indonesian']; + this.url = 'https://monzeekomik.my.id'; + this.path = '/manga/list-mode/'; + } + + async _getMangas() { + const mangas = await super._getMangas(); + mangas.forEach(manga => manga.title = manga.title.replace(/Bahasa Indonesia$/i, '').trim()); + return mangas; + } +} diff --git a/src/web/mjs/connectors/MoonWitchInLove.mjs b/src/web/mjs/connectors/MoonWitchInLove.mjs index 4e6af0bded..661d9ed26a 100644 --- a/src/web/mjs/connectors/MoonWitchInLove.mjs +++ b/src/web/mjs/connectors/MoonWitchInLove.mjs @@ -7,6 +7,6 @@ export default class MoonWitchInLove extends WordPressMadara { super.id = 'moonwitchinlove'; super.label = 'Moon Witch In Love'; this.tags = [ 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://moonwitchinlove.com'; + this.url = 'https://moonwitchinlovescan.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/NeoxScan.mjs b/src/web/mjs/connectors/NeoxScan.mjs index 080a5ecaf0..99c14790e4 100644 --- a/src/web/mjs/connectors/NeoxScan.mjs +++ b/src/web/mjs/connectors/NeoxScan.mjs @@ -7,11 +7,8 @@ export default class NeoxScan extends WordPressMadara { super.id = 'neoxscan'; super.label = 'Neox Scanlator'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://neoxscan.net'; + this.url = 'https://nexoscans.net'; this.queryTitleForURI = '.post-title'; this.requestOptions.headers.set('x-referer', this.url); } - canHandleURI(uri) { - return /https?:\/\/neoxscan\.(com|net)/.test(uri.origin); - } } diff --git a/src/web/mjs/connectors/NicoNicoSeiga.mjs b/src/web/mjs/connectors/NicoNicoSeiga.mjs index f7e97e33aa..68159e58f5 100644 --- a/src/web/mjs/connectors/NicoNicoSeiga.mjs +++ b/src/web/mjs/connectors/NicoNicoSeiga.mjs @@ -14,8 +14,7 @@ export default class NicoNicoSeiga extends Connector { }; this.mangaListPage = "/manga/list"; - this.mangaListEndPoint = "/ajax/manga/list"; - + this.queryManga = 'div#comic_list ul li.mg_item div.mg_title div.title a'; this.querySeriesCount = 'div#main div#mg_main_column'; this.queryMangaTitle = 'div.main_title h1'; @@ -23,7 +22,6 @@ export default class NicoNicoSeiga extends Connector { this.queryChapters = 'div.mg_episode_list div.inner ul li.episode_item div.episode div.description div.title a'; this.queryPages = 'div.pages ul#page_contents li.page div.note source.lazyload'; - this.pageTemplateURL = 'https://seiga.nicovideo.jp/image/source/'; } async _getMangaFromURI(uri) { @@ -36,11 +34,11 @@ export default class NicoNicoSeiga extends Connector { async _getMangasFromRequest(uri) { let request = new Request(uri, this.requestOptions); - let data = await this.fetchJSON(request); - return data.map(series => { + let data = await this.fetchDOM(request, this.queryManga); + return data.map(anchor => { return { - id: this.getRootRelativeOrAbsoluteLink('/comic/' + series.id, request.url), - title: series.title + id: anchor.pathname, + title: anchor.text }; }); } @@ -50,7 +48,7 @@ export default class NicoNicoSeiga extends Connector { let data = await this.fetchDOM(request, this.querySeriesCount); let totalPages = Math.ceil(data[0].dataset.count/10); let mangaList = []; - let uri = new URL(this.mangaListEndPoint, this.url); + let uri = new URL(this.mangaListPage, this.url); for(let page = 1; page <= totalPages; page++) { uri.searchParams.set('page', page); let mangas = await this._getMangasFromRequest(uri); @@ -84,27 +82,18 @@ export default class NicoNicoSeiga extends Connector { } async _handleConnectorURI(payload) { - try { - // first try to get high quality image (await promise, otherwise try/catch won't work) - let data = await super._handleConnectorURI(this.pageTemplateURL + payload.id); - if(data.mimeType.startsWith('image/')) { - return data; - } - throw new Error('Failed to get high quality image => downloading low quality image!'); - } catch(error) { - // get low quality DRM image as fallback - let uri = new URL(payload.original); - let request = new Request(uri, this.requestOptions); - let response = await fetch(request); - let encrypted = new Uint8Array(await response.arrayBuffer()); - let key = this._getKeyFromUrl(payload.original); - let buffer = { - mimeType: 'application/octet-stream', - data: this._decrypt(encrypted, key) - }; - this._applyRealMime(buffer); - return buffer; - } + let uri = new URL(payload.original); + let request = new Request(uri, this.requestOptions); + let response = await fetch(request); + let encrypted = new Uint8Array(await response.arrayBuffer()); + let key = this._getKeyFromUrl(payload.original); + let buffer = { + mimeType: 'application/octet-stream', + data: this._decrypt(encrypted, key) + }; + this._applyRealMime(buffer); + return buffer; + //} } /********************************* @@ -128,4 +117,4 @@ export default class NicoNicoSeiga extends Connector { e[n] = e[n] ^ r[n % i]; return e; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/NinjaScan.mjs b/src/web/mjs/connectors/NinjaScan.mjs index 703a702e3c..7049eca3c8 100644 --- a/src/web/mjs/connectors/NinjaScan.mjs +++ b/src/web/mjs/connectors/NinjaScan.mjs @@ -7,6 +7,6 @@ export default class NinjaScan extends WordPressMadara { super.id = 'ninjascan'; super.label = 'Ninja Scan'; this.tags = [ 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://ninjascan.xyz'; + this.url = 'https://ninjascan.site'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/NiveraFansub.mjs b/src/web/mjs/connectors/NiveraFansub.mjs index ae34a29444..ee42c9c194 100644 --- a/src/web/mjs/connectors/NiveraFansub.mjs +++ b/src/web/mjs/connectors/NiveraFansub.mjs @@ -7,7 +7,7 @@ export default class NiveraFansub extends WordPressMadara { super.id = 'niverafansub'; super.label = 'Nivera Fansub'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://niverafansub.com'; + this.url = 'https://niverafansub.co'; this.requestOptions.headers.set('x-referer', this.url); } } \ No newline at end of file diff --git a/src/web/mjs/connectors/Nonbiri.mjs b/src/web/mjs/connectors/Nonbiri.mjs index 498c0c265c..420ec7cff8 100644 --- a/src/web/mjs/connectors/Nonbiri.mjs +++ b/src/web/mjs/connectors/Nonbiri.mjs @@ -5,9 +5,9 @@ export default class Nonbiri extends WordPressMangastream { constructor() { super(); super.id = 'nonbiri'; - super.label = 'Nonbiri'; + super.label = 'Comic21'; this.tags = ['manga', 'indonesian']; - this.url = 'https://nonbiri.space'; + this.url = 'https://comic21.me'; this.path = '/manga/list-mode/'; } } diff --git a/src/web/mjs/connectors/Nyrax.mjs b/src/web/mjs/connectors/Nyrax.mjs new file mode 100644 index 0000000000..958dc19b3e --- /dev/null +++ b/src/web/mjs/connectors/Nyrax.mjs @@ -0,0 +1,12 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Nyrax extends WordPressMangastream { + constructor() { + super(); + super.id = 'nyrax'; + super.label = 'Nyrax'; + this.tags = ['webtoon', 'english', 'scanlation']; + this.url = 'https://nyraxmanga.com'; + this.path = '/manga/list-mode/'; + } +} \ No newline at end of file diff --git a/src/web/mjs/connectors/OmegaScans.mjs b/src/web/mjs/connectors/OmegaScans.mjs index e9008e1250..7b4ccd99b8 100644 --- a/src/web/mjs/connectors/OmegaScans.mjs +++ b/src/web/mjs/connectors/OmegaScans.mjs @@ -1,8 +1,6 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; - -export default class OmegaScans extends Connector { +import HeanCms from './templates/HeanCms.mjs'; +export default class OmegaScans extends HeanCms { constructor() { super(); super.id = 'omegascans'; @@ -10,74 +8,8 @@ export default class OmegaScans extends Connector { this.tags = [ 'webtoon', 'scanlation', 'english', 'hentai']; this.url = 'https://omegascans.org'; this.api = 'https://api.omegascans.org'; - this.nextInstance = 'Uzf9L765by7rm6wVbv5Sb'; - } - - async _initializeConnector() { - const uri = new URL(this.url); - const request = new Request(uri.href, this.requestOptions); - this.nextInstance = await Engine.Request.fetchUI(request, `__NEXT_DATA__.buildId`); - } - - async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.series-title h1'); - const id = uri.pathname.match(/\/series\/(\S+)/)[1]; - const title = data[0].textContent.trim(); - return new Manga(this, id, title); - } - - //similar to ReaperScansBR - - async _getMangas() { - let mangaList = []; - for (let page = 1, run = true; run; page++) { - let mangas = await this._getMangasFromPage(page); - mangas.length > 0 ? mangaList.push(...mangas) : run = false; - } - return mangaList; - } - async _getMangasFromPage(page) { - let uri = new URL('/series/querysearch', this.api); - let body = { - order : 'asc', - order_by : 'latest', - series_type : 'Comic', - page : page, - tagIds : [], + this.links = { + login: 'https://omegascans.org/login' }; - let request = new Request(uri, { - method: 'POST', - body: JSON.stringify(body), - headers: { - 'Accept': 'text/html, application/xhtml+xml', - 'Content-Type': 'application/json', - 'x-referrer': this.url, - } - }); - let data = await fetch(request); - data = await data.json(); - return data.data.map(element => { - return{ - id: element.series_slug.replace(/-\d+$/, ''), - title : element.title.trim() - }; - }); - } - async _getChapters(manga) { - const uri = new URL(`/_next/data/${this.nextInstance}/pt/series/${manga.id}.json`, this.url); - const data = await this.fetchJSON(new Request(uri, this.requestOptions)); - return data.pageProps.series.chapters.map(element => { - return{ - id: element.id, - title : element.chapter_name.trim() - }; - }); - } - - async _getPages(chapter) { - const uri = new URL(`/series/chapter/${chapter.id}`, this.api); - const data = await this.fetchJSON(new Request(uri, this.requestOptions)); - return data.content.images.map(element => this.createConnectorURI(new URL(element, this.api).href)); } } diff --git a/src/web/mjs/connectors/Opiatoon.mjs b/src/web/mjs/connectors/Opiatoon.mjs index 9948fc6e18..76a4c18f31 100644 --- a/src/web/mjs/connectors/Opiatoon.mjs +++ b/src/web/mjs/connectors/Opiatoon.mjs @@ -7,9 +7,9 @@ export default class Opiatoon extends WordPressMadara { super.id = 'opiatoon'; super.label = 'Opiatoon (Opia&Shipperland)'; this.tags = [ 'manga', 'turkish', 'webtoon' ]; - this.url = 'https://opiatoon.org'; + this.url = 'https://opiatoon.biz'; this.links = { - login: 'https://opiatoon.org/login' + login: 'https://opiatoon.biz/login' }; } } diff --git a/src/web/mjs/connectors/PerfScan.mjs b/src/web/mjs/connectors/PerfScan.mjs new file mode 100644 index 0000000000..ec087269a8 --- /dev/null +++ b/src/web/mjs/connectors/PerfScan.mjs @@ -0,0 +1,15 @@ +import HeanCms from './templates/HeanCms.mjs'; + +export default class PerfScan extends HeanCms { + constructor() { + super(); + super.id = 'perfscan'; + super.label = 'Perf Scan'; + this.tags = [ 'webtoon', 'scanlation', 'french']; + this.url = 'https://perf-scan.fr'; + this.api = 'https://api.perf-scan.fr'; + this.links = { + login: 'https://perf-scan.fr/login' + }; + } +} diff --git a/src/web/mjs/connectors/PojokManga.mjs b/src/web/mjs/connectors/PojokManga.mjs index e43b910a2c..4055a4a690 100644 --- a/src/web/mjs/connectors/PojokManga.mjs +++ b/src/web/mjs/connectors/PojokManga.mjs @@ -7,8 +7,7 @@ export default class PojokManga extends WordPressMadara { super.id = 'pojokmanga'; super.label = 'PojokManga'; this.tags = [ 'manga', 'webtoon', 'indonesian' ]; - this.url = 'https://pojokmanga.com'; - + this.url = 'https://pojokmanga.id'; this.queryTitleForURI = 'div.profile-manga div.post-title h1'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/PrismaScan.mjs b/src/web/mjs/connectors/PrismaScan.mjs index 06b1725034..03eca8e8cd 100644 --- a/src/web/mjs/connectors/PrismaScan.mjs +++ b/src/web/mjs/connectors/PrismaScan.mjs @@ -5,8 +5,8 @@ export default class PrismaScan extends WordPressMadara { constructor() { super(); super.id = 'prismascans'; - super.label = 'Prisma Scan'; + super.label = 'Demon Scan'; this.tags = [ 'webtoon', 'portuguese' ]; - this.url = 'https://prismascans.net'; + this.url = 'https://demonsect.com.br'; } } diff --git a/src/web/mjs/connectors/RandomScan.mjs b/src/web/mjs/connectors/RandomScan.mjs index 5d3f8a0939..a995a09406 100644 --- a/src/web/mjs/connectors/RandomScan.mjs +++ b/src/web/mjs/connectors/RandomScan.mjs @@ -4,8 +4,8 @@ export default class RandomScan extends WordPressMadara { constructor() { super(); super.id = 'randomscan'; - super.label = 'Random Scans'; + super.label = 'Lura Toon'; this.tags = [ 'manga', 'webtoon', 'portuguese' ]; - this.url = 'https://randomscanlators.net'; + this.url = 'https://luratoon.com'; } } diff --git a/src/web/mjs/connectors/ReaperScans.mjs b/src/web/mjs/connectors/ReaperScans.mjs index 7141640276..1e5a56e795 100644 --- a/src/web/mjs/connectors/ReaperScans.mjs +++ b/src/web/mjs/connectors/ReaperScans.mjs @@ -11,11 +11,12 @@ export default class ReaperScans extends Connector { this.links = { login: 'https://reaperscans.com/login' }; + this.requestOptions.headers.set('x-referer', this.url); this.path = '/comics'; this.queryMangas = 'a.my-2.text-sm.font-medium.text-white.hover\\3A text-blue-700'; this.queryChapters = 'div[wire\\3A id] ul[role] li a'; - this.queryPages = 'source.max-w-full.mx-auto.display-block'; - this.queryMangaTitle = 'div.overflow-hidden h1'; + this.queryPages = 'main source.max-w-full'; + this.queryMangaTitle = 'h1.text-xl'; this.config = { throttle: { label: 'Chapter list Throttle [ms]', @@ -27,18 +28,22 @@ export default class ReaperScans extends Connector { } }; } + async _getMangas() { - let mangaList = []; + const mangaList = []; for (let page = 1, run = true; run; page++) { + await this.wait(this.config.throttle.value); let mangas = await this._getMangasFromPage(page); mangas.length > 0 ? mangaList.push(...mangas) : run = false; } return mangaList; } + async _getMangasFromPage(page) { - let uri = new URL(this.path + '?page='+page, this.url); - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, this.queryMangas); + const uri = new URL(this.path + '?page='+page, this.url); + const request = new Request(uri, this.requestOptions); + await this.wait(this.config.throttle.value); + const data = await this.fetchDOM(request, this.queryMangas); return data.map(element => { return{ id: this.getRootRelativeOrAbsoluteLink(element, request.url), @@ -46,61 +51,48 @@ export default class ReaperScans extends Connector { }; }); } + async _getChapters(manga) { - const messageurl="https://reaperscans.com/livewire/message/"; - let chapterList = []; - let requestdata = undefined; - let chapters = []; - //fetch first page for csrf-token, wireid and other informations - let url = new URL(manga.id, this.url); - let request = new Request(url, this.requestOptions); - let response = await fetch(request); - let responseText = await response.text(); - //and chapters from first page - let parser = new DOMParser(); - let doc = parser.parseFromString(responseText, 'text/html'); - chapters = this.getChaptersFromDoc(doc); - chapterList.push(...chapters); - //build payload from first page data - requestdata = this.createPayloadForChapterPages(doc); - for (let page = 2, run = true; run; page++) { - chapters = []; - url = new URL(requestdata.payload.fingerprint.name, messageurl); - request = new Request(url, { - method: 'POST', - mode: 'cors', - referrer: requestdata.referrer, - referrerPolicy: 'strict-origin-when-cross-origin', - body: JSON.stringify(requestdata.payload), - credentials: 'include', - headers: { - 'Accept': 'text/html, application/xhtml+xml', - "Content-Type": "application/json", - "X-CSFRF-TOKEN": requestdata.token, - "X-Livewire": "true", - 'x-referrer': requestdata.referrer, - } - }); - response = await fetch(request); - let data = await response.json(); - //data contains the html nodes with the chapters - //and the informations needed to request the next page - doc = parser.parseFromString(data.effects.html, 'text/html'); - chapters = this.getChaptersFromDoc(doc); - chapters.length > 0 ? chapterList.push(...chapters) : run = false; - //update payload data using response data, for next fetch - requestdata.payload.serverMemo.checksum = data.serverMemo.checksum; - requestdata.payload.serverMemo.htmlHash = data.serverMemo.htmlHash; - requestdata.referrer = new URL(manga.id+"?page="+page, this.url).href; - requestdata.payload.serverMemo.data.page = page; - requestdata.payload.serverMemo.data.paginators.page = page; - requestdata.payload.updates[0].payload.params[0] = page+1; + const uri = new URL(manga.id, this.url); + const [ data ] = await this.fetchDOM(new Request(uri, this.requestOptions), 'main div[wire\\:id][wire\\:initial-data]'); + const chapterList = this.getChaptersFromDoc(data); + const body = JSON.parse(data.getAttribute('wire:initial-data')); + delete body.effects; + for(let page = 2, run = true; run; page++) { await this.wait(this.config.throttle.value); + const chapters = await this.getChaptersFromPage(manga, page, body); + chapters.length > 0 ? chapterList.push(...chapters) : run = false; } return chapterList; } + + async getChaptersFromPage(manga, page, body) { + const uri = new URL(manga.id, this.url); + uri.pathname = '/livewire/message/' + body.fingerprint.name; + + body.updates = [{ + type: 'callMethod', + payload: { + id: '00000', + method: 'gotoPage', + params: [ page, 'page' ] + } + }]; + + const request = new Request(uri, { + method: 'POST', + body: JSON.stringify(body), + headers: { + 'Content-Type': 'application/json' + } + }); + const message = await this.fetchJSON(request); + const dom = new DOMParser().parseFromString(message.effects.html, 'text/html'); + return this.getChaptersFromDoc(dom); + } + getChaptersFromDoc(doc) { - let chapterList = []; + const chapterList = []; const data = doc.querySelectorAll(this.queryChapters); data.forEach(element => { let chapter = { @@ -111,28 +103,7 @@ export default class ReaperScans extends Connector { }); return chapterList; } - createPayloadForChapterPages(doc) { - const token = doc.querySelector('meta[name="csrf-token"]').getAttribute("content"); - const payloadid = (Math.random() + 1).toString(36).substring(8); - let wiredata = JSON.parse(doc.querySelector('.max-w-6xl div[wire\\:initial-data]').getAttribute("wire:initial-data")); - const referrer = wiredata.effects.path;//of course the current url could be used too and i - delete wiredata.effects; - wiredata.serverMemo.data.page = 1; - wiredata.serverMemo.data.paginators.page = 1; - wiredata['updates']=[{ - type: "callMethod", - payload: { - id: payloadid, - method: "gotoPage", - params: [ - 2, - "page" - ] - } - }]; - return { - payload : wiredata, token :token, referrer : referrer}; - } + async _getPages(chapter) { const uri = new URL(chapter.id, this.url); const request = new Request(uri, this.requestOptions); @@ -141,10 +112,11 @@ export default class ReaperScans extends Connector { return this.getAbsolutePath(element.getAttribute('src'), this.url); }); } + async _getMangaFromURI(uri) { const request = new Request(uri, this.requestOptions); const id = uri.pathname; - const title = (await this.fetchDOM(request, this.queryMangatitle))[0].textContent.trim(); + const title = (await this.fetchDOM(request, this.queryMangaTitle))[0].textContent.trim(); return new Manga(this, id, title); } } diff --git a/src/web/mjs/connectors/ReaperScansTR.mjs b/src/web/mjs/connectors/ReaperScansTR.mjs index d3fb3dd841..de9ca4413a 100644 --- a/src/web/mjs/connectors/ReaperScansTR.mjs +++ b/src/web/mjs/connectors/ReaperScansTR.mjs @@ -1,17 +1,16 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import WordPressMangastream from './templates/WordPressMangastream.mjs'; -export default class ReaperScansTR extends WordPressMadara { +export default class ReaperScansTR extends WordPressMangastream { constructor() { super(); super.id = 'reaperscanstr'; super.label = 'Reaper Scans (Turkish)'; this.tags = ['webtoon', 'turkish']; - this.url = 'https://reaperscanstr.com'; - this.queryChapters = 'div.chapter-link > a'; - this.queryChaptersTitleBloat ='span.chapter-release-date'; + this.url = 'https://reaperscans.com.tr'; + this.path = '/manga/list-mode/'; this.links = { - login: 'https://reaperscanstr.com/login' + login: 'https://reaperscans.com.tr/login' }; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ResetScans.mjs b/src/web/mjs/connectors/ResetScans.mjs index 076776a797..d1b5630d30 100644 --- a/src/web/mjs/connectors/ResetScans.mjs +++ b/src/web/mjs/connectors/ResetScans.mjs @@ -7,7 +7,7 @@ export default class ResetScans extends WordPressMadara { super.id = 'resetscans'; super.label = 'Reset Scans'; this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://reset-scans.com'; + this.url = 'https://reset-scans.xyz'; this.queryChapters = 'li.wp-manga-chapter div.li__text > a'; } } diff --git a/src/web/mjs/connectors/Saikaiscan.mjs b/src/web/mjs/connectors/Saikaiscan.mjs index 0b3f21b4a2..8cec74c246 100644 --- a/src/web/mjs/connectors/Saikaiscan.mjs +++ b/src/web/mjs/connectors/Saikaiscan.mjs @@ -8,15 +8,15 @@ export default class SaikaiScan extends Connector { super.id = 'saikaiscan'; super.label = 'Saikaiscan'; this.tags = [ 'manga', 'portuguese', 'webtoon', 'novel' ]; - this.url = 'https://saikaiscan.com.br'; - this.api = 'https://api.saikai.com.br/api/stories'; - this.imagesurl = 'https://s3-alpha.saikai.com.br'; + this.url = 'https://saikaiscans.net'; + this.api = 'https://api.saikaiscans.net/api/stories'; + this.imagesurl = 'https://s3-alpha.saikaiscans.net'; this.novelContentQuery = 'div#leitor-serie-body'; this.novelFormat = 'image/png'; this.novelWidth = '56em'; this.novelPadding = '1.5em'; this.links = { - login: 'https://saikaiscan.com.br/login' + login: 'https://saikaiscan.net/login' }; } diff --git a/src/web/mjs/connectors/SeriManga.mjs b/src/web/mjs/connectors/SeriManga.mjs index 1b79f4629f..6a23e36577 100644 --- a/src/web/mjs/connectors/SeriManga.mjs +++ b/src/web/mjs/connectors/SeriManga.mjs @@ -8,9 +8,9 @@ export default class SeriManga extends Connector { super.id = 'serimanga'; super.label = 'Seri Manga'; this.tags = [ 'manga', 'webtoon', 'turkish' ]; - this.url = 'https://serimanga.com'; + this.url = 'https://serimangas.com'; this.links = { - login: 'https://serimanga.com/#login' + login: 'https://serimangas.com/#login' }; } @@ -80,4 +80,4 @@ export default class SeriManga extends Connector { let data = await this.fetchDOM(request, 'div.reader-manga.chapter-pages source.chapter-pages__item'); return data.map(element => this.getAbsolutePath(element.dataset.src || element, request.url)); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Siyahmelek.mjs b/src/web/mjs/connectors/Siyahmelek.mjs index 38b1a879e1..2752318fc8 100644 --- a/src/web/mjs/connectors/Siyahmelek.mjs +++ b/src/web/mjs/connectors/Siyahmelek.mjs @@ -7,9 +7,9 @@ export default class Siyahmelek extends WordPressMadara { super.id = 'siyahmelek'; super.label = 'Gri Melek (Siyahmelek)'; this.tags = [ 'manga', 'webtoon', 'turkish' ]; - this.url = 'https://grimelek.net'; + this.url = 'https://grimelek.co'; this.links = { - login : 'https://grimelek.net'//this website needs login to see content ! + login : 'https://grimelek.co'//this website needs login to see content ! }; } diff --git a/src/web/mjs/connectors/Summertoon.mjs b/src/web/mjs/connectors/Summertoon.mjs new file mode 100644 index 0000000000..93747cf4ae --- /dev/null +++ b/src/web/mjs/connectors/Summertoon.mjs @@ -0,0 +1,12 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Summertoon extends WordPressMangastream { + constructor() { + super(); + super.id = 'summertoon'; + super.label = 'Summertoon'; + this.tags = ['webtoon', 'turkish', 'scanlation']; + this.url = 'https://summertoon.com'; + this.path = '/manga/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/TCBScans.mjs b/src/web/mjs/connectors/TCBScans.mjs index 2d12669a6e..0059be7e0c 100644 --- a/src/web/mjs/connectors/TCBScans.mjs +++ b/src/web/mjs/connectors/TCBScans.mjs @@ -8,7 +8,7 @@ export default class TCBScans extends Connector { super.id = 'tcbscans'; super.label = 'TCB Scans'; this.tags = [ 'manga', 'english', 'scanlation' ]; - this.url = 'https://onepiecechapters.com'; + this.url = 'https://tcbscans.com'; } async _getMangaFromURI(uri) { @@ -44,8 +44,27 @@ export default class TCBScans extends Connector { async _getPages(chapter) { const uri = new URL(chapter.id, this.url); - const request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'picture > source'); - return data.map(x => x.src); + const chapterRequest = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(chapterRequest, 'picture > source'); + + const promises = []; + for(const image of data) { + const promise = new Promise( (resolve, reject) => { + const pageUrl= this.getAbsolutePath(image, chapterRequest.url); + const request = new Request(pageUrl, { + method : 'HEAD', + }); + try { + fetch(request) + .then(response => response.status == 200 ? resolve(pageUrl) : reject()); + } catch(error) { + reject(); + } + }); + promises.push(promise); + } + + const results = await Promise.allSettled(promises); + return results.filter(promise => /fulfilled/i.test(promise.status)).map(promise => promise.value); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TempleScan.mjs b/src/web/mjs/connectors/TempleScan.mjs new file mode 100644 index 0000000000..74441752dc --- /dev/null +++ b/src/web/mjs/connectors/TempleScan.mjs @@ -0,0 +1,12 @@ +import HeanCms from './templates/HeanCms.mjs'; + +export default class TempleScan extends HeanCms { + constructor() { + super(); + super.id = 'templescan'; + super.label = 'Temple Scan'; + this.tags = [ 'webtoon', 'scanlation', 'english' ]; + this.url = 'https://templescan.net'; + this.api = 'https://api.templescan.net'; + } +} \ No newline at end of file diff --git a/src/web/mjs/connectors/TitanManga.mjs b/src/web/mjs/connectors/TitanManga.mjs index a90c79b267..86eff5afb8 100644 --- a/src/web/mjs/connectors/TitanManga.mjs +++ b/src/web/mjs/connectors/TitanManga.mjs @@ -1,6 +1,6 @@ -import WordPressMangastream from './templates/WordPressMangastream.mjs'; +import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class TitanManga extends WordPressMangastream { +export default class TitanManga extends WordPressMadara { constructor() { super(); @@ -8,6 +8,5 @@ export default class TitanManga extends WordPressMangastream { super.label = 'Titan Manga'; this.tags = [ 'manga', 'turkish', 'webtoon' ]; this.url = 'https://titanmanga.com'; - this.path = '/manga/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TonizuToon.mjs b/src/web/mjs/connectors/TonizuToon.mjs index d7d950d67f..9fcbcdf0d4 100644 --- a/src/web/mjs/connectors/TonizuToon.mjs +++ b/src/web/mjs/connectors/TonizuToon.mjs @@ -7,7 +7,7 @@ export default class TonizuToon extends WordPressMadara { super.id = 'tonizutoon'; super.label = 'Tonizu Toon'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://tonizutoon.com'; + this.url = 'https://tonizu.com'; this.requestOptions.headers.set('x-referer', this.url); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TopToon.mjs b/src/web/mjs/connectors/TopToon.mjs index 8934361579..4051063cf6 100644 --- a/src/web/mjs/connectors/TopToon.mjs +++ b/src/web/mjs/connectors/TopToon.mjs @@ -15,12 +15,12 @@ export default class TopToon extends Connector { } async _getMangaFromURI(uri) { const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.bnr_episode_info p.tit_toon'); + const data = await this.fetchDOM(request, 'div.ep_comic_info span.comic_tit span'); return new Manga(this, uri.pathname, data[0].textContent.trim()); } async _getMangas() { - const req = new Request('https://toptoon.com/hashtag', this.requestOptions); + const req = new Request(new URL('/hashtag', this.url), this.requestOptions); const api = await this.fetchRegex(req, /fileUrl\s*:\s*'([^']+)'/g); const request = new Request(api[0], this.requestOptions); const data = await this.fetchJSON(request); @@ -34,11 +34,11 @@ export default class TopToon extends Connector { async _getChapters(manga) { const request = new Request(new URL(manga.id, this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'div.episode_list ul a.episode-items'); + const data = await this.fetchDOM(request, 'div.eplist ul a.episode-items'); return data.map(element => { - let title = element.querySelector('p.episode_title').textContent.trim(); - const subtitle = element.querySelector('p.episode_stitle'); - title += subtitle ? ' - ' + subtitle.textContent.trim() : ''; + let title = element.querySelector('p.ep_title').textContent.trim(); + const subtitle = element.querySelector('p.ep_stitle'); + title += subtitle && subtitle.textContent.trim() != '' ? ' - ' + subtitle.textContent.trim() : ''; return { id: `/comic/ep_view/${element.dataset.comicId}/${element.dataset.episodeId}`, title: title @@ -51,4 +51,4 @@ export default class TopToon extends Connector { const data = await this.fetchDOM(request, 'div#viewerContentsWrap source.document_img'); return data.map(element => this.getAbsolutePath(element.dataset.src || element, request.url)); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TuMangaOnline.mjs b/src/web/mjs/connectors/TuMangaOnline.mjs index 21b09a13d6..0ec1bab684 100644 --- a/src/web/mjs/connectors/TuMangaOnline.mjs +++ b/src/web/mjs/connectors/TuMangaOnline.mjs @@ -1,5 +1,5 @@ /* eslint-disable */ import Connector from '../engine/Connector.mjs'; import Manga from '../engine/Manga.mjs'; -const _0x55dc=['\x57\x36\x38\x42\x57\x51\x56\x64\x55\x43\x6b\x79','\x41\x64\x64\x64\x4d\x47\x3d\x3d','\x57\x52\x6a\x52\x57\x37\x47\x4c\x6a\x43\x6f\x45\x72\x53\x6b\x78\x78\x32\x4f\x66','\x57\x50\x42\x63\x4b\x38\x6b\x7a\x62\x66\x52\x64\x4c\x65\x6c\x63\x54\x4d\x43\x59\x6e\x76\x33\x64\x4a\x58\x57\x69\x57\x51\x33\x64\x53\x53\x6b\x73\x57\x35\x70\x64\x53\x38\x6b\x6a\x45\x72\x37\x63\x56\x43\x6b\x54\x57\x37\x70\x63\x4f\x31\x70\x64\x4f\x6d\x6b\x6e\x67\x71\x4a\x64\x49\x38\x6f\x4f\x57\x4f\x31\x70\x74\x48\x70\x63\x52\x59\x30\x3d','\x45\x49\x2f\x64\x4e\x58\x65\x50\x42\x73\x46\x64\x49\x73\x52\x64\x47\x6d\x6f\x65\x67\x38\x6f\x79\x57\x37\x74\x63\x4e\x75\x75\x6e\x57\x36\x65\x50\x57\x52\x54\x6c\x57\x34\x64\x64\x51\x64\x4f\x55\x69\x43\x6f\x4b\x7a\x38\x6b\x7a\x69\x43\x6b\x4e\x57\x52\x43\x4b\x57\x34\x2f\x64\x4c\x38\x6f\x53\x57\x36\x54\x73\x57\x51\x4e\x64\x55\x38\x6f\x39\x66\x6d\x6b\x39\x44\x63\x43\x6c\x57\x36\x52\x64\x4e\x61\x6c\x63\x50\x38\x6f\x62\x57\x50\x62\x31\x64\x47\x37\x63\x49\x43\x6f\x68\x57\x37\x68\x63\x50\x38\x6f\x75\x63\x68\x44\x32\x65\x71\x3d\x3d','\x45\x78\x68\x63\x4a\x61\x3d\x3d','\x70\x43\x6f\x4d\x57\x34\x79\x6a\x77\x53\x6b\x4e\x72\x71\x3d\x3d','\x57\x52\x31\x38\x62\x77\x33\x64\x48\x61\x3d\x3d','\x57\x50\x52\x64\x56\x43\x6f\x47\x45\x74\x71\x3d','\x69\x53\x6b\x57\x57\x35\x66\x47\x57\x37\x74\x64\x4f\x4e\x35\x32\x57\x4f\x56\x64\x48\x6d\x6f\x46\x57\x50\x72\x56\x63\x53\x6b\x55\x7a\x38\x6f\x55\x57\x51\x58\x76\x57\x52\x33\x63\x48\x4c\x56\x63\x4e\x64\x31\x6e\x63\x53\x6b\x6f\x57\x36\x6c\x63\x54\x65\x61\x67\x6e\x30\x42\x64\x54\x66\x37\x64\x49\x33\x70\x63\x51\x76\x68\x63\x4f\x6d\x6b\x67\x69\x53\x6b\x6e\x78\x6d\x6f\x45\x6e\x38\x6b\x65\x6e\x31\x6c\x63\x4a\x77\x75\x56\x57\x35\x2f\x64\x4b\x49\x33\x64\x56\x6d\x6b\x6b\x63\x38\x6f\x63\x73\x6d\x6f\x6f\x64\x6d\x6f\x45\x57\x36\x47\x3d','\x76\x53\x6f\x61\x6e\x47\x3d\x3d','\x6f\x77\x35\x4b\x57\x51\x64\x63\x4e\x57\x3d\x3d','\x44\x38\x6b\x2b\x6f\x68\x48\x2b','\x46\x53\x6b\x45\x57\x37\x43\x52\x72\x47\x47\x75\x46\x53\x6b\x4c\x62\x43\x6f\x5a\x6a\x48\x33\x63\x50\x43\x6b\x48\x44\x5a\x56\x64\x56\x43\x6b\x33\x57\x37\x74\x64\x54\x43\x6f\x69\x41\x68\x47\x58\x57\x34\x78\x64\x4c\x58\x2f\x63\x56\x4d\x48\x72\x57\x51\x62\x69\x43\x65\x74\x64\x4f\x43\x6b\x67\x76\x43\x6b\x48\x57\x4f\x70\x63\x47\x43\x6f\x70\x57\x50\x46\x63\x47\x43\x6f\x7a\x57\x34\x58\x69\x57\x50\x33\x64\x51\x43\x6f\x47\x57\x51\x31\x55\x57\x52\x6d\x57\x42\x4c\x33\x63\x53\x53\x6b\x50\x6b\x43\x6b\x78\x57\x50\x48\x42\x78\x43\x6b\x71','\x61\x38\x6f\x49\x57\x35\x75\x7a\x75\x57\x3d\x3d','\x6e\x77\x58\x42\x57\x51\x6c\x63\x4c\x76\x5a\x64\x52\x71\x3d\x3d','\x57\x36\x5a\x64\x48\x4b\x68\x64\x50\x43\x6f\x71\x57\x52\x6d\x6b','\x57\x4f\x2f\x64\x51\x57\x71\x54\x6c\x61\x7a\x2b\x57\x4f\x79\x3d','\x57\x4f\x34\x46\x45\x61\x3d\x3d','\x74\x38\x6f\x70\x57\x37\x42\x64\x47\x71\x4b\x3d','\x57\x50\x75\x56\x7a\x58\x4c\x58','\x67\x30\x74\x63\x4e\x66\x54\x5a','\x57\x34\x69\x39\x57\x52\x37\x64\x51\x47\x3d\x3d','\x57\x50\x4c\x33\x57\x50\x2f\x64\x4b\x4d\x37\x64\x51\x74\x61\x58\x57\x35\x31\x32\x43\x53\x6f\x32\x57\x50\x76\x39\x46\x61\x38\x44\x70\x53\x6b\x72\x71\x6d\x6f\x77\x72\x53\x6b\x4e\x57\x35\x31\x57\x66\x66\x34\x79\x57\x35\x74\x63\x55\x6d\x6b\x59\x57\x4f\x53\x30\x57\x35\x71\x41\x57\x34\x56\x63\x55\x32\x76\x75\x57\x4f\x4a\x63\x54\x32\x4e\x64\x48\x58\x46\x63\x51\x53\x6f\x35\x57\x52\x61\x6c\x66\x4d\x52\x63\x4e\x53\x6f\x78\x74\x5a\x7a\x71\x44\x49\x5a\x63\x54\x71\x6c\x63\x50\x38\x6b\x75\x57\x37\x6c\x64\x54\x38\x6f\x63','\x79\x74\x30\x67\x57\x37\x4a\x64\x52\x62\x4e\x63\x55\x43\x6b\x38\x77\x58\x62\x61\x71\x53\x6b\x35\x72\x43\x6f\x62\x57\x52\x54\x58\x57\x37\x6e\x30\x57\x4f\x71\x39\x43\x78\x2f\x63\x4e\x43\x6f\x66\x6d\x66\x61\x43\x57\x4f\x75\x3d','\x57\x37\x33\x64\x4b\x30\x4a\x63\x47\x43\x6b\x69','\x57\x4f\x64\x63\x4e\x4e\x6e\x36\x62\x61\x3d\x3d','\x78\x4b\x34\x43\x57\x50\x52\x64\x49\x66\x52\x64\x54\x73\x46\x64\x55\x68\x30\x50\x57\x34\x4c\x37\x57\x51\x56\x63\x4c\x77\x38\x68\x43\x53\x6f\x77\x65\x53\x6f\x2f\x77\x53\x6b\x78\x66\x5a\x74\x63\x53\x6d\x6b\x42\x67\x66\x52\x63\x51\x43\x6f\x59\x77\x38\x6f\x35\x77\x66\x6c\x64\x4e\x4e\x65\x6f\x72\x43\x6b\x79\x57\x4f\x75\x65\x6f\x38\x6f\x48\x6b\x78\x78\x64\x49\x53\x6f\x70\x57\x51\x53\x62\x57\x4f\x78\x64\x4a\x6d\x6f\x6a\x57\x36\x37\x64\x51\x6d\x6b\x55\x57\x36\x74\x63\x51\x6d\x6b\x55\x57\x36\x6d\x39\x57\x35\x6a\x30\x57\x50\x6d\x3d','\x6a\x4d\x4a\x63\x4b\x58\x4a\x63\x53\x38\x6f\x31\x57\x37\x33\x63\x47\x59\x57\x6f\x6e\x43\x6f\x51\x57\x35\x53\x4d\x75\x61\x34\x70\x57\x35\x4c\x35\x57\x35\x64\x63\x4e\x53\x6b\x48\x57\x35\x4f\x63\x75\x33\x58\x72\x57\x52\x37\x63\x55\x43\x6f\x75\x66\x62\x54\x41\x57\x36\x78\x63\x4b\x33\x52\x63\x56\x38\x6f\x69\x57\x52\x6a\x55\x57\x51\x79\x4f\x6c\x73\x74\x64\x53\x47\x46\x63\x4a\x6d\x6f\x32\x57\x52\x71\x70\x57\x51\x30\x62\x44\x72\x6c\x64\x53\x6d\x6b\x58\x57\x51\x33\x64\x55\x6d\x6f\x73\x57\x34\x71\x48\x57\x52\x52\x64\x4f\x30\x4b\x3d','\x61\x53\x6f\x6e\x76\x38\x6f\x6f\x44\x43\x6f\x71\x79\x73\x75\x61\x57\x51\x30\x75\x71\x53\x6f\x59\x61\x65\x4e\x63\x56\x75\x43\x66\x68\x6d\x6f\x75\x6f\x48\x5a\x64\x52\x38\x6f\x2b\x57\x37\x48\x4e\x57\x34\x2f\x64\x53\x43\x6f\x67\x57\x37\x42\x64\x4f\x61\x50\x46\x79\x43\x6f\x6e\x74\x6d\x6f\x79\x46\x6d\x6f\x61\x42\x74\x35\x6b\x67\x53\x6f\x67\x57\x36\x4a\x63\x56\x43\x6f\x61\x57\x36\x64\x63\x48\x33\x4e\x63\x55\x57\x38\x72\x66\x38\x6b\x54\x57\x36\x46\x63\x4f\x59\x78\x64\x54\x65\x68\x63\x56\x53\x6f\x70\x68\x43\x6f\x79','\x57\x35\x31\x58\x57\x51\x74\x63\x4f\x5a\x69\x65\x57\x34\x79\x57\x72\x4b\x6d\x3d','\x57\x34\x38\x75\x57\x35\x65\x3d','\x57\x51\x37\x64\x47\x49\x4f\x34\x6e\x47\x3d\x3d','\x42\x6d\x6f\x69\x68\x6d\x6b\x38\x57\x35\x69\x3d','\x57\x52\x52\x64\x56\x43\x6f\x53\x78\x5a\x56\x63\x4a\x6d\x6b\x31','\x46\x5a\x64\x64\x47\x4c\x33\x64\x4f\x6d\x6f\x61','\x57\x4f\x65\x62\x75\x43\x6f\x72\x71\x47\x3d\x3d','\x57\x50\x2f\x64\x4f\x53\x6f\x52','\x57\x35\x65\x79\x57\x34\x53\x3d','\x57\x35\x5a\x64\x55\x38\x6f\x6c\x57\x51\x4f\x50','\x57\x50\x74\x63\x4d\x4c\x76\x64\x46\x71\x3d\x3d','\x57\x34\x6c\x64\x48\x53\x6f\x54\x57\x4f\x30\x65','\x79\x68\x65\x42\x57\x52\x2f\x64\x4b\x30\x78\x63\x52\x38\x6f\x47\x73\x30\x58\x73\x68\x53\x6b\x51','\x66\x72\x57\x54\x57\x36\x65\x32','\x78\x4d\x42\x63\x4b\x43\x6f\x61\x57\x34\x30\x38\x6a\x61\x3d\x3d','\x57\x34\x79\x79\x57\x34\x5a\x63\x4b\x74\x5a\x63\x4f\x67\x62\x4c\x57\x50\x71\x35\x70\x61\x3d\x3d','\x57\x52\x33\x63\x4b\x68\x35\x72\x6d\x53\x6f\x4e\x57\x4f\x47\x6c\x57\x36\x42\x64\x53\x48\x5a\x64\x53\x43\x6f\x68\x57\x36\x6c\x64\x56\x6d\x6b\x34\x57\x34\x44\x68\x57\x52\x47\x3d','\x57\x4f\x61\x49\x77\x53\x6f\x4a\x57\x4f\x38\x50\x57\x34\x76\x70\x57\x37\x6d\x70\x57\x34\x39\x31\x57\x37\x37\x64\x4c\x43\x6b\x63\x57\x37\x46\x63\x4a\x78\x66\x30\x77\x38\x6b\x39\x57\x36\x72\x70\x57\x50\x76\x57\x7a\x43\x6b\x49\x57\x50\x65\x6f\x57\x52\x5a\x63\x4a\x49\x47\x6f\x57\x36\x2f\x64\x4d\x72\x70\x63\x55\x77\x4c\x78\x57\x34\x37\x64\x47\x67\x4b\x79\x67\x30\x4e\x64\x52\x43\x6f\x64\x57\x37\x5a\x64\x4a\x4b\x70\x64\x4c\x74\x33\x63\x55\x48\x34\x6c\x57\x4f\x75\x50\x62\x5a\x6c\x63\x4b\x38\x6b\x61\x57\x37\x37\x63\x47\x59\x61\x3d','\x57\x34\x66\x34\x57\x52\x78\x64\x50\x48\x33\x64\x4d\x74\x52\x63\x50\x6d\x6b\x79\x57\x37\x56\x64\x55\x4b\x61\x6e\x57\x37\x2f\x63\x56\x63\x52\x64\x47\x38\x6b\x55\x45\x48\x33\x64\x52\x53\x6b\x70\x41\x43\x6f\x35\x65\x38\x6b\x56\x57\x37\x56\x64\x51\x78\x6e\x77\x6d\x38\x6b\x44\x6a\x71\x68\x64\x48\x43\x6b\x68\x79\x43\x6f\x6e\x7a\x75\x37\x64\x4f\x53\x6b\x71\x57\x51\x72\x33\x6c\x4c\x74\x64\x4c\x53\x6f\x36\x57\x51\x42\x64\x52\x59\x42\x63\x50\x65\x4f\x53\x57\x52\x64\x63\x49\x43\x6f\x64\x6c\x6d\x6b\x39\x57\x37\x30\x65\x42\x38\x6f\x58\x57\x52\x79\x3d','\x57\x36\x33\x64\x56\x38\x6f\x74\x57\x51\x6d\x6c\x57\x52\x47\x3d','\x57\x34\x48\x4e\x67\x38\x6b\x4e\x57\x4f\x39\x39\x57\x4f\x57\x42\x57\x52\x39\x6b','\x57\x51\x61\x69\x6a\x38\x6f\x78\x57\x36\x6d\x3d','\x57\x37\x74\x64\x4c\x4e\x4c\x6a\x6d\x4a\x6c\x63\x51\x53\x6f\x71\x6d\x61\x44\x55\x57\x36\x78\x64\x56\x53\x6f\x2b\x71\x53\x6f\x49\x6d\x32\x7a\x72\x6e\x62\x70\x63\x56\x53\x6f\x72\x41\x38\x6b\x4c\x57\x4f\x7a\x53\x57\x52\x72\x70\x57\x37\x70\x63\x4a\x57\x42\x64\x53\x38\x6f\x4b\x57\x35\x42\x64\x56\x38\x6f\x71\x43\x38\x6b\x52\x57\x37\x53\x58\x61\x43\x6f\x59\x65\x68\x37\x63\x4d\x53\x6b\x67\x57\x36\x34\x49\x57\x51\x5a\x63\x4f\x4c\x72\x48\x71\x43\x6b\x34\x44\x77\x52\x64\x4a\x4c\x58\x32\x6f\x78\x33\x63\x50\x74\x53\x3d','\x57\x35\x4a\x64\x4c\x67\x48\x50\x67\x64\x46\x63\x52\x53\x6f\x70\x6d\x72\x79\x30\x57\x4f\x68\x63\x56\x53\x6b\x57\x66\x61\x3d\x3d','\x44\x75\x4b\x58\x45\x33\x30\x3d','\x57\x4f\x65\x62\x45\x43\x6b\x4d\x57\x4f\x61\x52\x65\x71\x3d\x3d','\x61\x57\x71\x55\x57\x34\x75\x6a','\x70\x38\x6b\x54\x57\x52\x37\x63\x48\x32\x4a\x63\x51\x38\x6b\x31\x67\x38\x6f\x61\x57\x36\x46\x64\x54\x53\x6b\x70\x57\x52\x52\x63\x50\x43\x6f\x39\x6e\x43\x6f\x47\x57\x35\x34\x6b\x57\x51\x48\x6d\x57\x34\x78\x63\x51\x43\x6f\x66\x6e\x59\x5a\x64\x51\x47\x79\x75\x57\x50\x6c\x64\x4d\x53\x6f\x65\x67\x53\x6f\x59\x57\x34\x54\x39\x61\x6d\x6b\x51\x65\x4d\x31\x74\x57\x37\x31\x70\x57\x50\x42\x64\x52\x43\x6b\x34\x74\x6d\x6b\x39\x6a\x5a\x61\x3d','\x68\x43\x6b\x45\x57\x34\x4b\x2f\x72\x47\x3d\x3d','\x57\x50\x7a\x34\x57\x36\x33\x63\x56\x53\x6b\x56\x57\x36\x33\x64\x56\x53\x6b\x58\x57\x34\x4a\x63\x48\x38\x6b\x49\x57\x52\x38\x51\x7a\x76\x70\x64\x47\x4e\x7a\x4d\x57\x52\x33\x64\x4b\x73\x6a\x59\x41\x67\x2f\x64\x47\x6d\x6f\x2f\x65\x73\x58\x68\x6c\x6d\x6b\x5a\x57\x36\x52\x64\x51\x6d\x6b\x47\x43\x53\x6b\x73\x57\x34\x79\x36\x57\x35\x78\x63\x4e\x6d\x6b\x6e\x6b\x66\x66\x30\x61\x64\x6a\x2f\x45\x58\x42\x64\x4e\x38\x6f\x38\x78\x53\x6b\x6d\x72\x78\x31\x5a\x57\x52\x33\x63\x4f\x53\x6f\x46\x57\x52\x35\x66\x71\x53\x6b\x30\x45\x57\x3d\x3d','\x57\x52\x68\x64\x4f\x6d\x6f\x43\x57\x50\x74\x64\x4e\x71\x3d\x3d','\x57\x52\x66\x64\x57\x4f\x46\x64\x53\x4c\x71\x3d','\x57\x37\x37\x64\x4a\x68\x74\x63\x4a\x6d\x6b\x41','\x57\x50\x66\x48\x57\x51\x4e\x64\x56\x66\x33\x64\x49\x4a\x6c\x63\x53\x47\x3d\x3d','\x57\x50\x35\x66\x70\x78\x38\x2b\x57\x37\x7a\x74\x72\x31\x64\x63\x4e\x43\x6f\x31\x6f\x43\x6b\x36\x45\x38\x6b\x56\x57\x50\x6d\x56\x65\x78\x74\x63\x51\x53\x6f\x64\x57\x51\x56\x64\x50\x53\x6f\x68\x64\x43\x6f\x57\x57\x34\x54\x59\x78\x72\x68\x64\x48\x64\x68\x64\x48\x68\x31\x6c\x57\x35\x44\x77\x6a\x58\x30\x2b','\x57\x4f\x4e\x64\x51\x43\x6f\x52\x57\x50\x42\x63\x54\x32\x6a\x4f\x57\x36\x2f\x63\x53\x43\x6f\x4a\x57\x37\x5a\x64\x4e\x4e\x46\x63\x4b\x6d\x6b\x2f\x57\x36\x44\x6b\x78\x71\x66\x4f\x65\x68\x65\x4d\x57\x34\x4a\x63\x48\x6d\x6f\x37\x57\x35\x64\x64\x4b\x77\x4e\x63\x4d\x38\x6b\x30\x57\x50\x62\x5a\x57\x36\x4a\x63\x4a\x77\x2f\x64\x49\x6d\x6f\x74\x57\x34\x58\x51\x57\x36\x6a\x71\x57\x35\x79\x64\x64\x66\x35\x39\x65\x4a\x70\x63\x56\x4d\x37\x64\x4d\x6d\x6b\x51\x57\x4f\x75\x62\x77\x6d\x6b\x6f\x57\x52\x52\x63\x47\x59\x47\x45\x67\x6d\x6b\x6b\x71\x71\x3d\x3d','\x57\x51\x64\x63\x52\x68\x50\x6b\x67\x57\x3d\x3d','\x57\x37\x58\x76\x57\x36\x74\x63\x52\x67\x37\x63\x4c\x64\x53\x35\x57\x35\x31\x39\x63\x43\x6b\x69\x57\x50\x75\x61\x44\x57\x79\x77\x6e\x38\x6b\x41\x6f\x38\x6b\x4f\x72\x53\x6f\x41\x57\x4f\x61\x3d','\x57\x36\x6c\x64\x47\x68\x4b\x31\x46\x64\x70\x63\x50\x53\x6f\x4b\x69\x72\x69\x59\x57\x51\x5a\x64\x55\x53\x6b\x33\x65\x43\x6b\x34\x44\x4d\x75\x67\x6d\x58\x52\x63\x53\x6d\x6b\x77\x6c\x53\x6f\x58\x57\x4f\x35\x38\x57\x52\x31\x70\x57\x51\x2f\x64\x4b\x57\x42\x64\x54\x38\x6f\x53\x57\x50\x70\x63\x53\x38\x6b\x76\x70\x53\x6f\x55\x57\x36\x65\x33\x75\x43\x6f\x38\x63\x62\x4a\x64\x4c\x43\x6f\x76\x57\x51\x54\x58\x57\x37\x4a\x63\x51\x4c\x6d\x30\x64\x43\x6b\x32\x6e\x49\x6c\x63\x4a\x57\x57\x49\x46\x63\x2f\x63\x51\x68\x43\x3d','\x69\x32\x48\x46\x57\x51\x2f\x63\x48\x31\x52\x64\x56\x61\x3d\x3d','\x62\x38\x6f\x32\x42\x53\x6f\x4c\x57\x4f\x34\x46\x57\x37\x33\x63\x48\x6d\x6b\x77\x79\x58\x72\x70\x74\x4e\x39\x32\x57\x37\x71\x73\x57\x37\x57\x79\x57\x37\x75\x2f\x72\x6d\x6b\x44\x57\x52\x7a\x78\x57\x50\x74\x63\x52\x38\x6b\x58\x79\x49\x74\x63\x4f\x78\x53\x50\x57\x4f\x37\x64\x52\x75\x64\x64\x54\x6d\x6f\x63\x7a\x65\x50\x49\x57\x36\x46\x63\x4e\x53\x6b\x79\x6e\x38\x6b\x48\x6a\x38\x6b\x39\x57\x34\x61\x30\x57\x51\x5a\x64\x49\x4a\x71\x2f\x57\x50\x66\x2b\x57\x34\x6c\x64\x4f\x57\x43\x30\x57\x35\x42\x64\x4b\x74\x6e\x70','\x6e\x4b\x68\x63\x53\x76\x48\x4e','\x57\x4f\x6a\x44\x57\x50\x2f\x64\x4b\x4d\x37\x64\x51\x74\x61\x58\x57\x35\x31\x32\x43\x53\x6f\x32\x57\x50\x76\x39\x46\x61\x38\x44\x70\x53\x6b\x72\x71\x6d\x6f\x77\x72\x53\x6b\x4e\x57\x4f\x38\x31\x72\x71\x54\x44\x57\x4f\x46\x64\x52\x6d\x6b\x38\x57\x34\x35\x4d\x57\x4f\x7a\x76\x57\x50\x4e\x63\x55\x33\x47\x67\x57\x34\x78\x63\x56\x67\x37\x64\x4d\x75\x33\x64\x52\x38\x6b\x49\x57\x52\x65\x79\x63\x5a\x68\x63\x4e\x38\x6b\x45\x68\x5a\x39\x64\x7a\x59\x42\x64\x52\x57\x5a\x64\x54\x38\x6f\x69\x57\x51\x56\x63\x56\x53\x6f\x78','\x57\x4f\x71\x75\x57\x37\x76\x52\x6c\x57\x3d\x3d','\x66\x58\x31\x69\x57\x50\x33\x64\x47\x76\x74\x63\x50\x78\x78\x63\x56\x73\x53\x48\x57\x34\x34\x2f\x57\x36\x6c\x64\x47\x32\x66\x76\x70\x43\x6b\x62\x66\x43\x6f\x32\x76\x6d\x6f\x71\x75\x4a\x70\x64\x55\x38\x6f\x6b\x78\x57\x33\x64\x47\x53\x6b\x4d\x66\x6d\x6b\x52\x63\x30\x4a\x64\x4e\x47\x4f\x61\x73\x38\x6b\x77\x57\x4f\x65\x6d\x70\x6d\x6b\x30\x7a\x78\x56\x63\x49\x43\x6b\x68\x57\x36\x50\x72\x57\x35\x68\x63\x49\x43\x6b\x42\x57\x36\x70\x63\x50\x6d\x6f\x4e\x57\x52\x46\x64\x56\x6d\x6f\x38\x57\x36\x4f\x47\x57\x4f\x44\x49\x57\x50\x71\x3d','\x57\x50\x7a\x34\x57\x36\x33\x63\x56\x53\x6f\x37\x57\x51\x74\x63\x51\x53\x6f\x39\x57\x4f\x33\x64\x4c\x6d\x6b\x34\x57\x52\x65\x66\x69\x58\x4a\x63\x47\x4e\x4f\x38\x57\x37\x2f\x64\x4c\x5a\x34\x5a\x7a\x78\x74\x64\x48\x6d\x6b\x56\x77\x68\x43\x76\x43\x38\x6b\x36\x57\x37\x64\x64\x54\x6d\x6b\x34\x6a\x6d\x6b\x42\x57\x4f\x44\x4f\x57\x35\x74\x63\x48\x53\x6b\x6c\x41\x75\x54\x49\x68\x77\x47\x4e\x45\x58\x70\x63\x4c\x53\x6f\x4d\x74\x38\x6f\x42\x61\x65\x65\x2b\x57\x52\x78\x64\x51\x38\x6b\x69\x57\x36\x7a\x62\x73\x43\x6b\x34\x45\x61\x3d\x3d','\x57\x4f\x37\x64\x52\x43\x6f\x50\x57\x34\x78\x64\x53\x57\x3d\x3d','\x57\x51\x4b\x55\x57\x34\x47\x57\x64\x43\x6f\x65\x7a\x53\x6b\x67\x75\x77\x54\x46','\x57\x51\x57\x51\x6a\x6d\x6f\x6d\x57\x36\x69\x3d','\x75\x53\x6b\x4b\x69\x47\x3d\x3d','\x57\x51\x66\x59\x6f\x73\x48\x4f','\x57\x4f\x69\x39\x77\x53\x6f\x30\x74\x68\x4e\x64\x4d\x57\x3d\x3d','\x57\x51\x42\x63\x55\x72\x4c\x72\x70\x47\x3d\x3d','\x57\x50\x78\x63\x4e\x63\x74\x64\x47\x6d\x6f\x64\x57\x51\x33\x63\x49\x76\x39\x58\x57\x51\x6c\x63\x53\x32\x4e\x63\x4d\x31\x4f\x67\x57\x36\x5a\x63\x51\x5a\x65\x46\x57\x50\x4a\x64\x53\x53\x6f\x6d\x57\x51\x78\x64\x48\x53\x6f\x53\x6b\x77\x2f\x63\x54\x72\x46\x64\x53\x71\x57\x67\x77\x43\x6b\x59\x57\x37\x42\x63\x4a\x38\x6f\x58\x57\x52\x48\x64\x79\x43\x6b\x44\x57\x34\x46\x63\x55\x43\x6b\x72\x66\x66\x71\x52\x57\x51\x7a\x73\x73\x73\x6a\x49\x69\x38\x6f\x32\x57\x34\x71\x79\x57\x51\x71\x7a\x57\x35\x5a\x63\x53\x53\x6f\x7a\x57\x50\x2f\x63\x4f\x67\x69\x3d','\x69\x53\x6b\x46\x57\x36\x30\x37\x63\x31\x58\x45\x46\x53\x6f\x51\x71\x6d\x6b\x58\x41\x4c\x37\x64\x52\x6d\x6b\x33\x6d\x4d\x33\x63\x4f\x43\x6b\x35\x57\x36\x5a\x63\x56\x43\x6b\x7a\x45\x57\x4b\x42\x57\x34\x78\x64\x4c\x58\x2f\x63\x56\x4d\x48\x72\x57\x51\x62\x69\x43\x65\x74\x64\x4f\x43\x6b\x67\x76\x43\x6b\x48\x57\x4f\x70\x63\x47\x43\x6f\x70\x57\x50\x46\x63\x47\x43\x6f\x7a\x57\x34\x58\x69\x57\x50\x33\x64\x51\x43\x6f\x47\x57\x51\x31\x55\x57\x36\x34\x57\x6b\x58\x68\x64\x4f\x43\x6f\x53\x6b\x43\x6f\x6d\x57\x52\x69\x70\x62\x6d\x6f\x61','\x57\x51\x69\x6c\x57\x36\x6e\x4c\x63\x71\x53\x66\x57\x34\x4b\x37\x57\x51\x7a\x57\x57\x34\x65\x7a\x70\x76\x70\x63\x4c\x71\x3d\x3d','\x7a\x66\x69\x6a\x79\x4d\x38\x3d','\x57\x4f\x38\x5a\x6f\x43\x6f\x76\x57\x36\x65\x3d','\x73\x38\x6f\x4c\x57\x36\x5a\x64\x49\x64\x5a\x64\x56\x38\x6f\x35\x78\x53\x6f\x61\x57\x50\x78\x63\x53\x38\x6f\x45\x57\x36\x2f\x64\x4f\x6d\x6b\x55\x79\x43\x6f\x55\x57\x35\x6a\x58\x57\x37\x71\x70\x57\x51\x47\x3d','\x57\x51\x70\x64\x56\x43\x6f\x7a\x57\x37\x37\x64\x4a\x61\x3d\x3d','\x74\x38\x6b\x4b\x6b\x38\x6b\x4a','\x57\x36\x57\x4d\x71\x53\x6f\x55\x63\x4e\x56\x64\x52\x43\x6b\x69\x57\x4f\x4e\x64\x4b\x43\x6f\x4f\x42\x38\x6b\x6b\x57\x35\x4c\x7a\x57\x4f\x78\x64\x49\x43\x6b\x39\x57\x50\x66\x46\x57\x37\x76\x4f\x75\x61\x44\x52\x57\x51\x71\x76\x57\x4f\x75\x32\x57\x37\x2f\x63\x4d\x43\x6f\x76\x57\x50\x56\x63\x51\x43\x6f\x36\x57\x51\x70\x63\x4b\x5a\x4b\x61\x57\x52\x76\x36\x6e\x73\x72\x53\x6c\x72\x72\x43\x57\x50\x64\x64\x51\x4a\x69\x77\x57\x4f\x64\x64\x4c\x38\x6f\x32\x57\x52\x47\x79\x57\x34\x57\x50\x57\x35\x30\x52\x77\x72\x6e\x36\x75\x71\x3d\x3d','\x57\x50\x56\x64\x51\x57\x65\x37\x69\x74\x66\x66\x57\x4f\x74\x64\x54\x4e\x72\x68\x57\x52\x74\x63\x56\x38\x6f\x47','\x45\x66\x4b\x57\x42\x4d\x6c\x64\x4f\x49\x2f\x64\x53\x47\x3d\x3d','\x57\x51\x42\x64\x4a\x74\x65\x63\x69\x71\x3d\x3d','\x61\x6d\x6f\x32\x45\x43\x6f\x70\x6a\x72\x61\x6b\x42\x38\x6b\x42\x57\x51\x6a\x53\x76\x31\x52\x64\x4f\x6d\x6b\x47\x57\x35\x4a\x63\x50\x73\x64\x63\x49\x38\x6b\x68\x66\x31\x4e\x64\x47\x38\x6b\x5a\x63\x30\x71\x45\x57\x51\x43\x54\x78\x31\x4a\x63\x49\x78\x58\x4c\x57\x37\x74\x64\x4b\x43\x6b\x79\x42\x53\x6b\x4d\x45\x6d\x6f\x2b\x42\x4c\x68\x63\x50\x6d\x6f\x41\x43\x62\x4a\x64\x4e\x74\x6c\x63\x47\x38\x6b\x54\x66\x38\x6b\x41\x6e\x78\x4c\x69\x69\x6d\x6f\x63\x44\x6d\x6b\x34\x42\x53\x6f\x4d\x57\x37\x72\x4d','\x79\x53\x6b\x66\x69\x43\x6b\x4d\x57\x34\x71\x3d','\x66\x4c\x38\x4e\x57\x35\x52\x63\x4d\x61\x3d\x3d','\x57\x51\x52\x64\x49\x38\x6f\x71\x57\x37\x4e\x64\x51\x57\x3d\x3d','\x57\x50\x42\x63\x49\x75\x4c\x35\x6a\x71\x3d\x3d','\x6c\x33\x33\x63\x4b\x57\x3d\x3d','\x57\x34\x34\x53\x57\x36\x78\x63\x54\x38\x6f\x31\x57\x37\x64\x64\x50\x43\x6b\x72\x57\x34\x6c\x63\x47\x38\x6f\x39\x57\x36\x30\x59\x6b\x47\x37\x63\x49\x78\x50\x4e\x57\x52\x74\x64\x4a\x73\x61\x2f\x7a\x33\x6c\x64\x48\x43\x6f\x51\x66\x4d\x65\x73\x44\x43\x6b\x57\x57\x36\x5a\x63\x55\x38\x6b\x35\x6d\x38\x6b\x71\x57\x35\x79\x36\x57\x34\x70\x63\x4b\x6d\x6b\x6b\x43\x30\x62\x49\x64\x64\x76\x31\x69\x66\x42\x63\x4d\x6d\x6f\x56\x69\x6d\x6b\x6c\x74\x61\x62\x39\x57\x37\x64\x64\x4f\x38\x6b\x70\x57\x52\x79\x61\x64\x53\x6f\x58\x6e\x47\x3d\x3d','\x57\x34\x31\x51\x68\x43\x6b\x50\x57\x35\x34\x3d','\x42\x53\x6f\x62\x57\x34\x56\x64\x4f\x61\x38\x3d','\x6d\x38\x6b\x63\x57\x36\x57\x36\x78\x58\x6d\x76\x70\x43\x6f\x53\x73\x53\x6b\x50','\x6e\x6d\x6b\x64\x65\x53\x6b\x5a\x57\x51\x4f\x4a\x41\x43\x6b\x30\x41\x43\x6f\x74\x74\x43\x6f\x68\x57\x50\x4c\x4e\x57\x34\x46\x63\x48\x6d\x6f\x6d\x6d\x49\x57\x3d','\x57\x50\x72\x79\x57\x37\x71\x64\x6e\x71\x3d\x3d','\x57\x4f\x47\x45\x57\x36\x4f\x3d','\x57\x34\x75\x49\x64\x53\x6b\x52\x57\x34\x4f\x50\x57\x52\x61\x39\x57\x50\x38\x70\x57\x4f\x57\x36\x57\x52\x64\x63\x47\x43\x6f\x64\x57\x52\x37\x64\x47\x5a\x47\x36\x68\x6d\x6b\x39\x57\x52\x61\x68\x57\x35\x62\x57\x6a\x53\x6f\x51\x57\x35\x62\x45\x57\x50\x70\x64\x48\x78\x72\x74\x57\x36\x56\x63\x4c\x76\x33\x63\x52\x77\x6e\x67\x57\x35\x46\x63\x49\x5a\x4c\x4c\x75\x31\x33\x64\x52\x43\x6f\x43\x57\x50\x4e\x64\x4c\x4b\x2f\x64\x49\x67\x46\x64\x56\x62\x6d\x6c\x57\x4f\x44\x2b\x73\x77\x4e\x64\x47\x43\x6f\x67\x57\x37\x4a\x63\x4e\x5a\x4b\x3d','\x76\x57\x71\x6e\x57\x34\x64\x63\x54\x78\x35\x63\x57\x34\x53\x77\x46\x47\x3d\x3d','\x57\x34\x43\x46\x62\x38\x6f\x4c\x57\x34\x48\x45\x45\x67\x42\x63\x4c\x67\x4e\x64\x56\x43\x6b\x4b\x65\x76\x64\x63\x4c\x6d\x6b\x49\x63\x38\x6b\x69\x57\x50\x56\x63\x56\x76\x38\x5a\x57\x36\x74\x64\x51\x53\x6b\x5a\x57\x52\x43\x77\x57\x35\x52\x63\x56\x4d\x4e\x63\x50\x6d\x6f\x54\x57\x34\x4c\x2f\x57\x35\x50\x44\x79\x6d\x6b\x4a\x57\x36\x5a\x64\x4b\x53\x6f\x50\x62\x4d\x37\x63\x4e\x5a\x74\x63\x4b\x32\x70\x63\x54\x4a\x65\x39\x57\x34\x47\x74\x71\x43\x6b\x74\x73\x67\x42\x63\x49\x53\x6b\x4b\x57\x36\x46\x63\x54\x6d\x6f\x75\x6a\x63\x56\x64\x49\x61\x3d\x3d','\x45\x31\x61\x52\x44\x71\x3d\x3d','\x57\x37\x6c\x64\x55\x68\x4c\x4e\x63\x71\x3d\x3d','\x6f\x67\x4e\x63\x4b\x33\x72\x42','\x57\x51\x37\x63\x53\x6d\x6b\x44\x57\x36\x76\x63\x57\x37\x39\x31\x77\x77\x31\x69\x74\x73\x33\x63\x4d\x57\x56\x63\x4b\x43\x6f\x70\x77\x78\x6c\x63\x47\x67\x4a\x63\x52\x64\x65\x46\x46\x53\x6f\x53\x61\x43\x6b\x44\x73\x73\x78\x63\x4c\x43\x6b\x36\x65\x4d\x61\x56\x73\x6d\x6f\x43\x6e\x6d\x6b\x4a\x77\x38\x6b\x38\x67\x6d\x6f\x48\x69\x43\x6f\x32\x44\x75\x74\x63\x56\x53\x6b\x62\x57\x50\x4a\x64\x4a\x43\x6f\x65\x57\x36\x39\x42\x67\x59\x66\x55\x68\x43\x6f\x53\x6d\x64\x6c\x64\x48\x63\x6d\x5a\x57\x52\x34\x3d','\x57\x4f\x5a\x63\x4e\x77\x47\x46\x62\x6d\x6f\x55\x57\x4f\x4f\x6e\x57\x37\x68\x64\x52\x66\x52\x63\x53\x38\x6f\x63\x57\x37\x52\x64\x53\x53\x6b\x54\x57\x52\x39\x38\x57\x50\x69\x74\x68\x4b\x69\x78\x57\x50\x74\x63\x4c\x38\x6b\x34\x6a\x38\x6f\x72\x57\x35\x7a\x69\x6c\x4d\x5a\x63\x47\x75\x6c\x63\x4c\x78\x52\x64\x52\x62\x30\x58\x57\x35\x5a\x64\x56\x43\x6f\x6d\x57\x36\x47\x36\x57\x34\x7a\x58\x57\x50\x50\x4c\x57\x35\x37\x64\x52\x53\x6b\x74\x61\x4a\x54\x34\x57\x35\x5a\x63\x52\x66\x61\x56\x66\x38\x6f\x4c\x57\x36\x64\x63\x50\x77\x4e\x63\x48\x71\x3d\x3d','\x75\x31\x79\x4e\x44\x75\x42\x64\x54\x59\x74\x64\x53\x48\x65\x3d','\x57\x4f\x6e\x71\x66\x47\x6e\x53','\x69\x4e\x31\x6f\x57\x51\x33\x63\x4a\x30\x52\x64\x53\x71\x3d\x3d','\x57\x37\x72\x33\x6e\x38\x6b\x49\x57\x34\x66\x55\x57\x4f\x71\x47\x57\x52\x31\x64\x57\x4f\x79\x37\x57\x52\x53\x3d','\x57\x4f\x6d\x6e\x45\x38\x6f\x52\x57\x50\x57\x42\x69\x64\x6c\x63\x4d\x74\x56\x63\x54\x6d\x6f\x4a\x77\x71\x74\x63\x4c\x6d\x6f\x4a\x64\x6d\x6b\x62\x57\x36\x64\x64\x56\x48\x44\x59\x57\x52\x74\x63\x56\x53\x6f\x32\x57\x36\x76\x2f\x57\x36\x5a\x63\x48\x4a\x4a\x64\x49\x38\x6b\x55\x57\x50\x31\x33\x57\x50\x38\x70\x6d\x53\x6f\x53\x57\x52\x37\x64\x4d\x38\x6f\x59\x6c\x67\x37\x63\x4e\x5a\x74\x63\x4b\x32\x70\x63\x54\x4a\x65\x39\x57\x34\x47\x74\x71\x43\x6b\x74\x73\x67\x42\x63\x49\x53\x6b\x4b\x57\x36\x46\x64\x56\x43\x6b\x73\x6c\x64\x52\x63\x51\x57\x3d\x3d','\x57\x51\x33\x63\x55\x59\x50\x74\x64\x61\x3d\x3d','\x69\x4e\x39\x6d','\x57\x52\x54\x47\x6a\x67\x37\x64\x49\x47\x3d\x3d','\x77\x47\x72\x47\x57\x4f\x68\x64\x55\x5a\x79\x78\x57\x4f\x4f\x77\x43\x30\x57\x65\x73\x74\x56\x64\x4b\x6d\x6b\x57\x57\x34\x72\x6a\x61\x6d\x6f\x4f\x6b\x38\x6b\x55\x57\x50\x46\x64\x4d\x53\x6b\x4b\x67\x43\x6b\x71\x45\x53\x6b\x74\x57\x51\x46\x63\x55\x38\x6f\x49\x43\x75\x48\x5a\x6e\x38\x6f\x75\x6f\x43\x6f\x72\x57\x4f\x38\x55\x78\x67\x78\x63\x4e\x57\x68\x64\x53\x6d\x6f\x43\x42\x38\x6f\x6f\x71\x57\x43\x6e\x57\x52\x70\x64\x47\x57\x37\x63\x54\x43\x6b\x4f\x57\x35\x2f\x63\x55\x71\x53\x4f\x69\x6d\x6f\x31\x57\x35\x71\x3d','\x57\x52\x6c\x63\x56\x66\x7a\x53\x41\x71\x3d\x3d','\x57\x51\x2f\x64\x4e\x38\x6f\x41\x57\x35\x4a\x64\x48\x47\x3d\x3d','\x57\x51\x71\x35\x57\x4f\x64\x63\x53\x78\x57\x42\x57\x35\x71\x5a\x66\x71\x43\x79\x57\x36\x38\x73\x6c\x63\x4e\x64\x4c\x43\x6b\x2f\x57\x50\x30\x7a\x79\x38\x6b\x41\x78\x43\x6b\x66\x57\x35\x46\x63\x49\x67\x7a\x2f\x76\x43\x6f\x70\x73\x4e\x35\x41\x6a\x6d\x6f\x41\x62\x58\x37\x63\x4b\x4a\x64\x63\x47\x38\x6b\x68\x74\x53\x6f\x43\x63\x67\x47\x56\x70\x77\x56\x63\x4c\x4e\x74\x64\x55\x53\x6b\x6a\x57\x35\x70\x63\x53\x5a\x65\x57\x57\x51\x66\x38\x57\x4f\x2f\x63\x50\x61\x64\x64\x50\x6d\x6b\x6a\x57\x50\x5a\x64\x47\x61\x3d\x3d','\x64\x71\x66\x6a\x57\x34\x4a\x63\x49\x58\x2f\x64\x55\x33\x68\x63\x53\x74\x48\x2b\x57\x4f\x57\x50\x57\x51\x42\x64\x4e\x63\x6a\x61\x46\x53\x6f\x77\x71\x43\x6b\x57\x64\x38\x6f\x66\x76\x63\x6c\x64\x56\x43\x6b\x6d\x68\x31\x70\x63\x56\x38\x6f\x4a\x72\x53\x6b\x4d\x71\x47\x78\x63\x4e\x30\x31\x66','\x42\x43\x6f\x4f\x57\x36\x2f\x64\x4b\x49\x33\x64\x55\x6d\x6f\x48\x44\x6d\x6b\x71\x57\x52\x70\x63\x56\x38\x6f\x61\x57\x37\x74\x64\x54\x47\x3d\x3d','\x41\x43\x6b\x44\x6a\x43\x6b\x31\x57\x37\x47\x3d','\x65\x71\x6d\x6c\x57\x34\x4f\x54','\x57\x4f\x75\x64\x57\x51\x68\x63\x49\x73\x75\x3d','\x66\x38\x6b\x33\x57\x52\x44\x31\x57\x37\x57\x3d','\x57\x4f\x6e\x68\x57\x35\x47\x4a\x61\x47\x3d\x3d','\x57\x51\x42\x64\x4c\x43\x6f\x77\x73\x48\x57\x3d','\x57\x36\x4a\x64\x4d\x64\x38\x46\x44\x53\x6b\x52\x57\x34\x31\x4f\x57\x51\x4e\x63\x56\x66\x6c\x63\x54\x6d\x6b\x65\x57\x37\x4a\x64\x54\x53\x6b\x39\x57\x52\x6a\x66\x57\x4f\x6d\x74\x68\x71\x7a\x6d\x57\x51\x52\x64\x4e\x53\x6b\x39\x6c\x38\x6f\x50\x57\x4f\x34\x6f\x7a\x74\x70\x64\x4a\x74\x78\x63\x48\x66\x78\x63\x4f\x68\x31\x30\x57\x50\x2f\x63\x51\x43\x6f\x66\x57\x36\x47\x4e\x57\x35\x48\x58\x57\x34\x66\x70\x57\x35\x37\x64\x52\x53\x6b\x74\x61\x4a\x54\x34\x57\x35\x5a\x63\x52\x66\x61\x56\x73\x53\x6f\x2b\x57\x34\x52\x63\x50\x77\x4e\x63\x48\x71\x3d\x3d','\x57\x37\x52\x63\x53\x6d\x6b\x4b\x67\x32\x70\x64\x47\x6d\x6f\x4d\x67\x32\x44\x6b\x57\x34\x5a\x64\x50\x67\x74\x64\x51\x75\x58\x42\x71\x53\x6b\x66\x57\x36\x39\x36\x73\x71\x70\x64\x47\x58\x74\x63\x53\x6d\x6f\x59\x6a\x47\x34\x6b\x57\x51\x52\x63\x52\x53\x6b\x65\x57\x4f\x43\x6f\x57\x50\x50\x59\x72\x47\x72\x52\x57\x50\x34\x64\x41\x43\x6b\x73\x46\x38\x6b\x42\x42\x38\x6b\x2b\x77\x4e\x75\x6c\x57\x36\x79\x61\x78\x4a\x6c\x64\x4c\x6d\x6b\x6d\x71\x4c\x66\x2b\x57\x51\x37\x64\x4e\x53\x6f\x4c\x6f\x38\x6f\x54','\x64\x61\x4f\x30\x57\x34\x74\x63\x4f\x32\x69\x41\x57\x35\x35\x65\x6a\x47\x6a\x68\x63\x67\x2f\x64\x4d\x43\x6f\x59\x57\x50\x4b\x30\x77\x38\x6f\x33\x69\x38\x6f\x2b\x57\x4f\x6c\x63\x4e\x38\x6b\x57\x66\x6d\x6b\x70\x6d\x43\x6b\x70\x57\x52\x42\x64\x51\x6d\x6b\x56\x69\x61\x7a\x4c\x70\x53\x6f\x4b\x62\x53\x6f\x34\x57\x34\x38\x5a\x68\x67\x2f\x63\x4e\x72\x52\x64\x53\x43\x6f\x6c\x73\x6d\x6b\x64\x68\x61\x6e\x63\x57\x51\x64\x64\x4d\x61\x4e\x63\x55\x43\x6f\x30\x57\x50\x70\x64\x54\x61\x61\x6c\x69\x6d\x6b\x50\x57\x4f\x47\x3d','\x6d\x43\x6f\x78\x43\x6d\x6f\x6f\x72\x47\x3d\x3d','\x6f\x6d\x6b\x41\x57\x34\x79\x39\x77\x57\x3d\x3d','\x45\x49\x2f\x63\x47\x4a\x53\x50\x42\x73\x46\x64\x49\x73\x52\x64\x47\x6d\x6f\x65\x67\x38\x6f\x79\x57\x37\x74\x63\x4e\x75\x75\x6e\x57\x36\x65\x50\x57\x52\x54\x6c\x57\x34\x64\x63\x52\x4e\x39\x36\x79\x53\x6b\x53\x42\x38\x6b\x69\x71\x53\x6f\x50\x57\x37\x57\x51\x57\x4f\x46\x63\x48\x43\x6b\x50\x57\x51\x31\x42\x57\x4f\x70\x64\x55\x38\x6f\x39\x66\x6d\x6b\x39\x44\x63\x43\x6c\x57\x36\x52\x64\x4e\x61\x6c\x63\x50\x38\x6b\x43\x57\x50\x61\x32\x74\x31\x52\x64\x49\x53\x6b\x70\x57\x37\x4e\x64\x4f\x53\x6b\x67\x77\x4a\x47\x4b\x67\x61\x3d\x3d','\x57\x51\x53\x59\x78\x43\x6b\x6e\x57\x4f\x34\x3d','\x57\x36\x4e\x64\x48\x67\x52\x64\x52\x43\x6f\x63','\x6e\x53\x6f\x75\x7a\x6d\x6f\x34\x72\x71\x3d\x3d','\x57\x37\x71\x41\x78\x6d\x6f\x37\x63\x61\x3d\x3d','\x57\x37\x42\x64\x56\x31\x48\x41\x68\x61\x3d\x3d','\x77\x4a\x6e\x69\x57\x52\x78\x64\x4d\x72\x39\x45\x57\x35\x37\x64\x4d\x57\x30\x68\x57\x52\x4e\x64\x53\x48\x2f\x63\x53\x43\x6b\x43\x45\x4b\x2f\x63\x4a\x75\x64\x64\x55\x49\x78\x63\x48\x61\x69\x4b\x44\x53\x6b\x2f\x6f\x43\x6b\x5a\x57\x52\x57\x49\x68\x74\x76\x30\x57\x51\x47\x68\x57\x34\x61\x51\x66\x59\x37\x63\x4c\x73\x62\x47\x71\x74\x58\x4c\x57\x50\x4a\x63\x51\x4d\x68\x64\x4d\x38\x6f\x74\x57\x51\x4c\x6e\x63\x30\x52\x63\x54\x53\x6b\x57\x71\x38\x6f\x63\x75\x43\x6b\x62\x66\x63\x50\x71','\x57\x36\x4f\x58\x77\x47\x3d\x3d','\x57\x4f\x4b\x53\x79\x38\x6b\x30\x57\x52\x34\x3d','\x62\x77\x72\x48\x57\x51\x5a\x63\x4f\x61\x3d\x3d','\x44\x63\x37\x63\x4b\x53\x6f\x71\x57\x34\x34\x51\x69\x53\x6b\x47\x72\x61\x3d\x3d','\x57\x52\x66\x77\x68\x72\x62\x6f\x6c\x43\x6f\x74\x71\x38\x6f\x45\x57\x4f\x33\x63\x4a\x62\x5a\x63\x4e\x43\x6f\x57\x63\x57\x3d\x3d','\x62\x6d\x6f\x41\x57\x35\x30\x39\x76\x61\x3d\x3d','\x57\x4f\x4a\x64\x56\x47\x61\x49\x70\x71\x3d\x3d','\x57\x52\x2f\x64\x55\x43\x6f\x39','\x57\x51\x30\x70\x57\x35\x76\x69\x61\x61\x3d\x3d','\x6d\x4d\x6a\x62\x57\x52\x64\x63\x4b\x4b\x56\x64\x52\x6d\x6f\x2f\x64\x31\x38\x73','\x57\x4f\x43\x35\x76\x43\x6f\x33\x73\x61\x3d\x3d','\x70\x38\x6b\x54\x57\x52\x37\x63\x48\x32\x4a\x63\x51\x38\x6b\x31\x67\x38\x6f\x61\x57\x36\x46\x64\x54\x53\x6b\x70\x57\x52\x52\x63\x50\x43\x6f\x39\x6e\x43\x6b\x39\x57\x50\x6e\x61\x57\x37\x47\x65\x57\x35\x33\x64\x51\x38\x6b\x6a\x46\x76\x70\x63\x52\x31\x76\x61\x57\x50\x56\x64\x47\x43\x6f\x55\x67\x53\x6f\x59\x57\x34\x54\x39\x61\x6d\x6b\x51\x74\x32\x71\x3d','\x68\x38\x6f\x51\x74\x31\x68\x64\x4d\x47\x3d\x3d','\x57\x34\x71\x39\x57\x51\x56\x64\x55\x38\x6b\x50\x57\x36\x68\x64\x55\x61\x3d\x3d','\x46\x31\x56\x64\x49\x76\x31\x75\x76\x63\x56\x63\x56\x53\x6f\x78\x57\x4f\x64\x64\x47\x67\x6c\x64\x56\x38\x6b\x38\x78\x59\x74\x63\x55\x49\x37\x64\x49\x38\x6f\x7a\x62\x38\x6b\x33\x57\x50\x68\x64\x4c\x6d\x6b\x6e\x6e\x43\x6b\x6c\x57\x51\x35\x46\x6f\x43\x6f\x73\x57\x34\x5a\x63\x4f\x66\x6c\x63\x53\x53\x6b\x42\x6e\x68\x4a\x63\x51\x66\x6a\x36\x61\x43\x6b\x4b\x57\x51\x6a\x43\x57\x51\x4c\x62\x41\x78\x33\x64\x53\x43\x6f\x58\x6b\x4d\x44\x61\x57\x34\x30\x6b\x57\x34\x78\x64\x4b\x66\x75\x38\x57\x35\x58\x63\x6f\x64\x6d\x3d','\x70\x32\x79\x62\x57\x51\x56\x63\x4c\x66\x5a\x64\x56\x38\x6b\x38\x78\x72\x7a\x61\x64\x53\x6f\x57\x63\x38\x6b\x6b\x57\x52\x75\x32\x57\x36\x53\x50\x57\x37\x35\x64\x6a\x73\x33\x64\x4c\x6d\x6b\x68\x7a\x71\x72\x7a\x57\x4f\x33\x63\x4f\x33\x66\x2f\x57\x37\x69\x32\x6b\x6d\x6f\x73\x6c\x72\x54\x71\x6a\x43\x6b\x68\x57\x51\x6c\x63\x52\x53\x6f\x69\x77\x43\x6b\x76\x57\x36\x2f\x64\x4d\x65\x78\x64\x48\x38\x6f\x6d\x57\x52\x66\x58\x57\x37\x53\x2b\x43\x38\x6f\x48\x6e\x31\x57\x44\x57\x37\x33\x63\x50\x43\x6f\x31\x57\x51\x47\x3d','\x57\x52\x47\x37\x57\x51\x5a\x63\x52\x64\x4f\x3d','\x57\x4f\x7a\x75\x67\x71\x62\x4f\x6e\x38\x6f\x62','\x57\x35\x6a\x4e\x63\x38\x6b\x32\x57\x34\x50\x36\x57\x50\x65\x47\x57\x51\x6e\x42\x57\x4f\x79\x36\x57\x52\x64\x63\x48\x47\x3d\x3d','\x66\x43\x6f\x73\x57\x37\x4a\x64\x49\x6d\x6f\x38\x57\x50\x69\x6e','\x6c\x4e\x33\x63\x4c\x4c\x57\x3d','\x57\x36\x5a\x63\x54\x6d\x6f\x33\x57\x50\x74\x64\x47\x43\x6b\x6f\x64\x53\x6f\x4d\x6f\x61\x3d\x3d','\x57\x36\x2f\x64\x55\x4b\x52\x64\x47\x6d\x6f\x45','\x68\x31\x4a\x63\x4a\x4e\x6a\x68','\x69\x32\x65\x6c','\x6e\x53\x6f\x71\x45\x53\x6f\x79\x79\x71\x3d\x3d','\x57\x52\x6c\x63\x52\x38\x6f\x65\x57\x36\x4a\x63\x51\x47\x66\x4a\x57\x52\x5a\x63\x4d\x38\x6f\x4f\x57\x4f\x46\x63\x4f\x68\x46\x64\x52\x43\x6b\x30\x57\x36\x35\x62\x76\x61\x4f\x74\x42\x4e\x66\x42\x57\x50\x75\x3d','\x7a\x38\x6f\x6c\x67\x6d\x6b\x59\x57\x37\x61\x3d','\x57\x52\x74\x63\x53\x4d\x54\x70\x75\x61\x3d\x3d','\x57\x34\x71\x39\x57\x52\x4e\x64\x51\x38\x6b\x50\x57\x36\x52\x63\x51\x53\x6f\x59\x57\x4f\x2f\x64\x4c\x6d\x6b\x5a\x57\x52\x38\x66\x69\x58\x74\x63\x4e\x33\x6a\x4c\x57\x52\x52\x63\x48\x4d\x65\x3d','\x57\x52\x68\x64\x54\x38\x6f\x4a\x73\x63\x52\x63\x4a\x6d\x6b\x5a\x61\x58\x4b\x66\x57\x50\x34\x3d','\x57\x4f\x64\x64\x4f\x61\x61\x37\x6d\x61\x3d\x3d','\x6d\x38\x6b\x46\x57\x36\x43\x4f\x78\x57\x71\x4a\x6d\x43\x6f\x32\x73\x38\x6b\x2b\x42\x65\x4e\x64\x54\x38\x6f\x54\x61\x4b\x33\x63\x4d\x47\x3d\x3d','\x68\x53\x6b\x6b\x57\x4f\x54\x31\x57\x37\x30\x3d','\x57\x50\x33\x64\x4d\x53\x6f\x59\x76\x48\x4e\x63\x4e\x61\x3d\x3d','\x57\x4f\x62\x57\x57\x51\x33\x64\x55\x65\x4f\x3d','\x57\x52\x2f\x63\x4e\x63\x74\x64\x47\x6d\x6f\x64\x57\x51\x33\x63\x49\x76\x39\x58\x57\x51\x6c\x63\x53\x32\x4e\x63\x4d\x31\x4f\x67\x57\x36\x5a\x63\x51\x5a\x65\x46\x57\x50\x4a\x64\x53\x53\x6f\x6d\x57\x51\x78\x64\x48\x53\x6b\x47\x79\x63\x68\x64\x56\x48\x4e\x63\x53\x4b\x62\x70\x67\x53\x6f\x35\x57\x37\x37\x63\x48\x53\x6f\x51\x57\x34\x61\x67\x6b\x38\x6f\x79\x57\x4f\x74\x64\x52\x43\x6b\x7a\x75\x71\x7a\x35\x57\x36\x4b\x61\x71\x64\x4c\x69\x69\x38\x6f\x32\x57\x34\x71\x79\x57\x51\x71\x7a\x57\x35\x5a\x63\x53\x53\x6f\x7a\x57\x50\x2f\x63\x4f\x67\x69\x3d','\x57\x50\x52\x64\x56\x48\x57\x4e\x6d\x61\x3d\x3d','\x64\x5a\x47\x45\x66\x38\x6f\x65','\x68\x38\x6f\x6e\x77\x38\x6f\x73\x7a\x71\x3d\x3d','\x70\x43\x6b\x6d\x57\x36\x57\x55\x73\x47\x3d\x3d','\x57\x35\x72\x52\x64\x53\x6b\x56\x57\x34\x4f\x3d','\x57\x4f\x2f\x63\x4b\x31\x35\x43\x41\x71\x3d\x3d','\x57\x51\x38\x32\x74\x38\x6f\x31\x77\x59\x56\x64\x4e\x63\x57\x68\x57\x37\x5a\x63\x55\x66\x4b\x66\x70\x53\x6b\x2f\x57\x52\x31\x51\x46\x53\x6f\x71\x74\x43\x6b\x71\x57\x37\x62\x68\x64\x6d\x6b\x6e\x77\x43\x6f\x79\x75\x76\x64\x63\x4c\x38\x6f\x55\x6e\x38\x6b\x4b\x57\x37\x54\x50\x76\x43\x6f\x37\x57\x4f\x4e\x64\x47\x6d\x6f\x44\x42\x58\x66\x63\x45\x6d\x6f\x41\x70\x71\x4a\x64\x50\x38\x6f\x36\x57\x52\x6c\x63\x49\x71\x42\x63\x47\x38\x6b\x5a\x57\x52\x78\x63\x4d\x47\x72\x30\x57\x35\x54\x73\x44\x53\x6f\x31\x57\x36\x54\x6f','\x57\x52\x50\x79\x61\x4b\x42\x64\x4b\x71\x3d\x3d','\x57\x52\x72\x52\x57\x37\x65\x4b\x61\x38\x6f\x63\x78\x6d\x6b\x53\x73\x4e\x61\x79\x45\x4b\x75\x4a','\x45\x66\x47\x32\x42\x78\x6d\x3d','\x57\x50\x79\x43\x63\x47\x66\x52\x69\x6d\x6f\x61\x76\x53\x6f\x79','\x73\x53\x6b\x70\x63\x53\x6b\x69\x57\x35\x4b\x3d','\x65\x57\x7a\x42\x57\x35\x64\x63\x4d\x71\x3d\x3d','\x6b\x49\x30\x74\x57\x35\x38\x73','\x57\x34\x34\x79\x57\x34\x56\x64\x4b\x49\x33\x63\x4f\x78\x66\x48\x57\x4f\x4b\x5a\x69\x6d\x6b\x46\x57\x37\x66\x39\x79\x71\x38\x3d','\x6a\x6d\x6f\x56\x78\x76\x56\x64\x51\x75\x6d\x66\x57\x51\x6a\x48\x42\x74\x69\x5a\x57\x4f\x5a\x64\x4d\x57\x65\x4c\x6b\x43\x6f\x52\x57\x37\x68\x63\x49\x64\x4a\x64\x50\x6d\x6f\x41\x42\x38\x6f\x74\x57\x36\x33\x63\x50\x53\x6f\x73\x6d\x47\x75\x6a\x57\x34\x76\x34\x57\x36\x6a\x73\x57\x4f\x5a\x63\x55\x38\x6b\x75\x46\x6d\x6b\x67\x57\x4f\x61\x53\x57\x50\x68\x63\x53\x30\x58\x4d\x6d\x62\x70\x63\x56\x73\x33\x64\x56\x6d\x6b\x32\x77\x38\x6f\x49\x79\x4e\x7a\x47\x62\x47\x64\x64\x53\x43\x6f\x56\x66\x32\x53\x30','\x57\x4f\x64\x63\x4b\x4d\x4c\x6d\x6c\x57\x3d\x3d','\x6a\x4a\x4f\x50\x57\x35\x38\x43','\x67\x6d\x6f\x67\x43\x6d\x6f\x31\x43\x47\x3d\x3d','\x67\x38\x6f\x33\x79\x43\x6f\x6c\x45\x66\x35\x6d\x6e\x6d\x6b\x42\x57\x51\x6a\x38\x45\x66\x5a\x64\x56\x6d\x6b\x57\x57\x35\x64\x63\x53\x4c\x70\x64\x49\x6d\x6f\x64\x77\x47\x3d\x3d','\x74\x6d\x6b\x43\x65\x53\x6f\x46\x42\x53\x6f\x6e\x42\x47\x3d\x3d','\x44\x38\x6b\x72\x69\x43\x6b\x46\x57\x35\x38\x3d','\x76\x38\x6f\x78\x6b\x43\x6b\x61','\x57\x37\x42\x64\x48\x4c\x68\x64\x54\x6d\x6f\x71\x57\x52\x69\x6e\x73\x4e\x75\x33\x57\x35\x4e\x63\x4f\x6d\x6b\x79\x76\x57\x3d\x3d','\x57\x35\x79\x6d\x57\x36\x4e\x63\x54\x64\x30\x3d','\x62\x38\x6f\x32\x42\x53\x6f\x4c\x57\x4f\x34\x46\x57\x37\x33\x63\x48\x6d\x6b\x77\x79\x58\x72\x70\x64\x74\x43\x33\x57\x51\x72\x67\x57\x52\x4b\x67\x57\x36\x6e\x4c\x66\x6d\x6b\x71\x57\x51\x31\x6e\x57\x50\x5a\x64\x51\x43\x6b\x42\x6c\x67\x68\x64\x54\x4e\x54\x72\x57\x36\x70\x63\x47\x73\x4a\x63\x4f\x6d\x6b\x77\x6e\x64\x47\x4e\x57\x52\x42\x64\x49\x38\x6f\x44\x7a\x6d\x6f\x31\x6c\x38\x6b\x30\x57\x35\x53\x45\x57\x51\x5a\x64\x49\x4a\x71\x2f\x57\x50\x66\x2b\x57\x4f\x56\x63\x50\x58\x30\x30\x57\x50\x2f\x63\x4e\x33\x43\x6b','\x69\x6d\x6b\x45\x6d\x53\x6b\x34\x57\x51\x43\x3d','\x68\x47\x4b\x2f\x57\x35\x71\x4d','\x57\x34\x50\x34\x67\x38\x6b\x57\x63\x73\x56\x63\x49\x67\x72\x63\x57\x37\x5a\x64\x52\x62\x62\x69\x45\x38\x6f\x53\x57\x36\x30\x52\x6d\x6d\x6b\x6e\x64\x43\x6f\x66\x57\x35\x4f\x38\x71\x43\x6f\x45\x6a\x6d\x6f\x79\x62\x72\x2f\x63\x4c\x38\x6b\x51\x43\x53\x6f\x4f\x57\x52\x4f\x57\x76\x43\x6b\x34\x57\x34\x42\x63\x4a\x53\x6b\x6f\x6b\x4c\x6a\x6b\x67\x38\x6b\x6f\x44\x66\x37\x63\x4f\x53\x6f\x36\x57\x35\x52\x64\x56\x78\x6c\x64\x53\x38\x6b\x5a\x57\x36\x46\x64\x4e\x31\x75\x48\x57\x50\x34\x62\x69\x53\x6b\x4d\x57\x36\x76\x4b','\x57\x34\x56\x64\x4c\x75\x52\x63\x4a\x38\x6b\x4c','\x57\x35\x54\x6e\x6e\x66\x75\x2b\x57\x37\x7a\x74\x72\x31\x64\x63\x4e\x43\x6f\x31\x6f\x43\x6b\x36\x45\x38\x6b\x56\x57\x50\x6e\x39\x76\x64\x37\x64\x52\x38\x6b\x61\x57\x37\x2f\x64\x52\x53\x6b\x6a\x73\x6d\x6b\x4e\x57\x34\x53\x78\x64\x30\x70\x63\x49\x32\x70\x64\x4a\x68\x4f\x2f\x57\x4f\x6a\x4d\x42\x31\x50\x49\x45\x63\x79\x55\x78\x30\x78\x64\x56\x38\x6b\x61\x77\x6d\x6b\x55\x67\x43\x6b\x6b\x6f\x4b\x74\x64\x4b\x72\x68\x63\x55\x57\x65\x42\x57\x4f\x4a\x64\x4a\x43\x6b\x4e\x57\x51\x35\x62\x76\x71\x3d\x3d','\x67\x38\x6b\x46\x66\x43\x6b\x38\x57\x52\x57\x3d','\x57\x52\x71\x75\x43\x74\x6e\x6a','\x57\x51\x6d\x44\x74\x38\x6b\x64\x57\x4f\x57\x3d','\x57\x37\x70\x64\x47\x77\x72\x57','\x57\x50\x68\x63\x49\x68\x6e\x77\x69\x47\x3d\x3d','\x76\x53\x6b\x43\x65\x53\x6f\x42\x43\x53\x6f\x64\x42\x63\x39\x68\x57\x36\x38\x42\x72\x43\x6f\x35','\x57\x52\x50\x33\x6c\x4b\x52\x64\x4b\x57\x3d\x3d','\x57\x50\x4e\x64\x52\x43\x6f\x6d\x78\x4a\x43\x3d','\x57\x35\x62\x58\x57\x34\x4e\x64\x4f\x4e\x58\x6d\x57\x50\x66\x58\x72\x4b\x35\x6d\x57\x51\x4f\x73\x41\x67\x42\x63\x4b\x6d\x6f\x53\x57\x50\x31\x78\x6c\x6d\x6b\x74\x72\x53\x6f\x2f\x57\x4f\x78\x64\x48\x5a\x61\x32\x65\x43\x6b\x6b\x73\x4a\x39\x41\x41\x43\x6b\x42\x73\x76\x4e\x64\x4b\x5a\x64\x64\x4a\x38\x6f\x6f\x68\x43\x6b\x69\x62\x67\x48\x2f\x43\x73\x37\x64\x4c\x59\x46\x63\x56\x38\x6b\x6a\x57\x34\x33\x64\x4c\x4d\x66\x50\x57\x51\x65\x39\x57\x34\x68\x64\x4f\x61\x64\x63\x54\x6d\x6f\x69\x57\x34\x2f\x63\x4c\x61\x3d\x3d','\x57\x4f\x4c\x71\x64\x4b\x52\x64\x49\x43\x6b\x4e\x57\x52\x52\x64\x47\x59\x71\x6c\x57\x34\x64\x63\x4b\x38\x6b\x68\x68\x71\x62\x4e\x75\x57\x30\x62\x57\x37\x47\x3d','\x57\x4f\x62\x30\x57\x52\x4a\x64\x53\x62\x74\x63\x48\x33\x2f\x64\x53\x6d\x6b\x6c\x57\x37\x78\x64\x50\x31\x61\x6a\x57\x34\x37\x63\x49\x30\x68\x64\x48\x6d\x6f\x55\x6c\x33\x74\x63\x4f\x53\x6f\x41\x6c\x43\x6b\x38\x71\x6d\x6b\x4e\x57\x37\x5a\x63\x51\x4a\x69\x66\x43\x6d\x6f\x43\x79\x75\x74\x64\x47\x53\x6b\x6f\x79\x43\x6f\x73\x7a\x72\x42\x63\x51\x53\x6f\x63\x57\x51\x4f\x4c\x41\x57\x46\x63\x48\x53\x6b\x31\x57\x36\x4a\x63\x56\x67\x70\x64\x4b\x77\x76\x42\x57\x50\x52\x63\x4b\x38\x6f\x64\x42\x38\x6f\x59\x57\x52\x6e\x71\x6b\x53\x6b\x2f\x57\x36\x69\x3d','\x6c\x62\x66\x49\x69\x74\x42\x63\x54\x4d\x70\x63\x54\x30\x69\x78\x57\x52\x61\x33\x57\x35\x62\x72\x57\x50\x54\x49\x57\x51\x4e\x63\x4b\x4b\x48\x77\x71\x43\x6f\x57\x57\x50\x65\x69\x73\x61\x38\x4f\x57\x52\x62\x5a\x57\x35\x74\x64\x54\x6d\x6b\x2b\x76\x53\x6b\x6c\x74\x59\x46\x63\x4a\x43\x6f\x79\x57\x34\x38\x68\x57\x34\x4a\x63\x55\x53\x6b\x41\x74\x66\x42\x63\x48\x62\x50\x63\x63\x38\x6f\x43\x57\x50\x35\x30\x72\x6d\x6f\x75\x57\x52\x68\x63\x54\x38\x6f\x35\x71\x78\x2f\x64\x54\x68\x75\x30\x57\x4f\x50\x5a','\x61\x43\x6f\x4d\x79\x43\x6f\x6f\x45\x71\x50\x64\x6e\x6d\x6f\x76\x57\x36\x43\x30\x6c\x65\x46\x64\x50\x53\x6b\x54\x57\x34\x37\x64\x56\x76\x42\x63\x49\x38\x6b\x6f\x67\x61\x3d\x3d','\x57\x51\x76\x54\x57\x36\x75\x49\x66\x43\x6b\x6c\x63\x6d\x6f\x78\x63\x64\x31\x72\x71\x75\x71\x2f\x71\x65\x46\x64\x49\x4e\x74\x64\x53\x38\x6f\x4c\x76\x53\x6b\x2f\x42\x4e\x4b\x66\x57\x37\x79\x4d\x75\x31\x44\x39\x57\x52\x74\x64\x53\x38\x6b\x50\x57\x52\x71\x52\x70\x71\x46\x64\x4c\x38\x6f\x57\x79\x77\x79\x38\x77\x53\x6f\x77\x57\x37\x42\x64\x4c\x6d\x6f\x5a\x77\x6d\x6b\x4a\x57\x50\x75\x56\x63\x49\x39\x39\x7a\x63\x68\x64\x54\x71\x34\x56\x75\x6d\x6b\x67\x6c\x38\x6b\x59\x70\x61\x3d\x3d','\x57\x36\x68\x63\x54\x6d\x6b\x41\x57\x35\x78\x63\x4a\x38\x6b\x66\x63\x53\x6b\x59\x6e\x78\x5a\x63\x4f\x6d\x6b\x71\x57\x50\x53\x4b\x70\x43\x6b\x73\x57\x51\x57\x63\x57\x35\x46\x64\x56\x57\x53\x47\x62\x6d\x6f\x30\x66\x38\x6f\x7a\x57\x52\x2f\x63\x55\x61\x5a\x64\x4e\x43\x6f\x2b\x6b\x49\x52\x64\x53\x59\x31\x7a\x72\x31\x44\x78\x45\x6d\x6f\x56\x45\x43\x6b\x43\x68\x61\x33\x63\x56\x64\x57\x52\x57\x35\x42\x64\x4f\x53\x6f\x42\x62\x43\x6f\x64\x65\x75\x7a\x78\x57\x35\x6a\x65\x57\x50\x72\x4b\x66\x38\x6b\x77\x57\x37\x33\x64\x4d\x71\x3d\x3d','\x73\x38\x6f\x6c\x75\x38\x6f\x39\x57\x36\x35\x56\x6c\x6d\x6f\x78\x6a\x53\x6b\x44\x61\x38\x6b\x63\x57\x35\x4f\x5a\x57\x4f\x4a\x64\x4c\x53\x6f\x4b\x77\x32\x39\x39\x57\x4f\x47\x6a\x57\x50\x74\x64\x47\x4d\x76\x72\x78\x43\x6b\x67\x57\x35\x37\x64\x56\x38\x6b\x72\x57\x51\x4a\x63\x47\x30\x4e\x64\x48\x66\x33\x63\x54\x49\x48\x43\x57\x36\x53\x69\x77\x71\x56\x63\x4e\x6d\x6f\x77\x77\x62\x79\x54\x57\x52\x65\x30\x67\x72\x7a\x6a\x57\x36\x47\x78\x57\x51\x42\x64\x4a\x73\x75\x30\x57\x36\x68\x63\x52\x6d\x6f\x4d\x6d\x59\x75\x3d','\x57\x35\x65\x39\x57\x52\x4e\x64\x4e\x38\x6b\x35\x57\x37\x46\x64\x50\x43\x6b\x58\x57\x35\x4a\x63\x47\x6d\x6f\x39\x57\x34\x38\x71\x70\x58\x75\x3d','\x57\x34\x6c\x64\x48\x73\x65\x46\x6c\x43\x6b\x62\x57\x34\x31\x4f\x57\x51\x4e\x63\x56\x66\x6c\x63\x54\x6d\x6b\x65\x57\x52\x42\x63\x53\x38\x6f\x51\x57\x52\x69\x31\x57\x35\x66\x43\x75\x65\x38\x46\x57\x36\x2f\x64\x4c\x53\x6b\x31\x46\x43\x6b\x53\x57\x35\x31\x62\x6b\x77\x78\x63\x49\x64\x4e\x64\x4a\x75\x68\x64\x52\x77\x76\x30\x57\x4f\x33\x63\x51\x6d\x6b\x6a\x57\x52\x54\x55\x57\x34\x47\x4c\x57\x34\x6d\x31\x57\x50\x56\x64\x4f\x6d\x6f\x68\x74\x75\x34\x4f\x57\x4f\x5a\x64\x51\x71\x6a\x6d\x63\x38\x6b\x54\x57\x4f\x2f\x63\x52\x77\x64\x63\x48\x71\x3d\x3d','\x67\x43\x6f\x50\x78\x62\x37\x64\x55\x61\x35\x7a\x57\x36\x75\x30\x44\x4e\x79\x31\x57\x50\x78\x64\x4b\x71\x47\x59\x41\x6d\x6b\x5a\x57\x37\x68\x63\x4c\x5a\x5a\x64\x52\x53\x6b\x70\x7a\x43\x6f\x67\x57\x51\x52\x63\x56\x53\x6b\x42\x69\x61\x79\x45\x57\x50\x79\x49\x57\x36\x65\x78\x57\x4f\x2f\x63\x56\x43\x6b\x6f\x42\x43\x6b\x44\x57\x34\x6d\x51\x57\x50\x68\x63\x50\x65\x58\x39\x42\x4c\x68\x64\x4f\x67\x74\x64\x53\x43\x6f\x7a\x77\x38\x6b\x57\x6a\x59\x43\x31\x71\x31\x70\x63\x50\x43\x6b\x38\x67\x71\x3d\x3d','\x57\x52\x2f\x64\x55\x43\x6f\x31','\x69\x6d\x6b\x71\x57\x50\x4c\x52\x57\x36\x75\x3d','\x57\x51\x33\x64\x53\x53\x6f\x48\x44\x72\x61\x3d','\x68\x43\x6f\x64\x75\x76\x4a\x64\x4b\x61\x3d\x3d','\x57\x50\x4e\x64\x54\x43\x6f\x5a','\x64\x6d\x6f\x53\x57\x35\x4b\x70\x73\x38\x6b\x4d\x72\x6d\x6b\x2f\x57\x37\x64\x64\x4d\x32\x43\x3d','\x57\x36\x53\x49\x75\x43\x6f\x6a','\x57\x51\x52\x63\x50\x48\x44\x75\x6a\x71\x3d\x3d','\x57\x51\x79\x70\x68\x53\x6f\x6c\x57\x36\x53\x3d','\x57\x34\x5a\x64\x56\x6d\x6b\x76\x57\x50\x42\x63\x51\x4e\x58\x4f\x57\x52\x74\x63\x4d\x38\x6f\x4a\x57\x37\x5a\x64\x4e\x4e\x46\x63\x4b\x6d\x6b\x2f\x57\x36\x44\x6b\x78\x71\x66\x4f\x65\x68\x65\x4d\x57\x34\x4a\x63\x48\x6d\x6f\x37\x57\x35\x64\x64\x4b\x77\x4e\x63\x4d\x38\x6b\x30\x57\x35\x57\x32\x57\x52\x5a\x63\x4a\x73\x70\x63\x47\x43\x6f\x72\x57\x34\x69\x2b\x57\x37\x38\x65\x57\x50\x54\x46\x72\x30\x34\x58\x61\x78\x64\x64\x53\x49\x46\x64\x4a\x43\x6b\x59\x57\x4f\x75\x45\x65\x6d\x6b\x6d\x57\x51\x46\x64\x4d\x78\x6a\x44\x67\x6d\x6b\x6d\x65\x47\x3d\x3d','\x62\x6d\x6b\x6c\x57\x36\x75\x62\x43\x57\x3d\x3d','\x57\x50\x37\x64\x56\x43\x6f\x75\x57\x50\x5a\x64\x4d\x38\x6b\x61\x64\x53\x6b\x51\x46\x67\x46\x63\x52\x38\x6b\x59\x57\x4f\x58\x51\x42\x53\x6f\x78\x57\x36\x54\x79\x57\x35\x4e\x64\x50\x57\x3d\x3d','\x57\x51\x42\x64\x53\x43\x6f\x49\x76\x78\x6c\x64\x54\x6d\x6f\x4d\x71\x65\x31\x6b\x57\x34\x5a\x64\x50\x67\x74\x64\x51\x75\x58\x42\x71\x53\x6b\x66\x57\x36\x39\x36\x73\x71\x70\x64\x47\x58\x74\x63\x53\x6d\x6f\x59\x6a\x47\x34\x6b\x57\x36\x42\x64\x51\x38\x6f\x71\x57\x4f\x44\x43\x57\x35\x38\x48\x65\x30\x47\x2f\x57\x50\x34\x45\x41\x43\x6b\x6e\x66\x6d\x6f\x70\x6c\x53\x6b\x4b\x77\x4e\x65\x64\x57\x51\x62\x70\x64\x68\x2f\x64\x4e\x43\x6b\x63\x65\x72\x71\x53\x57\x36\x46\x63\x4e\x38\x6b\x50\x43\x53\x6b\x33','\x57\x4f\x72\x39\x57\x34\x47\x77\x66\x47\x3d\x3d','\x57\x35\x54\x6e\x6e\x66\x75\x2b\x57\x37\x7a\x74\x72\x31\x64\x63\x4e\x43\x6f\x31\x6f\x43\x6b\x36\x45\x38\x6b\x56\x57\x50\x6d\x56\x65\x73\x42\x64\x52\x38\x6b\x73\x57\x37\x37\x63\x4f\x38\x6b\x75\x77\x43\x6f\x2b\x57\x50\x6d\x36\x64\x58\x68\x64\x4d\x74\x68\x64\x4a\x68\x72\x6c\x57\x34\x4f\x76\x6c\x4b\x58\x54\x41\x31\x6a\x6b\x65\x57\x5a\x63\x53\x43\x6f\x66\x77\x6d\x6f\x39\x78\x6d\x6f\x79\x42\x61\x68\x63\x47\x58\x68\x64\x55\x75\x31\x75\x57\x34\x56\x63\x48\x53\x6f\x49\x57\x36\x50\x62\x66\x61\x3d\x3d','\x57\x4f\x47\x2b\x57\x34\x35\x41\x70\x71\x3d\x3d','\x57\x50\x57\x79\x57\x36\x6e\x31\x79\x30\x7a\x6c\x57\x4f\x4b\x35\x57\x4f\x66\x58\x57\x34\x30\x76\x64\x67\x74\x64\x55\x30\x64\x63\x4f\x32\x64\x64\x55\x53\x6f\x79\x62\x63\x4b\x68\x57\x34\x70\x63\x4f\x38\x6b\x56\x57\x34\x50\x63\x41\x71\x54\x69\x75\x6d\x6b\x70\x57\x4f\x4e\x64\x47\x43\x6b\x4e\x69\x48\x78\x63\x4e\x4d\x50\x7a\x57\x52\x38\x5a\x45\x64\x61\x75\x57\x36\x6d\x66\x57\x50\x5a\x64\x4a\x53\x6f\x41\x57\x34\x4b\x77\x57\x34\x39\x39\x65\x31\x70\x64\x4e\x76\x44\x47\x6e\x43\x6f\x72\x67\x71\x3d\x3d','\x57\x52\x47\x64\x41\x6d\x6b\x58\x57\x51\x75\x46\x6e\x49\x68\x64\x4c\x74\x4f\x3d','\x57\x4f\x74\x63\x4e\x4b\x31\x76\x43\x6d\x6b\x51\x79\x43\x6f\x74','\x6f\x38\x6f\x73\x57\x36\x68\x64\x51\x43\x6f\x2b','\x6f\x74\x65\x31\x70\x53\x6f\x33','\x57\x51\x64\x63\x49\x68\x66\x58\x41\x61\x3d\x3d','\x6b\x6d\x6b\x37\x67\x76\x4a\x64\x56\x48\x66\x76\x57\x51\x57\x38\x6d\x32\x79\x59\x57\x4f\x33\x64\x4d\x30\x48\x78\x6b\x43\x6f\x33\x57\x37\x68\x64\x4d\x4e\x33\x63\x54\x38\x6b\x70\x69\x38\x6b\x68\x57\x36\x70\x64\x53\x53\x6b\x42\x7a\x4b\x4c\x6d\x57\x50\x7a\x32\x57\x51\x34\x78\x57\x34\x6c\x64\x56\x6d\x6f\x61\x6e\x6d\x6b\x44\x57\x4f\x62\x4c\x57\x35\x2f\x64\x54\x57\x4b\x2b\x6f\x58\x4a\x63\x54\x63\x33\x63\x50\x38\x6b\x43\x64\x53\x6b\x57\x6c\x4d\x58\x47\x71\x65\x2f\x63\x4f\x38\x6b\x49\x67\x73\x50\x33','\x70\x38\x6b\x54\x57\x52\x37\x63\x48\x32\x4a\x63\x51\x38\x6b\x31\x67\x38\x6f\x61\x57\x36\x46\x64\x54\x53\x6b\x70\x57\x52\x52\x63\x50\x43\x6f\x39\x6e\x43\x6b\x39\x57\x35\x69\x6b\x57\x52\x4c\x43\x57\x35\x78\x63\x55\x43\x6f\x6d\x79\x65\x46\x63\x50\x65\x66\x62\x57\x35\x70\x63\x4e\x43\x6b\x62\x61\x6d\x6f\x59\x57\x50\x4b\x34\x75\x38\x6f\x2f\x61\x5a\x62\x67\x57\x50\x53\x6f\x57\x35\x4a\x63\x51\x53\x6f\x54\x64\x43\x6f\x36\x79\x4d\x6d\x57\x68\x38\x6f\x6f\x75\x6d\x6f\x52\x65\x71\x46\x64\x53\x73\x50\x4a\x45\x57\x5a\x64\x56\x43\x6f\x45','\x62\x77\x4a\x63\x4d\x4b\x76\x6b\x6a\x77\x42\x63\x4d\x78\x37\x63\x48\x43\x6b\x77\x73\x61\x3d\x3d','\x57\x35\x57\x7a\x71\x61\x70\x63\x4e\x43\x6f\x55\x57\x37\x56\x63\x4a\x32\x31\x72\x57\x4f\x78\x64\x53\x6d\x6f\x69\x68\x71\x54\x31\x65\x63\x4b\x43\x57\x36\x75\x33\x45\x64\x56\x63\x4b\x58\x33\x63\x49\x71\x5a\x64\x4e\x6d\x6b\x62\x57\x35\x71\x4b\x57\x52\x61\x6b\x6d\x38\x6f\x31\x67\x30\x70\x64\x48\x6d\x6f\x79\x68\x33\x30\x6d\x62\x78\x7a\x43\x57\x51\x6a\x59\x57\x4f\x68\x64\x56\x6d\x6f\x53\x57\x36\x6c\x64\x4f\x4c\x42\x63\x4d\x4e\x4a\x64\x55\x53\x6b\x4e\x57\x35\x78\x64\x4c\x31\x43\x71\x57\x52\x4c\x4b\x76\x71\x3d\x3d','\x57\x35\x65\x6e\x57\x35\x70\x63\x4d\x5a\x4f\x3d','\x69\x53\x6b\x69\x57\x37\x6d\x38\x74\x48\x69\x75\x65\x43\x6f\x4f\x75\x43\x6b\x59\x79\x66\x70\x64\x51\x57\x3d\x3d','\x41\x4d\x5a\x63\x4b\x53\x6f\x57\x57\x34\x4b\x53\x6f\x61\x3d\x3d'];(function(_0x4fa08e,_0x55dc58){const _0x7cd523=function(_0x2aaac4){while(--_0x2aaac4){_0x4fa08e['push'](_0x4fa08e['shift']());}},_0x39430d=function(){const _0x3e3f83={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x2c81df,_0x536e11,_0x4dbdb2,_0x594199){_0x594199=_0x594199||{};let _0x12907e=_0x536e11+'='+_0x4dbdb2;let _0x49a496=0x0;for(let _0x5a58d7=0x0,_0xf17a49=_0x2c81df['length'];_0x5a58d7<_0xf17a49;_0x5a58d7++){const _0x31e1a0=_0x2c81df[_0x5a58d7];_0x12907e+=';\x20'+_0x31e1a0;const _0x45462d=_0x2c81df[_0x31e1a0];_0x2c81df['push'](_0x45462d);_0xf17a49=_0x2c81df['length'];_0x45462d!==!![]&&(_0x12907e+='='+_0x45462d);}_0x594199['cookie']=_0x12907e;},'removeCookie':function(){return'dev';},'getCookie':function(_0x4676e4,_0x5905b6){_0x4676e4=_0x4676e4||function(_0x14214b){return _0x14214b;};const _0x56f0e5=_0x4676e4(new RegExp('(?:^|;\x20)'+_0x5905b6['replace'](/([.$?*|{}()[]\/+^])/g,'$1')+'=([^;]*)'));const _0x395eb4=function(_0x27ee91,_0x4c8b4f){_0x27ee91(++_0x4c8b4f);};_0x395eb4(_0x7cd523,_0x55dc58);return _0x56f0e5?decodeURIComponent(_0x56f0e5[0x1]):undefined;}};const _0x254071=function(){const _0x4a82d9=new RegExp('\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*[\x27|\x22].+[\x27|\x22];?\x20*}');return _0x4a82d9['test'](_0x3e3f83['removeCookie']['toString']());};_0x3e3f83['updateCookie']=_0x254071;let _0x26aa13='';const _0x3e745a=_0x3e3f83['updateCookie']();if(!_0x3e745a)_0x3e3f83['setCookie'](['*'],'counter',0x1);else _0x3e745a?_0x26aa13=_0x3e3f83['getCookie'](null,'counter'):_0x3e3f83['removeCookie']();};_0x39430d();}(_0x55dc,0x1b2));const _0x7cd5=function(_0x4fa08e,_0x55dc58){_0x4fa08e=_0x4fa08e-0x0;let _0x7cd523=_0x55dc[_0x4fa08e];if(_0x7cd5['dOsPPH']===undefined){var _0x39430d=function(_0x254071){const _0x26aa13='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=',_0x3e745a=String(_0x254071)['replace'](/=+$/,'');let _0x2c81df='';for(let _0x536e11=0x0,_0x4dbdb2,_0x594199,_0x12907e=0x0;_0x594199=_0x3e745a['charAt'](_0x12907e++);~_0x594199&&(_0x4dbdb2=_0x536e11%0x4?_0x4dbdb2*0x40+_0x594199:_0x594199,_0x536e11++%0x4)?_0x2c81df+=String['fromCharCode'](0xff&_0x4dbdb2>>(-0x2*_0x536e11&0x6)):0x0){_0x594199=_0x26aa13['indexOf'](_0x594199);}return _0x2c81df;};const _0x3e3f83=function(_0x49a496,_0x5a58d7){let _0xf17a49=[],_0x31e1a0=0x0,_0x45462d,_0x4676e4='',_0x5905b6='';_0x49a496=_0x39430d(_0x49a496);for(let _0x395eb4=0x0,_0x14214b=_0x49a496['length'];_0x395eb4<_0x14214b;_0x395eb4++){_0x5905b6+='%'+('00'+_0x49a496['charCodeAt'](_0x395eb4)['toString'](0x10))['slice'](-0x2);}_0x49a496=decodeURIComponent(_0x5905b6);let _0x56f0e5;for(_0x56f0e5=0x0;_0x56f0e5<0x100;_0x56f0e5++){_0xf17a49[_0x56f0e5]=_0x56f0e5;}for(_0x56f0e5=0x0;_0x56f0e5<0x100;_0x56f0e5++){_0x31e1a0=(_0x31e1a0+_0xf17a49[_0x56f0e5]+_0x5a58d7['charCodeAt'](_0x56f0e5%_0x5a58d7['length']))%0x100;_0x45462d=_0xf17a49[_0x56f0e5];_0xf17a49[_0x56f0e5]=_0xf17a49[_0x31e1a0];_0xf17a49[_0x31e1a0]=_0x45462d;}_0x56f0e5=0x0;_0x31e1a0=0x0;for(let _0x27ee91=0x0;_0x27ee91<_0x49a496['length'];_0x27ee91++){_0x56f0e5=(_0x56f0e5+0x1)%0x100;_0x31e1a0=(_0x31e1a0+_0xf17a49[_0x56f0e5])%0x100;_0x45462d=_0xf17a49[_0x56f0e5];_0xf17a49[_0x56f0e5]=_0xf17a49[_0x31e1a0];_0xf17a49[_0x31e1a0]=_0x45462d;_0x4676e4+=String['fromCharCode'](_0x49a496['charCodeAt'](_0x27ee91)^_0xf17a49[(_0xf17a49[_0x56f0e5]+_0xf17a49[_0x31e1a0])%0x100]);}return _0x4676e4;};_0x7cd5['qKMjOX']=_0x3e3f83,_0x7cd5['EYKzzh']={},_0x7cd5['dOsPPH']=!![];}const _0x2aaac4=_0x7cd5['EYKzzh'][_0x4fa08e];if(_0x2aaac4===undefined){if(_0x7cd5['UICQIv']===undefined){const _0x4c8b4f=function(_0x4a82d9){this['umUHSW']=_0x4a82d9;this['nPYKVm']=[0x1,0x0,0x0];this['ngSdvX']=function(){return'newState';};this['iLAquG']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*';this['eWpSkX']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4c8b4f['prototype']['nDftyQ']=function(){const _0x50f5ac=new RegExp(this['iLAquG']+this['eWpSkX']),_0x5d6ff5=_0x50f5ac['test'](this['ngSdvX']['toString']())?--this['nPYKVm'][0x1]:--this['nPYKVm'][0x0];return this['gpEAQq'](_0x5d6ff5);},_0x4c8b4f['prototype']['gpEAQq']=function(_0x366e75){if(!Boolean(~_0x366e75))return _0x366e75;return this['NVLixh'](this['umUHSW']);},_0x4c8b4f['prototype']['NVLixh']=function(_0x4b7620){for(let _0x349ccf=0x0,_0x5e8f76=this['nPYKVm']['length'];_0x349ccf<_0x5e8f76;_0x349ccf++){this['nPYKVm']['push'](Math['round'](Math['random']()));_0x5e8f76=this['nPYKVm']['length'];}return _0x4b7620(this['nPYKVm'][0x0]);},new _0x4c8b4f(_0x7cd5)['nDftyQ'](),_0x7cd5['UICQIv']=!![];}_0x7cd523=_0x7cd5['qKMjOX'](_0x7cd523,_0x55dc58),_0x7cd5['EYKzzh'][_0x4fa08e]=_0x7cd523;}else _0x7cd523=_0x2aaac4;return _0x7cd523;};const _0x4dbdb2=function(){const _0x49527b={};_0x49527b[_0x7cd5('\x30\x78\x34\x32','\x55\x43\x62\x6b')]=_0x7cd5('\x30\x78\x37','\x28\x51\x58\x34');_0x49527b[_0x7cd5('\x30\x78\x63\x66','\x4e\x74\x56\x55')]=_0x7cd5('\x30\x78\x34','\x6b\x5d\x46\x67');_0x49527b[_0x7cd5('\x30\x78\x30','\x33\x49\x69\x59')]=function(_0x326256,_0x3ce71b){return _0x326256!==_0x3ce71b;};_0x49527b[_0x7cd5('\x30\x78\x65\x65','\x66\x30\x59\x68')]=_0x7cd5('\x30\x78\x64\x63','\x6b\x5d\x46\x67');_0x49527b[_0x7cd5('\x30\x78\x37\x32','\x4f\x37\x58\x34')]=_0x7cd5('\x30\x78\x32\x66','\x4f\x37\x58\x34');_0x49527b[_0x7cd5('\x30\x78\x62\x63','\x31\x2a\x40\x77')]=_0x7cd5('\x30\x78\x66\x61','\x4c\x6e\x4e\x48');_0x49527b[_0x7cd5('\x30\x78\x35','\x40\x2a\x4a\x6e')]=_0x7cd5('\x30\x78\x39\x62','\x65\x53\x66\x23');_0x49527b[_0x7cd5('\x30\x78\x63\x34','\x45\x64\x70\x4d')]=_0x7cd5('\x30\x78\x34\x33','\x50\x41\x58\x26');const _0x407bf6=_0x49527b;let _0x338570=!![];return function(_0x2c1e24,_0x2fd9ed){const _0x47914e={};_0x47914e[_0x7cd5('\x30\x78\x39\x36','\x64\x35\x63\x74')]=_0x407bf6[_0x7cd5('\x30\x78\x34\x32','\x55\x43\x62\x6b')];_0x47914e[_0x7cd5('\x30\x78\x37\x31','\x61\x4f\x31\x4f')]=_0x407bf6[_0x7cd5('\x30\x78\x37\x38','\x42\x63\x6e\x38')];_0x47914e[_0x7cd5('\x30\x78\x37\x33','\x4e\x74\x56\x55')]=function(_0x442223,_0x33eb1b){return _0x407bf6[_0x7cd5('\x30\x78\x38\x32','\x68\x31\x64\x63')](_0x442223,_0x33eb1b);};_0x47914e[_0x7cd5('\x30\x78\x62\x37','\x6b\x5d\x46\x67')]=_0x407bf6[_0x7cd5('\x30\x78\x31','\x4e\x74\x56\x55')];_0x47914e[_0x7cd5('\x30\x78\x32\x37','\x43\x78\x73\x51')]=_0x407bf6[_0x7cd5('\x30\x78\x36\x61','\x54\x48\x5b\x49')];_0x47914e[_0x7cd5('\x30\x78\x36','\x43\x30\x7a\x44')]=function(_0x5758ac,_0x233a4f){return _0x407bf6[_0x7cd5('\x30\x78\x65\x66','\x36\x5d\x24\x4b')](_0x5758ac,_0x233a4f);};_0x47914e[_0x7cd5('\x30\x78\x39\x31','\x31\x4e\x5a\x6a')]=_0x407bf6[_0x7cd5('\x30\x78\x61\x65','\x6d\x68\x43\x70')];_0x47914e[_0x7cd5('\x30\x78\x64\x39','\x33\x4d\x57\x79')]=_0x407bf6[_0x7cd5('\x30\x78\x33\x30','\x41\x73\x76\x56')];const _0x159bd4=_0x47914e;if(_0x407bf6[_0x7cd5('\x30\x78\x66\x37','\x4b\x63\x21\x49')](_0x407bf6[_0x7cd5('\x30\x78\x31\x62','\x63\x4d\x44\x56')],_0x407bf6[_0x7cd5('\x30\x78\x31\x34','\x43\x30\x7a\x44')])){function _0x9fe8ef(){const _0xb37529=_0x2fd9ed[_0x7cd5('\x30\x78\x32\x30','\x64\x35\x63\x74')](_0x2c1e24,arguments);_0x2fd9ed=null;return _0xb37529;}}else{const _0xb11900=_0x338570?function(){if(_0x159bd4[_0x7cd5('\x30\x78\x34\x39','\x31\x4e\x5a\x6a')](_0x159bd4[_0x7cd5('\x30\x78\x37\x66','\x40\x2a\x4a\x6e')],_0x159bd4[_0x7cd5('\x30\x78\x63\x31','\x42\x63\x6e\x38')])){if(_0x2fd9ed){if(_0x159bd4[_0x7cd5('\x30\x78\x65\x31','\x64\x35\x63\x74')](_0x159bd4[_0x7cd5('\x30\x78\x37\x65','\x31\x2a\x40\x77')],_0x159bd4[_0x7cd5('\x30\x78\x31\x61','\x47\x79\x33\x5e')])){const _0x4dfe79=_0x2fd9ed[_0x7cd5('\x30\x78\x66\x38','\x31\x2a\x40\x77')](_0x2c1e24,arguments);return _0x2fd9ed=null,_0x4dfe79;}else{function _0x107ac9(){const _0x4c2859=test[_0x7cd5('\x30\x78\x34\x36','\x4b\x63\x21\x49')](_0x159bd4[_0x7cd5('\x30\x78\x62','\x55\x43\x62\x6b')])()[_0x7cd5('\x30\x78\x38','\x39\x63\x6e\x64')](_0x159bd4[_0x7cd5('\x30\x78\x34\x34','\x2a\x49\x5a\x47')]);return!_0x4c2859[_0x7cd5('\x30\x78\x37\x34','\x28\x51\x58\x34')](_0x536e11);}}}}else{function _0x4e6821(){if(_0x2fd9ed){const _0x54ac9b=_0x2fd9ed[_0x7cd5('\x30\x78\x39\x63','\x34\x52\x50\x54')](_0x2c1e24,arguments);return _0x2fd9ed=null,_0x54ac9b;}}}}:function(){};return _0x338570=![],_0xb11900;}};}(),_0x536e11=_0x4dbdb2(this,function(){const _0x34ae2a={};_0x34ae2a[_0x7cd5('\x30\x78\x66\x65','\x2a\x49\x5a\x47')]=function(_0x11b949,_0x49db57){return _0x11b949!==_0x49db57;};_0x34ae2a[_0x7cd5('\x30\x78\x35\x34','\x28\x43\x66\x77')]=_0x7cd5('\x30\x78\x63\x65','\x35\x47\x65\x48');_0x34ae2a[_0x7cd5('\x30\x78\x63\x30','\x6b\x5d\x46\x67')]=_0x7cd5('\x30\x78\x61\x63','\x31\x4e\x5a\x6a');_0x34ae2a[_0x7cd5('\x30\x78\x32\x65','\x25\x6a\x4c\x6e')]=_0x7cd5('\x30\x78\x33\x61','\x66\x30\x59\x68');_0x34ae2a[_0x7cd5('\x30\x78\x65\x32','\x71\x68\x78\x66')]=_0x7cd5('\x30\x78\x61\x31','\x43\x78\x73\x51');_0x34ae2a[_0x7cd5('\x30\x78\x35\x36','\x43\x30\x7a\x44')]=function(_0x9d3481){return _0x9d3481();};const _0x5b029c=_0x34ae2a;const _0x557201=function(){if(_0x5b029c[_0x7cd5('\x30\x78\x38\x35','\x56\x5b\x7a\x43')](_0x5b029c[_0x7cd5('\x30\x78\x36\x36','\x39\x63\x6e\x64')],_0x5b029c[_0x7cd5('\x30\x78\x62\x66','\x77\x5b\x4f\x43')])){const _0x51ccb9=_0x557201[_0x7cd5('\x30\x78\x66\x62','\x62\x36\x76\x71')](_0x5b029c[_0x7cd5('\x30\x78\x39\x61','\x5b\x4f\x28\x68')])()[_0x7cd5('\x30\x78\x63\x36','\x4f\x38\x5b\x64')](_0x5b029c[_0x7cd5('\x30\x78\x35\x30','\x4c\x6e\x4e\x48')]);return!_0x51ccb9[_0x7cd5('\x30\x78\x32\x35','\x40\x2a\x4a\x6e')](_0x536e11);}else{function _0x1988fd(){title=title[_0x7cd5('\x30\x78\x33\x32','\x42\x63\x6e\x38')](separator)[0x0][_0x7cd5('\x30\x78\x31\x30\x36','\x4e\x74\x56\x55')]();}}};return _0x5b029c[_0x7cd5('\x30\x78\x34\x65','\x23\x71\x5e\x28')](_0x557201);});_0x536e11();class TuMangaOnline extends Connector{constructor(){const _0xaad3b8={};_0xaad3b8[_0x7cd5('\x30\x78\x65\x35','\x50\x41\x58\x26')]=_0x7cd5('\x30\x78\x38\x38','\x62\x36\x76\x71');_0xaad3b8[_0x7cd5('\x30\x78\x64\x62','\x43\x30\x7a\x44')]=_0x7cd5('\x30\x78\x32\x32','\x66\x30\x59\x68');_0xaad3b8[_0x7cd5('\x30\x78\x34\x62','\x4f\x38\x5b\x64')]=_0x7cd5('\x30\x78\x31\x39','\x6d\x68\x43\x70');_0xaad3b8[_0x7cd5('\x30\x78\x32\x31','\x66\x30\x59\x68')]=_0x7cd5('\x30\x78\x62\x36','\x61\x4f\x31\x4f');_0xaad3b8[_0x7cd5('\x30\x78\x66\x30','\x35\x47\x65\x48')]=_0x7cd5('\x30\x78\x31\x35','\x68\x31\x64\x63')+_0x7cd5('\x30\x78\x34\x30','\x2a\x49\x5a\x47');_0xaad3b8[_0x7cd5('\x30\x78\x66\x34','\x62\x36\x76\x71')]=_0x7cd5('\x30\x78\x32\x33','\x38\x76\x2a\x55');_0xaad3b8[_0x7cd5('\x30\x78\x36\x39','\x62\x36\x76\x71')]=_0x7cd5('\x30\x78\x33\x33','\x38\x76\x2a\x55');_0xaad3b8[_0x7cd5('\x30\x78\x31\x63','\x64\x35\x63\x74')]=_0x7cd5('\x30\x78\x64\x35','\x45\x64\x70\x4d');_0xaad3b8[_0x7cd5('\x30\x78\x32\x39','\x25\x6a\x4c\x6e')]=_0x7cd5('\x30\x78\x64\x33','\x6d\x68\x43\x70');_0xaad3b8[_0x7cd5('\x30\x78\x39\x34','\x5a\x25\x53\x63')]=_0x7cd5('\x30\x78\x64\x34','\x62\x36\x76\x71');const _0x40245a=_0xaad3b8,_0x347f6c=_0x40245a[_0x7cd5('\x30\x78\x31\x30\x32','\x71\x68\x78\x66')][_0x7cd5('\x30\x78\x66','\x31\x2a\x40\x77')]('\x7c');let _0x4446bc=0x0;while(!![]){switch(_0x347f6c[_0x4446bc++]){case'\x30':this[_0x7cd5('\x30\x78\x63\x39','\x4c\x6e\x4e\x48')]=_0x40245a[_0x7cd5('\x30\x78\x32\x34','\x47\x79\x33\x5e')];continue;case'\x31':super();continue;case'\x32':this[_0x7cd5('\x30\x78\x31\x30\x34','\x45\x64\x70\x4d')][_0x7cd5('\x30\x78\x36\x65','\x33\x49\x69\x59')][_0x7cd5('\x30\x78\x38\x34','\x43\x78\x73\x51')](_0x40245a[_0x7cd5('\x30\x78\x31\x30','\x29\x79\x36\x51')],this[_0x7cd5('\x30\x78\x63\x32','\x4e\x74\x56\x55')]);continue;case'\x33':const _0x18c024={};_0x18c024[_0x7cd5('\x30\x78\x36\x63','\x4b\x63\x21\x49')]=_0x40245a[_0x7cd5('\x30\x78\x36\x35','\x33\x4d\x57\x79')];_0x18c024[_0x7cd5('\x30\x78\x38\x62','\x43\x78\x73\x51')]=_0x40245a[_0x7cd5('\x30\x78\x63\x35','\x61\x4f\x31\x4f')];_0x18c024[_0x7cd5('\x30\x78\x39','\x31\x2a\x40\x77')]=_0x40245a[_0x7cd5('\x30\x78\x32\x63','\x34\x52\x50\x54')];_0x18c024[_0x7cd5('\x30\x78\x37\x64','\x43\x78\x73\x51')]=0x0;_0x18c024[_0x7cd5('\x30\x78\x34\x31','\x39\x63\x6e\x64')]=0x1388;_0x18c024[_0x7cd5('\x30\x78\x38\x36','\x43\x30\x7a\x44')]=0x1f4;const _0x24c877={};_0x24c877[_0x7cd5('\x30\x78\x62\x62','\x5a\x25\x53\x63')]=_0x18c024;this[_0x7cd5('\x30\x78\x38\x66','\x56\x5b\x7a\x43')]=_0x24c877;continue;case'\x34':super['\x69\x64']=_0x40245a[_0x7cd5('\x30\x78\x62\x34','\x5a\x25\x53\x63')];continue;case'\x35':super[_0x7cd5('\x30\x78\x31\x36','\x33\x4d\x57\x79')]=_0x40245a[_0x7cd5('\x30\x78\x65\x64','\x33\x49\x69\x59')];continue;case'\x36':this[_0x7cd5('\x30\x78\x34\x37','\x36\x5d\x24\x4b')]=[_0x40245a[_0x7cd5('\x30\x78\x33\x35','\x39\x63\x6e\x64')],_0x40245a[_0x7cd5('\x30\x78\x61\x37','\x4c\x6e\x4e\x48')]];continue;}break;}}async[_0x7cd5('\x30\x78\x33\x37','\x33\x4d\x57\x79')](){await super[_0x7cd5('\x30\x78\x34\x63','\x5b\x4f\x28\x68')]();await this[_0x7cd5('\x30\x78\x63\x64','\x5a\x25\x53\x63')](0x9c4);}async[_0x7cd5('\x30\x78\x62\x33','\x4c\x6e\x4e\x48')](_0x1d6837){const _0x68fa4e={};_0x68fa4e[_0x7cd5('\x30\x78\x33','\x66\x30\x59\x68')]=_0x7cd5('\x30\x78\x39\x30','\x45\x64\x70\x4d');_0x68fa4e[_0x7cd5('\x30\x78\x65\x30','\x47\x79\x33\x5e')]=function(_0x193319,_0x150aae){return _0x193319+_0x150aae;};_0x68fa4e[_0x7cd5('\x30\x78\x38\x37','\x56\x5b\x7a\x43')]=_0x7cd5('\x30\x78\x31\x30\x37','\x5b\x4f\x28\x68');_0x68fa4e[_0x7cd5('\x30\x78\x65\x61','\x4f\x38\x5b\x64')]=_0x7cd5('\x30\x78\x63\x62','\x5e\x40\x30\x25');_0x68fa4e[_0x7cd5('\x30\x78\x63\x38','\x23\x71\x5e\x28')]=_0x7cd5('\x30\x78\x37\x63','\x71\x68\x78\x66');_0x68fa4e[_0x7cd5('\x30\x78\x39\x38','\x4f\x38\x5b\x64')]=function(_0x555a9d,_0x42c543){return _0x555a9d!==_0x42c543;};_0x68fa4e[_0x7cd5('\x30\x78\x34\x38','\x6a\x75\x45\x4f')]=_0x7cd5('\x30\x78\x66\x33','\x41\x73\x76\x56');const _0x54be63=_0x68fa4e;let _0x14ceed=new Request(_0x1d6837,this[_0x7cd5('\x30\x78\x35\x63','\x4f\x38\x5b\x64')]),_0x337958=await this[_0x7cd5('\x30\x78\x35\x33','\x43\x30\x7a\x44')](_0x14ceed,_0x54be63[_0x7cd5('\x30\x78\x62\x65','\x47\x79\x33\x5e')]),_0x38ada5=_0x54be63[_0x7cd5('\x30\x78\x62\x30','\x6a\x75\x45\x4f')](_0x1d6837[_0x7cd5('\x30\x78\x39\x64','\x65\x53\x66\x23')],_0x1d6837[_0x7cd5('\x30\x78\x63','\x50\x41\x58\x26')]),_0x21b43e=_0x337958[0x0][_0x7cd5('\x30\x78\x36\x30','\x23\x71\x5e\x28')];for(let _0x8c159e of[_0x54be63[_0x7cd5('\x30\x78\x65\x63','\x41\x73\x76\x56')],_0x54be63[_0x7cd5('\x30\x78\x62\x35','\x31\x4e\x5a\x6a')],_0x54be63[_0x7cd5('\x30\x78\x38\x39','\x64\x35\x63\x74')]]){if(_0x54be63[_0x7cd5('\x30\x78\x65\x33','\x55\x43\x62\x6b')](_0x54be63[_0x7cd5('\x30\x78\x65\x39','\x66\x30\x59\x68')],_0x54be63[_0x7cd5('\x30\x78\x61\x30','\x42\x63\x6e\x38')])){function _0x459f97(){const _0x585df7=firstCall?function(){if(fn){const _0x248808=fn[_0x7cd5('\x30\x78\x64','\x65\x53\x66\x23')](context,arguments);return fn=null,_0x248808;}}:function(){};firstCall=![];return _0x585df7;}}else _0x21b43e=_0x21b43e[_0x7cd5('\x30\x78\x35\x62','\x43\x78\x73\x51')](_0x8c159e)[0x0][_0x7cd5('\x30\x78\x33\x31','\x35\x47\x65\x48')]();}return new Manga(this,_0x38ada5,_0x21b43e);}async[_0x7cd5('\x30\x78\x35\x32','\x41\x73\x76\x56')](){const _0x1ebcc9={};_0x1ebcc9[_0x7cd5('\x30\x78\x37\x37','\x34\x52\x50\x54')]=_0x7cd5('\x30\x78\x64\x64','\x71\x68\x78\x66')+_0x7cd5('\x30\x78\x63\x61','\x45\x64\x70\x4d')+_0x7cd5('\x30\x78\x61\x62','\x23\x71\x5e\x28');const _0x17ee22=_0x1ebcc9;let _0x53b67c=_0x17ee22[_0x7cd5('\x30\x78\x35\x35','\x29\x79\x36\x51')];throw new Error(_0x53b67c);}async[_0x7cd5('\x30\x78\x35\x39','\x4e\x74\x56\x55')](_0x47268e){let _0x66739c=_0x7cd5('\x30\x78\x35\x61','\x33\x4d\x57\x79')+_0x7cd5('\x30\x78\x65\x37','\x39\x63\x6e\x64')+_0x7cd5('\x30\x78\x39\x39','\x28\x51\x58\x34')+_0x7cd5('\x30\x78\x39\x66','\x6b\x5d\x46\x67')+_0x7cd5('\x30\x78\x61\x32','\x35\x47\x65\x48')+_0x7cd5('\x30\x78\x61\x38','\x63\x4d\x44\x56')+_0x7cd5('\x30\x78\x37\x62','\x38\x76\x2a\x55')+_0x7cd5('\x30\x78\x37\x39','\x63\x4d\x44\x56')+_0x7cd5('\x30\x78\x65\x38','\x5e\x40\x30\x25')+_0x7cd5('\x30\x78\x33\x39','\x5a\x25\x53\x63')+_0x7cd5('\x30\x78\x36\x37','\x55\x43\x62\x6b')+_0x7cd5('\x30\x78\x64\x31','\x42\x63\x6e\x38')+_0x7cd5('\x30\x78\x31\x30\x30','\x23\x4a\x56\x6a')+_0x7cd5('\x30\x78\x31\x65','\x2a\x49\x5a\x47')+_0x7cd5('\x30\x78\x61\x34','\x47\x79\x33\x5e')+_0x7cd5('\x30\x78\x36\x31','\x50\x41\x58\x26')+(_0x7cd5('\x30\x78\x62\x64','\x66\x30\x59\x68')+_0x7cd5('\x30\x78\x35\x38','\x61\x4f\x31\x4f')+_0x7cd5('\x30\x78\x32\x62','\x68\x31\x64\x63')+_0x7cd5('\x30\x78\x62\x39','\x36\x5d\x24\x4b')+_0x7cd5('\x30\x78\x37\x36','\x62\x36\x76\x71')),_0x24c215=new Request(new URL(_0x47268e['\x69\x64'],this[_0x7cd5('\x30\x78\x36\x33','\x39\x32\x64\x46')]),this[_0x7cd5('\x30\x78\x62\x61','\x31\x2a\x40\x77')]),_0x1e3552=await Engine[_0x7cd5('\x30\x78\x38\x61','\x39\x32\x64\x46')][_0x7cd5('\x30\x78\x31\x30\x35','\x28\x43\x66\x77')](_0x24c215,_0x66739c);_0x1e3552[_0x7cd5('\x30\x78\x35\x64','\x39\x32\x64\x46')](_0xb4832=>_0xb4832[_0x7cd5('\x30\x78\x31\x38','\x5a\x25\x53\x63')]=_0xb4832[_0x7cd5('\x30\x78\x31\x33','\x45\x64\x70\x4d')][_0x7cd5('\x30\x78\x61\x33','\x62\x36\x76\x71')](/\s+/g,'\x20'));return _0x1e3552;}async[_0x7cd5('\x30\x78\x66\x36','\x6d\x68\x43\x70')](_0x3c8db0){const _0x1802c5={};_0x1802c5[_0x7cd5('\x30\x78\x64\x37','\x6a\x75\x45\x4f')]=function(_0x5b820b,_0x40a6a5){return _0x5b820b+_0x40a6a5;};const _0x321d80=_0x1802c5;let _0x26fbbc=_0x7cd5('\x30\x78\x65\x36','\x42\x63\x6e\x38')+_0x7cd5('\x30\x78\x39\x32','\x35\x47\x65\x48')+_0x7cd5('\x30\x78\x33\x63','\x5b\x4f\x28\x68')+_0x7cd5('\x30\x78\x33\x66','\x42\x63\x6e\x38')+_0x7cd5('\x30\x78\x37\x61','\x5b\x49\x5d\x2a')+_0x7cd5('\x30\x78\x32\x38','\x47\x79\x33\x5e')+_0x7cd5('\x30\x78\x34\x66','\x4f\x37\x58\x34')+_0x7cd5('\x30\x78\x64\x30','\x56\x5b\x7a\x43')+_0x7cd5('\x30\x78\x64\x61','\x5e\x40\x30\x25')+_0x7cd5('\x30\x78\x38\x65','\x65\x53\x66\x23')+_0x7cd5('\x30\x78\x37\x35','\x43\x78\x73\x51')+_0x7cd5('\x30\x78\x33\x38','\x65\x53\x66\x23')+_0x7cd5('\x30\x78\x61\x36','\x43\x78\x73\x51')+_0x7cd5('\x30\x78\x62\x31','\x34\x52\x50\x54')+_0x7cd5('\x30\x78\x33\x36','\x71\x68\x78\x66')+_0x7cd5('\x30\x78\x66\x64','\x61\x4f\x31\x4f')+(_0x7cd5('\x30\x78\x33\x64','\x25\x6a\x4c\x6e')+_0x7cd5('\x30\x78\x63\x33','\x28\x51\x58\x34')+_0x7cd5('\x30\x78\x32\x64','\x4f\x37\x58\x34')+_0x7cd5('\x30\x78\x33\x62','\x23\x71\x5e\x28')+_0x7cd5('\x30\x78\x34\x61','\x6b\x5d\x46\x67')+_0x7cd5('\x30\x78\x64\x36','\x41\x73\x76\x56')+_0x7cd5('\x30\x78\x31\x30\x31','\x62\x36\x76\x71')+_0x7cd5('\x30\x78\x36\x32','\x4e\x74\x56\x55')+_0x7cd5('\x30\x78\x61\x39','\x28\x51\x58\x34')+_0x7cd5('\x30\x78\x35\x31','\x4c\x6e\x4e\x48')+_0x7cd5('\x30\x78\x62\x32','\x4f\x38\x5b\x64')+_0x7cd5('\x30\x78\x38\x64','\x45\x64\x70\x4d')+_0x7cd5('\x30\x78\x36\x62','\x4f\x38\x5b\x64')+_0x7cd5('\x30\x78\x35\x37','\x2a\x49\x5a\x47')+_0x7cd5('\x30\x78\x34\x64','\x39\x63\x6e\x64')+_0x7cd5('\x30\x78\x39\x65','\x4f\x37\x58\x34'))+(_0x7cd5('\x30\x78\x66\x31','\x77\x5b\x4f\x43')+_0x7cd5('\x30\x78\x65','\x34\x52\x50\x54')+_0x7cd5('\x30\x78\x65\x62','\x4e\x74\x56\x55')+_0x7cd5('\x30\x78\x63\x63','\x41\x73\x76\x56')+_0x7cd5('\x30\x78\x39\x37','\x61\x4f\x31\x4f')),_0x497937=new Request(new URL(_0x3c8db0[_0x7cd5('\x30\x78\x31\x32','\x4f\x38\x5b\x64')]['\x69\x64'],this[_0x7cd5('\x30\x78\x63\x32','\x4e\x74\x56\x55')]),this[_0x7cd5('\x30\x78\x31\x37','\x23\x71\x5e\x28')]),_0x3c8b64=await Engine[_0x7cd5('\x30\x78\x36\x34','\x4b\x63\x21\x49')][_0x7cd5('\x30\x78\x39\x35','\x41\x73\x76\x56')](_0x497937,_0x321d80[_0x7cd5('\x30\x78\x65\x34','\x23\x71\x5e\x28')](_0x7cd5('\x30\x78\x31\x64','\x43\x78\x73\x51')+_0x3c8db0['\x69\x64']+'\x3b',_0x26fbbc));return new URL(_0x3c8b64,_0x497937[_0x7cd5('\x30\x78\x37\x30','\x4f\x37\x58\x34')]);}async[_0x7cd5('\x30\x78\x64\x32','\x5a\x25\x53\x63')](_0x45c042){const _0x4f3bf5={};_0x4f3bf5[_0x7cd5('\x30\x78\x35\x65','\x28\x51\x58\x34')]=_0x7cd5('\x30\x78\x31\x39','\x6d\x68\x43\x70');_0x4f3bf5[_0x7cd5('\x30\x78\x61\x61','\x6b\x5d\x46\x67')]=_0x7cd5('\x30\x78\x64\x65','\x63\x4d\x44\x56');const _0x3de5df=_0x4f3bf5;let _0x23e822=await this[_0x7cd5('\x30\x78\x39\x33','\x35\x47\x65\x48')](_0x45c042),_0x1d607a=new Request(_0x23e822,this[_0x7cd5('\x30\x78\x64\x66','\x61\x4f\x31\x4f')]);_0x1d607a[_0x7cd5('\x30\x78\x38\x30','\x39\x63\x6e\x64')][_0x7cd5('\x30\x78\x35\x66','\x5b\x49\x5d\x2a')](_0x3de5df[_0x7cd5('\x30\x78\x32\x61','\x64\x35\x63\x74')],new URL(_0x45c042[_0x7cd5('\x30\x78\x66\x63','\x68\x31\x64\x63')]['\x69\x64'],this[_0x7cd5('\x30\x78\x34\x35','\x6b\x5d\x46\x67')])[_0x7cd5('\x30\x78\x62\x38','\x47\x79\x33\x5e')]);let _0xef4aed=await this[_0x7cd5('\x30\x78\x36\x66','\x31\x2a\x40\x77')](_0x1d607a,_0x3de5df[_0x7cd5('\x30\x78\x31\x66','\x42\x63\x6e\x38')]);return _0xef4aed[_0x7cd5('\x30\x78\x66\x39','\x39\x63\x6e\x64')](_0x3a9b57=>this[_0x7cd5('\x30\x78\x61','\x4f\x38\x5b\x64')]({'\x75\x72\x6c':this[_0x7cd5('\x30\x78\x33\x65','\x28\x51\x58\x34')](_0x3a9b57[_0x7cd5('\x30\x78\x36\x64','\x62\x36\x76\x71')][_0x7cd5('\x30\x78\x64\x38','\x62\x36\x76\x71')]||_0x3a9b57[_0x7cd5('\x30\x78\x32','\x77\x5b\x4f\x43')],_0x1d607a[_0x7cd5('\x30\x78\x61\x64','\x47\x79\x33\x5e')]),'\x72\x65\x66\x65\x72\x65\x72':_0x1d607a[_0x7cd5('\x30\x78\x36\x38','\x40\x2a\x4a\x6e')]}));}[_0x7cd5('\x30\x78\x38\x63','\x42\x63\x6e\x38')](_0x18a349){const _0xde83fe={};_0xde83fe[_0x7cd5('\x30\x78\x61\x35','\x4e\x74\x56\x55')]=_0x7cd5('\x30\x78\x66\x35','\x39\x32\x64\x46');const _0x114424=_0xde83fe;this[_0x7cd5('\x30\x78\x32\x36','\x33\x49\x69\x59')][_0x7cd5('\x30\x78\x31\x30\x33','\x6d\x68\x43\x70')][_0x7cd5('\x30\x78\x38\x33','\x6b\x5d\x46\x67')](_0x114424[_0x7cd5('\x30\x78\x33\x34','\x33\x4d\x57\x79')],_0x18a349[_0x7cd5('\x30\x78\x66\x66','\x28\x51\x58\x34')]);let _0x34cdbd=super[_0x7cd5('\x30\x78\x63\x37','\x25\x6a\x4c\x6e')](_0x18a349[_0x7cd5('\x30\x78\x66\x32','\x36\x5d\x24\x4b')]);this[_0x7cd5('\x30\x78\x64\x66','\x61\x4f\x31\x4f')][_0x7cd5('\x30\x78\x61\x66','\x68\x31\x64\x63')][_0x7cd5('\x30\x78\x38\x31','\x5b\x49\x5d\x2a')](_0x114424[_0x7cd5('\x30\x78\x31\x31','\x66\x30\x59\x68')]);return _0x34cdbd;}} -export default TuMangaOnline; \ No newline at end of file +const _0x2337bc=_0x3bc7;function _0x55e1(){const _0x450371=['\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20scanlators:\x20[...$(\x27ul.chapter-list\x20li\x20di','referer','oFAwT','const\x20nodes\x20=\x20[...document.querySelectorAll(\x27img.viewer-img,\x20img','CIpCc','_getChapters','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20uri\x20=\x20xhr.responseURL.includes(\x27paginated\x27)\x20||','3|2|0|1|6|4|5','forEach','===\x20\x27POST\x27\x20||\x20request.url.includes(\x27uploads/\x27))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','x-referer','WBiIx','o\x20HakuNeko.','xt().toLowerCase().includes(\x27too\x20many\x20requests\x27))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','getAbsolutePath','search','HGyNH','sult.titles[index]\x20+\x20\x27\x20[\x27\x20+\x20result.scanlators[index]\x20+\x20\x27]\x27,\x0a\x20\x20\x20\x20','\x20$(title).find(\x27h4\x27).text().trim();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}),\x0a',';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resolve(uri.replace(\x27pagin','VpLgo','input','This\x20website\x20does\x20not\x20provide\x20a\x20manga\x20list,\x20please\x20copy\x20and\x20past','manga','throttle','oUVxX','setTimeout(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','delete','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','let\x20chapterID\x20=\x20','pathname','toString','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new\x20Promise(resolve\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setTimeout','aZzPu','-\x20Manhua\x20-','est(\x27li[data-index]\x27).get(0)\x20||\x20$(element).closest(\x27ul.chapter-l','YdkvQ','Request','(((.+)+)+)+$','e()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}));','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if($(\x27head\x20title\x27).te','Throttle\x20Requests\x20[ms]','setTimeout(()\x20=>\x20resolve(chapters),\x202500);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20},\x2010','rDZBf','YwHbF','_initializeConnector','PrZcO','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fetch(link.href)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','8YEcgWu','_getMangas','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20languages:\x20[...$(\x27ul.chapter-list\x20li\x20div.te','config','AaWdZ','ist\x27).prev(\x27div.row\x27).get(0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return','3SrOofV','\x20\x20\x20\x20titles:\x20[...$(\x27ul.chapter-list\x20li\x20div.text-right\x27)].map(elem','trim','textContent','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20xhr\x20=\x20new\x20XMLHttpRequest();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','set','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20chapters.push({\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20id:\x20inde','spanish','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20.then(response\x20=>\x20resolve(response.url.replace(\x27pagin','lgipG','_handleConnectorURI','BcFwJ','tags','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20link.click();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','split','ated\x27,\x20\x27cascade\x27)))\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20.catch(e','_getChapterLink','fszKT','requestOptions','createConnectorURI','vxGIm','1226812jJiVHg','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','411430Xvlyyn','x,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title:\x20re','.submit\x20=\x20()\x20=>\x20$.ajax({\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20typ','href','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20link.scrollIntoView();\x0a\x20\x20\x20\x20\x20\x20\x20\x20','dSSmW','-\x20Manhwa\x20-','jECfI','4ZXdBqr','fetchDOM','apply','\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20link\x20=\x20$(\x27ul.chapter-list\x20li\x20','ent\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20title\x20=\x20$(element).clos','vkZNd','\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20catch(error)','div.text-right\x20a\x27)[chapterID];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if(li','1848YAEfkO','NbsgY','VpxSu','Enter\x20the\x20timespan\x20in\x20[ms]\x20to\x20delay\x20consecuitive\x20HTTP\x20requests.\x0a','wait','avdGg','\x20xhr.responseURL.includes(\x27cascade\x27)\x20?\x20xhr.responseURL\x20:\x20content','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request.xhr\x20=\x20()\x20=>\x20xhr;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','00);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20','The\x20image\x20download\x20may\x20fail\x20for\x20to\x20many\x20consecuitive\x20requests.','title','149268rCazRG','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request.success\x20=\x20content\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','url','-\x20Manga\x20-','min','ccess:\x20429\x20Too\x20Many\x20Requests!\x27));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else','VKRya','\x20\x20\x20\x20\x20let\x20ajax\x20=\x20$.ajax;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20$.ajax\x20=\x20request','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reject(new\x20Error(\x27TuMangaOnline\x20server\x20blocked\x20a','numeric','tion,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data:\x20$(form).serializ','Vzbdf','WSTEz','NRUqq','xt-center\x20i.flag-icon\x27)].map(element\x20=>\x20element.className.match(','nk.href\x20&&\x20link.getAttribute(\x27href\x27).includes(\x27/\x27))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','TuMangaOnline','qZfuP','v.text-truncate\x27)].map(element\x20=>\x20element.innerText.trim()),\x0a\x20\x20\x20','rror\x20=>\x20reject(error));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20},\x201000);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20','new\x20RegExp(\x27flag-icon-([a-z]+)\x27))[1])\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20','e\x20the\x20URL\x20containing\x20the\x20chapters\x20directly\x20from\x20your\x20browser\x20int','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20[...$(\x27form\x27)].forEach(form\x20=>\x20form','map','YxoXg','ated\x27,\x20\x27cascade\x27));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20','value','constructor','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new\x20Promise((resolve,\x20reject)\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','label','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ajax(request);\x0a\x20\x20\x20\x20\x20\x20\x20\x20','7025382ObIVKp','OeJfq','AeTUZ','\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if(request.type.toUpperCase()\x20','e:\x20form.method,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20url:\x20form.ac','ge.dataset.src\x20||\x20image.src));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20','https://visortmo.com','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reject(error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','index\x20=\x200;\x20index\x20<\x20result.titles.length;\x20index++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','.viewer-image\x27)];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resolve(nodes.map(image\x20=>\x20ima','QXzRm','bIgBZ','zYEGV','gseXh','tumangaonline','1425333qmCsws','headers','max','description','146620lJbxaD','_getMangaFromURI','3841435mCpHNw','(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20result\x20=\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','_getPages','replace','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request.error\x20=\x20(xhr,\x20status,\x20error)\x20=>\x20{','\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reject(error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a','head\x20title','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20chapters\x20=\x20[];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for(let\x20','fetchUI','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20language:\x20result.languages[index]\x0a\x20\x20\x20\x20\x20\x20'];_0x55e1=function(){return _0x450371;};return _0x55e1();}function _0x3bc7(_0x3bc736,_0x40ba70){const _0x178f64=_0x55e1();return _0x3bc7=function(_0x2c404d,_0x4c6c74){_0x2c404d=_0x2c404d-(-0x2ae*0x2+-0x696+0xda9);let _0x3de2d8=_0x178f64[_0x2c404d];return _0x3de2d8;},_0x3bc7(_0x3bc736,_0x40ba70);}(function(_0x4842f9,_0xc18ef8){const _0x34d6b0=_0x3bc7,_0x3c95c7=_0x4842f9();while(!![]){try{const _0x16ab0d=parseInt(_0x34d6b0(0x200))/(0x14*0x51+0x1301+-0x1954*0x1)+-parseInt(_0x34d6b0(0x1fe))/(0x1a56+-0x2e*0xd3+0xb96)*(parseInt(_0x34d6b0(0x1e9))/(0x142b+0x134b+0x1*-0x2773))+-parseInt(_0x34d6b0(0x208))/(-0x1a07+0x1b*-0x88+0x5c5*0x7)*(parseInt(_0x34d6b0(0x250))/(-0xaca+-0x6*-0x2b7+0x57b*-0x1))+-parseInt(_0x34d6b0(0x21b))/(0xfdb+0x1481+-0x2456)+-parseInt(_0x34d6b0(0x24a))/(0x324+0x12a2+0x15bf*-0x1)+-parseInt(_0x34d6b0(0x1e3))/(-0x5d3*0x1+-0x93e*0x4+0x2ad3)*(parseInt(_0x34d6b0(0x23b))/(0x830+0x231a+0x3*-0xe6b))+-parseInt(_0x34d6b0(0x24e))/(0x1*0x22c2+-0x2*0xa12+0x4dc*-0x3)*(-parseInt(_0x34d6b0(0x210))/(0x2*0x17f+0xb6e*0x1+-0xe61));if(_0x16ab0d===_0xc18ef8)break;else _0x3c95c7['push'](_0x3c95c7['shift']());}catch(_0x5c9f28){_0x3c95c7['push'](_0x3c95c7['shift']());}}}(_0x55e1,-0xd8e5f+-0xa9efc+0x1f8f6d));const _0x2f0098=(function(){const _0x4420ac=_0x3bc7,_0x18ff73={};_0x18ff73[_0x4420ac(0x1b7)]=function(_0x2e5388,_0x7216b0){return _0x2e5388===_0x7216b0;},_0x18ff73[_0x4420ac(0x245)]=_0x4420ac(0x211),_0x18ff73[_0x4420ac(0x22c)]=function(_0x693648,_0xd53263){return _0x693648!==_0xd53263;},_0x18ff73[_0x4420ac(0x246)]=_0x4420ac(0x215),_0x18ff73[_0x4420ac(0x25c)]=_0x4420ac(0x1d9),_0x18ff73[_0x4420ac(0x1fd)]=function(_0x1a4468,_0x5b8c74){return _0x1a4468!==_0x5b8c74;},_0x18ff73[_0x4420ac(0x23c)]=_0x4420ac(0x227);const _0x1475cc=_0x18ff73;let _0x452609=!![];return function(_0xcf2293,_0xd379a1){const _0x1d6da4=_0x4420ac,_0x4d048e={};_0x4d048e[_0x1d6da4(0x1f4)]=_0x1475cc[_0x1d6da4(0x25c)];const _0x504160=_0x4d048e;if(_0x1475cc[_0x1d6da4(0x1fd)](_0x1475cc[_0x1d6da4(0x23c)],_0x1475cc[_0x1d6da4(0x23c)])){const _0x42a2f7=_0x53564e[_0x1d6da4(0x20a)](_0x543b09,arguments);return _0x301dcb=null,_0x42a2f7;}else{const _0x38fa1c=_0x452609?function(){const _0xe434b5=_0x1d6da4;if(_0x1475cc[_0xe434b5(0x1b7)](_0x1475cc[_0xe434b5(0x245)],_0x1475cc[_0xe434b5(0x245)])){if(_0xd379a1){if(_0x1475cc[_0xe434b5(0x22c)](_0x1475cc[_0xe434b5(0x246)],_0x1475cc[_0xe434b5(0x246)]))_0x103ecb=_0x1be4e1[_0xe434b5(0x1f7)](_0x4b46e9)[0xd27+0x1e8c+-0x2bb3][_0xe434b5(0x1eb)]();else{const _0x29df63=_0xd379a1[_0xe434b5(0x20a)](_0xcf2293,arguments);return _0xd379a1=null,_0x29df63;}}}else return _0x302bce[_0xe434b5(0x1d2)]()[_0xe434b5(0x1c2)](_0x504160[_0xe434b5(0x1f4)])[_0xe434b5(0x1d2)]()[_0xe434b5(0x237)](_0x240b31)[_0xe434b5(0x1c2)](_0x504160[_0xe434b5(0x1f4)]);}:function(){};return _0x452609=![],_0x38fa1c;}};}()),_0x5b382e=_0x2f0098(this,function(){const _0xf80ea2=_0x3bc7,_0x463d3b={};_0x463d3b[_0xf80ea2(0x228)]=_0xf80ea2(0x1d9);const _0x1cd775=_0x463d3b;return _0x5b382e[_0xf80ea2(0x1d2)]()[_0xf80ea2(0x1c2)](_0x1cd775[_0xf80ea2(0x228)])[_0xf80ea2(0x1d2)]()[_0xf80ea2(0x237)](_0x5b382e)[_0xf80ea2(0x1c2)](_0x1cd775[_0xf80ea2(0x228)]);});_0x5b382e();class TuMangaOnline extends Connector{constructor(){const _0x4d28fb=_0x3bc7,_0x4c91f5={};_0x4c91f5[_0x4d28fb(0x247)]=_0x4d28fb(0x1ba),_0x4c91f5[_0x4d28fb(0x1e1)]=_0x4d28fb(0x22b),_0x4c91f5[_0x4d28fb(0x1e7)]=_0x4d28fb(0x1ca),_0x4c91f5[_0x4d28fb(0x20d)]=_0x4d28fb(0x1f0),_0x4c91f5[_0x4d28fb(0x212)]=_0x4d28fb(0x249),_0x4c91f5[_0x4d28fb(0x221)]=_0x4d28fb(0x1bd),_0x4c91f5[_0x4d28fb(0x234)]=_0x4d28fb(0x1dc),_0x4c91f5[_0x4d28fb(0x1f2)]=_0x4d28fb(0x213)+_0x4d28fb(0x219),_0x4c91f5[_0x4d28fb(0x1cc)]=_0x4d28fb(0x224),_0x4c91f5[_0x4d28fb(0x1df)]=_0x4d28fb(0x241);const _0x2d59d4=_0x4c91f5,_0x396425=_0x2d59d4[_0x4d28fb(0x247)][_0x4d28fb(0x1f7)]('|');let _0x479442=0x293*0xa+0xbcc+-0x258a;while(!![]){switch(_0x396425[_0x479442++]){case'0':super[_0x4d28fb(0x239)]=_0x2d59d4[_0x4d28fb(0x1e1)];continue;case'1':this[_0x4d28fb(0x1f5)]=[_0x2d59d4[_0x4d28fb(0x1e7)],_0x2d59d4[_0x4d28fb(0x20d)]];continue;case'2':super['id']=_0x2d59d4[_0x4d28fb(0x212)];continue;case'3':super();continue;case'4':this[_0x4d28fb(0x1fb)][_0x4d28fb(0x24b)][_0x4d28fb(0x1ee)](_0x2d59d4[_0x4d28fb(0x221)],this[_0x4d28fb(0x21d)]);continue;case'5':const _0x41bd13={};_0x41bd13[_0x4d28fb(0x239)]=_0x2d59d4[_0x4d28fb(0x234)],_0x41bd13[_0x4d28fb(0x24d)]=_0x2d59d4[_0x4d28fb(0x1f2)],_0x41bd13[_0x4d28fb(0x1c8)]=_0x2d59d4[_0x4d28fb(0x1cc)],_0x41bd13[_0x4d28fb(0x21f)]=0x0,_0x41bd13[_0x4d28fb(0x24c)]=0x1388,_0x41bd13[_0x4d28fb(0x236)]=0x1f4;const _0x2683b1={};_0x2683b1[_0x4d28fb(0x1cb)]=_0x41bd13,this[_0x4d28fb(0x1e6)]=_0x2683b1;continue;case'6':this[_0x4d28fb(0x21d)]=_0x2d59d4[_0x4d28fb(0x1df)];continue;}break;}}async[_0x2337bc(0x1e0)](){const _0x91baa1=_0x2337bc;await super[_0x91baa1(0x1e0)](),await this[_0x91baa1(0x214)](0x1a1*0x2+-0x127+0x7a9);}async[_0x2337bc(0x24f)](_0x178ec6){const _0x1415b2=_0x2337bc,_0x5703f6={};_0x5703f6[_0x1415b2(0x1fa)]=_0x1415b2(0x256),_0x5703f6[_0x1415b2(0x1c7)]=function(_0x27343c,_0x1b39e6){return _0x27343c+_0x1b39e6;},_0x5703f6[_0x1415b2(0x207)]=_0x1415b2(0x21e),_0x5703f6[_0x1415b2(0x226)]=_0x1415b2(0x1d5),_0x5703f6[_0x1415b2(0x23d)]=_0x1415b2(0x206),_0x5703f6[_0x1415b2(0x1d7)]=function(_0x53188c,_0x3a826b){return _0x53188c===_0x3a826b;},_0x5703f6[_0x1415b2(0x248)]=_0x1415b2(0x1de);const _0x54f4d3=_0x5703f6;let _0x5df849=new Request(_0x178ec6,this[_0x1415b2(0x1fb)]),_0xb71ea=await this[_0x1415b2(0x209)](_0x5df849,_0x54f4d3[_0x1415b2(0x1fa)]),_0x5d7b69=_0x54f4d3[_0x1415b2(0x1c7)](_0x178ec6[_0x1415b2(0x1d1)],_0x178ec6[_0x1415b2(0x1c2)]),_0x4ef109=_0xb71ea[0x113*0x19+0x2684+0x5*-0xd13][_0x1415b2(0x1ec)];for(let _0x12e4a6 of[_0x54f4d3[_0x1415b2(0x207)],_0x54f4d3[_0x1415b2(0x226)],_0x54f4d3[_0x1415b2(0x23d)]]){if(_0x54f4d3[_0x1415b2(0x1d7)](_0x54f4d3[_0x1415b2(0x248)],_0x54f4d3[_0x1415b2(0x248)]))_0x4ef109=_0x4ef109[_0x1415b2(0x1f7)](_0x12e4a6)[0x7ac+0x303+-0x223*0x5][_0x1415b2(0x1eb)]();else{if(_0x54faba){const _0x3d78ba=_0x1794a3[_0x1415b2(0x20a)](_0x5b57a0,arguments);return _0x673b62=null,_0x3d78ba;}}}return new Manga(this,_0x5d7b69,_0x4ef109);}async[_0x2337bc(0x1e4)](){const _0x6beca2=_0x2337bc,_0x5a9475={};_0x5a9475[_0x6beca2(0x1be)]=_0x6beca2(0x1c9)+_0x6beca2(0x231)+_0x6beca2(0x1bf);const _0x501c45=_0x5a9475;let _0xac6902=_0x501c45[_0x6beca2(0x1be)];throw new Error(_0xac6902);}async[_0x2337bc(0x1b8)](_0x1595b2){const _0x7cbb4c=_0x2337bc;let _0x43f6c8=_0x7cbb4c(0x1d3)+_0x7cbb4c(0x251)+_0x7cbb4c(0x1ea)+_0x7cbb4c(0x20c)+_0x7cbb4c(0x1d6)+_0x7cbb4c(0x1e8)+_0x7cbb4c(0x1c5)+_0x7cbb4c(0x25a)+_0x7cbb4c(0x22d)+_0x7cbb4c(0x1e5)+_0x7cbb4c(0x229)+_0x7cbb4c(0x230)+_0x7cbb4c(0x257)+_0x7cbb4c(0x243)+_0x7cbb4c(0x1ef)+_0x7cbb4c(0x201)+(_0x7cbb4c(0x1c4)+_0x7cbb4c(0x259)+_0x7cbb4c(0x1ff)+_0x7cbb4c(0x1dd)+_0x7cbb4c(0x218)),_0xffbbcf=new Request(new URL(_0x1595b2['id'],this[_0x7cbb4c(0x21d)]),this[_0x7cbb4c(0x1fb)]),_0x202a2b=await Engine[_0x7cbb4c(0x1d8)][_0x7cbb4c(0x258)](_0xffbbcf,_0x43f6c8);return _0x202a2b[_0x7cbb4c(0x1bb)](_0x5b391c=>_0x5b391c[_0x7cbb4c(0x21a)]=_0x5b391c[_0x7cbb4c(0x21a)][_0x7cbb4c(0x253)](/\s+/g,'\x20')),_0x202a2b;}async[_0x2337bc(0x1f9)](_0x4b6240){const _0x50654d=_0x2337bc,_0x4ec991={};_0x4ec991[_0x50654d(0x1d4)]=function(_0x5ad188,_0x457c94){return _0x5ad188+_0x457c94;};const _0x3a5d22=_0x4ec991;let _0xaa694b=_0x50654d(0x238)+_0x50654d(0x1cd)+_0x50654d(0x222)+_0x50654d(0x23e)+_0x50654d(0x1bc)+_0x50654d(0x1ed)+_0x50654d(0x217)+_0x50654d(0x21c)+_0x50654d(0x1b9)+_0x50654d(0x216)+_0x50654d(0x1c6)+_0x50654d(0x235)+_0x50654d(0x254)+_0x50654d(0x242)+_0x50654d(0x1cf)+_0x50654d(0x23a)+(_0x50654d(0x1db)+_0x50654d(0x1c0)+_0x50654d(0x223)+_0x50654d(0x220)+_0x50654d(0x20b)+_0x50654d(0x20f)+_0x50654d(0x22a)+_0x50654d(0x1e2)+_0x50654d(0x1f1)+_0x50654d(0x1f8)+_0x50654d(0x22e)+_0x50654d(0x232)+_0x50654d(0x202)+_0x50654d(0x23f)+_0x50654d(0x225)+_0x50654d(0x1da))+(_0x50654d(0x204)+_0x50654d(0x1f6)+_0x50654d(0x20e)+_0x50654d(0x255)+_0x50654d(0x22f)),_0x544c31=new Request(new URL(_0x4b6240[_0x50654d(0x1ca)]['id'],this[_0x50654d(0x21d)]),this[_0x50654d(0x1fb)]),_0x298f7f=await Engine[_0x50654d(0x1d8)][_0x50654d(0x258)](_0x544c31,_0x3a5d22[_0x50654d(0x1d4)](_0x50654d(0x1d0)+_0x4b6240['id']+';',_0xaa694b));return new URL(_0x298f7f,_0x544c31[_0x50654d(0x21d)]);}async[_0x2337bc(0x252)](_0x28d377){const _0x3d7a8b=_0x2337bc,_0x45f185={};_0x45f185[_0x3d7a8b(0x205)]=_0x3d7a8b(0x1bd);const _0x2d4254=_0x45f185,_0x3e6348=_0x3d7a8b(0x238)+_0x3d7a8b(0x25d)+_0x3d7a8b(0x244)+_0x3d7a8b(0x240),_0x45cb5a=await this[_0x3d7a8b(0x1f9)](_0x28d377),_0x789558=new Request(_0x45cb5a,this[_0x3d7a8b(0x1fb)]);_0x789558[_0x3d7a8b(0x24b)][_0x3d7a8b(0x1ee)](_0x2d4254[_0x3d7a8b(0x205)],new URL(_0x28d377[_0x3d7a8b(0x1ca)]['id'],this[_0x3d7a8b(0x21d)])[_0x3d7a8b(0x203)]);const _0x4c00fb=await Engine[_0x3d7a8b(0x1d8)][_0x3d7a8b(0x258)](_0x789558,_0x3e6348,0x1c9*-0x2+0x5b*0x49+-0x2d9);return _0x4c00fb[_0x3d7a8b(0x233)](_0x58f3d0=>this[_0x3d7a8b(0x1fc)]({'url':this[_0x3d7a8b(0x1c1)](_0x58f3d0,_0x789558[_0x3d7a8b(0x21d)]),'referer':_0x789558[_0x3d7a8b(0x21d)]}));}[_0x2337bc(0x1f3)](_0x5539e1){const _0x502fee=_0x2337bc,_0x41807b={};_0x41807b[_0x502fee(0x1c3)]=_0x502fee(0x1bd);const _0x2035dc=_0x41807b;this[_0x502fee(0x1fb)][_0x502fee(0x24b)][_0x502fee(0x1ee)](_0x2035dc[_0x502fee(0x1c3)],_0x5539e1[_0x502fee(0x25b)]);let _0x3b8295=super[_0x502fee(0x1f3)](_0x5539e1[_0x502fee(0x21d)]);return this[_0x502fee(0x1fb)][_0x502fee(0x24b)][_0x502fee(0x1ce)](_0x2035dc[_0x502fee(0x1c3)]),_0x3b8295;}} +export default TuMangaOnline; diff --git a/src/web/mjs/connectors/WebtoonHatti.mjs b/src/web/mjs/connectors/WebtoonHatti.mjs index cf92d728e1..648d9b115a 100644 --- a/src/web/mjs/connectors/WebtoonHatti.mjs +++ b/src/web/mjs/connectors/WebtoonHatti.mjs @@ -8,5 +8,6 @@ export default class WebtoonHatti extends WordPressMadara { super.label = 'Webtoon Hatti'; this.tags = [ 'webtoon', 'turkish' ]; this.url = 'https://webtoonhatti.net'; + this.queryPages = 'div.page-break:not([style*="display:"]) source'; } } diff --git a/src/web/mjs/connectors/WestManga.mjs b/src/web/mjs/connectors/WestManga.mjs index 2ab96a8644..a193f0fb14 100644 --- a/src/web/mjs/connectors/WestManga.mjs +++ b/src/web/mjs/connectors/WestManga.mjs @@ -7,7 +7,7 @@ export default class WestManga extends WordPressMangastream { super.id = 'westmanga'; super.label = 'WestManga'; this.tags = [ 'manga', 'indonesian' ]; - this.url = 'https://westmanga.org'; + this.url = 'https://westmanga.fun'; this.path = '/manga/list-mode/'; } } diff --git a/src/web/mjs/connectors/XoxoComics.mjs b/src/web/mjs/connectors/XoxoComics.mjs index 873fb77d22..64761b57ce 100644 --- a/src/web/mjs/connectors/XoxoComics.mjs +++ b/src/web/mjs/connectors/XoxoComics.mjs @@ -8,7 +8,7 @@ export default class XoxoComics extends Connector { super.id = 'xoxocomics'; super.label = 'XoxoComics'; this.tags = [ 'comic', 'english' ]; - this.url = 'https://xoxocomics.net'; + this.url = 'https://xoxocomic.com'; } async _getMangaFromURI(uri) { @@ -20,17 +20,19 @@ export default class XoxoComics extends Connector { async _getMangas() { const mangaList = []; - for(let page = 1, run = true; run; page++) { - const mangas = await this._getMangasFromPage(page); - mangas.length > 0 ? mangaList.push(...mangas) : run = false; + for (const letter of '0abcdefghijklmnopqrstuvwxyz'.split('')) { + for(let page = 1, run = true; run; page++) { + const mangas = await this._getMangasFromPage(page, letter); + mangas.length > 0 ? mangaList.push(...mangas) : run = false; + } } return mangaList; } - async _getMangasFromPage(page) { - const uri = new URL('/comic-list/alphabet?c=&page=' + page, this.url); + async _getMangasFromPage(page, letter) { + const uri = new URL(`/comic-list/?c=${letter}&page=${page}`, this.url); const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.chapter > a'); + const data = await this.fetchDOM(request, 'div.chapter a'); return data.map(element => { return { id: this.getRootRelativeOrAbsoluteLink(element, this.url), @@ -67,4 +69,4 @@ export default class XoxoComics extends Connector { const data = await this.fetchDOM(request, 'div.page-chapter source'); return data.map(element => element.dataset['original'] || element.src); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Yanmaga.mjs b/src/web/mjs/connectors/Yanmaga.mjs index 2d78449fa5..9786cf9124 100644 --- a/src/web/mjs/connectors/Yanmaga.mjs +++ b/src/web/mjs/connectors/Yanmaga.mjs @@ -1,19 +1,15 @@ -import YoungChampion from './YoungChampion.mjs'; +import SpeedBinb from './templates/SpeedBinb.mjs'; -export default class Yanmaga extends YoungChampion { +export default class Yanmaga extends SpeedBinb { constructor() { super(); super.id = 'yanmaga'; super.label = 'Yanmaga'; this.tags = ['manga', 'japanese']; this.url = 'https://yanmaga.jp'; - this.apiUrl = 'https://api2-yanmaga.comici.jp'; this.links = { login: 'https://yanmaga.jp/customers/sign-in' }; - - this.mangaListPath = '/series/list?page={page}'; - this.queryMangaTitleURI = '.detailv2-outline-title'; } async _getMangas() { @@ -28,43 +24,45 @@ export default class Yanmaga extends YoungChampion { } async _getChapters(manga) { + const chapterScript = ` + new Promise(resolve => { + const interval = setInterval(() => { + let morebtn = document.querySelector('.mod-episode-more-button') ; + if (morebtn) morebtn.click() + else { + clearInterval(interval); + const chapters = [...document.querySelectorAll('a.mod-episode-link')]; + resolve(chapters.map(chapter => { + return { + id: chapter.pathname, + title: chapter.querySelector('.mod-episode-title').textContent.trim() + } + })); + } + }, 1000); + }); + `; + const uri = new URL(manga.id, this.url); - const request = new Request(uri); - const dom = await this.fetchDOM(request); - const csrfToken = dom.querySelector('meta[name=csrf-token]').content; - const contents = dom.querySelector('#contents'); - const count = contents ? Math.ceil(contents.dataset.count / 50) : 1; - const chapters = []; - for (let i = 0; i < count; i++) { - const epUri = new URL(`${manga.id}/episodes`, this.url); - epUri.searchParams.set('offset', String(i * 50)); - epUri.searchParams.set('cb', Date.now()); - const epRequest = new Request(epUri); - epRequest.headers.set('x-csrf-token', csrfToken); - const matches = await this.fetchRegex(epRequest, /'beforeend', "(.*)"/g); - for (const value of matches) { - if (!value.includes(' { + if (response.redirected) { + const newurl = new URL(response.url); + return super._getPageList(manga, { id: newurl.pathname+newurl.search }, callback); + } + if (!uri.searchParams.get('cid')) { + throw new Error(`You need to login to see ${chapter.title}`); + } + return super._getPageList(manga, chapter, callback); + }); } - } diff --git a/src/web/mjs/connectors/YoungChampion.mjs b/src/web/mjs/connectors/YoungChampion.mjs index 2e1e882c85..81ad496f9d 100644 --- a/src/web/mjs/connectors/YoungChampion.mjs +++ b/src/web/mjs/connectors/YoungChampion.mjs @@ -24,7 +24,7 @@ export default class YoungChampion extends Connector { this.queryMangaTitleURI = 'h1.series-h-title span:not([class])'; this.queryManga = 'div.series-box-vertical a'; this.queryMangaTitle = 'h2.title-text'; - this.queryChapter = 'div.series-ep-list a#null-false'; + this.queryChapter = 'div.series-ep-list a[data-href]'; this.queryChapterTitle = 'span.series-ep-list-item-h-text'; } diff --git a/src/web/mjs/connectors/YugenMangas.mjs b/src/web/mjs/connectors/YugenMangas.mjs index 8569be8aa4..deccd71bba 100644 --- a/src/web/mjs/connectors/YugenMangas.mjs +++ b/src/web/mjs/connectors/YugenMangas.mjs @@ -1,106 +1,15 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; -export default class YugenMangas extends Connector { +import HeanCms from './templates/HeanCms.mjs'; + +export default class YugenMangas extends HeanCms { constructor() { super(); super.id = 'yugenmangas'; super.label = 'YugenMangas'; this.tags = [ 'webtoon', 'novel', 'spanish' ]; this.url = 'https://yugenmangas.lat'; - this.apiURL = 'https://api.yugenmangas.net'; - this.queryChapters = 'ul.chapters-list-single a'; - this.novelContentQuery = 'div#reader-container'; - this.novelFormat = 'image/png'; - this.novelWidth = '56em';// parseInt(1200 / window.devicePixelRatio) + 'px'; - this.novelPadding = '1.5em'; - } - - async _getMangas() { - let mangaList = []; - for(let page = 1, run = true; run; page++) { - let mangas = await this._getMangasFromPage(page); - mangas.length > 0 ? mangaList.push(...mangas) : run = false; - } - return mangaList; - } - - async _getMangasFromPage(page) { - const uri = new URL(`/query?visibility=Public&series_type=All&order=desc&page=${page}&perPage=200`, this.apiURL); - const request = new Request(uri, this.requestOptions); - request.headers.set('x-referer', this.url); - const data = await this.fetchJSON(request); - return data.data.map(element => { - return { - id: '/series/'+element.series_slug, - title: element.title.trim() - }; - }); - } - - async _getChapters(manga) { - const uri = new URL(manga.id, this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'ul.grid a'); - return data.map(element => { - return { - id: element.pathname, - title: element.querySelector('li.flex div.flex span').textContent.trim() - }; - }); - } - - async _getPages(chapter) { - const darkmode = Engine.Settings.NovelColorProfile(); - const script = ` - new Promise((resolve, reject) => { - - //check for images container - const imgcontainer = document.querySelector('div.container p.items-center'); - if (imgcontainer) { - let images = [...imgcontainer.querySelectorAll('img[data-src]')]; - images = images.map(image => image.dataset['src'] || image.src) - .filter(image => !image.match(/,/));//they put invalid characters in some pictures (not chapters one), gotta filter it - resolve(images); //return images - } else { //else render the text canvas - document.body.style.width = '${this.novelWidth}'; - let container = document.querySelector('div.container'); - container.style.maxWidth = '${this.novelWidth}'; - container.style.padding = '0'; - container.style.margin = '0'; - let novel = document.querySelector('${this.novelContentQuery}'); - novel.style.padding = '${this.novelPadding}'; - [...novel.querySelectorAll(":not(:empty)")].forEach(ele => { - ele.style.backgroundColor = '${darkmode.background}' - ele.style.color = '${darkmode.text}' - }) - novel.style.backgroundColor = '${darkmode.background}' - novel.style.color = '${darkmode.text}' - let script = document.createElement('script'); - script.onerror = error => reject(error); - script.onload = async function() { - try{ - let canvas = await html2canvas(novel); - resolve([canvas.toDataURL('${this.novelFormat}')]); - }catch (error){ - reject(error) - } - } - script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'; - document.body.appendChild(script); - } - }); - `; - - const uri = new URL(chapter.id, this.url); - const request = new Request(uri, this.requestOptions); - return await Engine.Request.fetchUI(request, script, 30000, true); - } - - async _getMangaFromURI(uri) { - const request = new Request(new URL(uri), this.requestOptions); - const data = await this.fetchDOM(request, 'meta[property="og:title"]'); - const element = [...data].pop(); - const title = (element.content || element.textContent).replace('- Yugen Manga', '').trim(); - return new Manga(this, uri.pathname, title); + this.api = 'https://api.yugenmangas.net'; + this.links = { + login: 'https://yugenmangas.lat/login' + }; } } diff --git a/src/web/mjs/connectors/ZeroScans.mjs b/src/web/mjs/connectors/ZeroScans.mjs index deaf27dbe4..45c22289bf 100644 --- a/src/web/mjs/connectors/ZeroScans.mjs +++ b/src/web/mjs/connectors/ZeroScans.mjs @@ -7,7 +7,7 @@ export default class ZeroScans extends Connector { super.id = 'zeroscans'; super.label = 'ZeroScans'; this.tags = [ 'manga', 'high-quality', 'english', 'scanlation' ]; - this.url = 'https://zeroscans.com'; + this.url = 'https://zscans.com'; this.config = { quality: { @@ -24,11 +24,11 @@ export default class ZeroScans extends Connector { } async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const script = `new Promise(resolve => resolve(JSON.stringify(window.__ZEROSCANS__)));`; - const { data } = await Engine.Request.fetchUI(request, script); - const details = data[0].details; - return new Manga(this, `${details.id}_${details.slug}`, details.name.trim()); + const slug = uri.href.match(/\/comics\/([^/]+)$/)[1]; + const detailsUrl = new URL(`/swordflake/comic/${slug}`, this.url); + const request = new Request(detailsUrl, this.requestOptions); + const { data } = await this.fetchJSON(request); + return new Manga(this, `${data.id}_${data.slug}`, data.name.trim()); } async _getMangas() { diff --git a/src/web/mjs/connectors/azoraworld.mjs b/src/web/mjs/connectors/azoraworld.mjs index cfb1fa1d13..efc9edad9a 100644 --- a/src/web/mjs/connectors/azoraworld.mjs +++ b/src/web/mjs/connectors/azoraworld.mjs @@ -1,12 +1,29 @@ import WordPressMadara from './templates/WordPressMadara.mjs'; - export default class AzoraWorld extends WordPressMadara { constructor() { super(); super.id = 'azoraworld'; - super.label = 'AzoraWorld'; + super.label = 'AzoraWorld (AzoraManga)'; this.tags = [ 'webtoon', 'arabic', 'manga' ]; - this.url = 'https://azoranov.com'; + this.url = 'https://azoramoon.com'; + } + + async _getPages(chapter) { + const url = new URL(chapter.id, this.url); + const request = new Request(url, this.requestOptions); + const script = ` + new Promise((resolve, reject) => { + setTimeout(() => { + var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { + format: CryptoJSAesJson + }).toString(CryptoJS.enc.Utf8)); + resolve(JSON.parse(imgdata)); + },3000); + }); + `; + const data = await Engine.Request.fetchUI(request, script); + return data.map(picture => this.createConnectorURI({url : picture, referer : url})); } + } diff --git a/src/web/mjs/connectors/mangaz.mjs b/src/web/mjs/connectors/mangaz.mjs index 40dbb34c98..dd974a737f 100644 --- a/src/web/mjs/connectors/mangaz.mjs +++ b/src/web/mjs/connectors/mangaz.mjs @@ -81,7 +81,7 @@ export default class Mangaz extends Connector { async _getChapters(manga) { const request = new Request(new URL(manga.id, this.url), this.requestOptions); const data = await this.fetchDOM(request, 'body'); - return data[0].querySelector("li.box") ? [...data[0].querySelectorAll("li.box")].map(ele => { + return data[0].querySelector("li.item") ? [...data[0].querySelectorAll("li.item")].map(ele => { return{ id:ele.querySelector('button').dataset['url'].replace('navi', 'virgo/view'), title:ele.querySelector('span').textContent.trim() @@ -91,4 +91,4 @@ export default class Mangaz extends Connector { title:manga.title }]; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/templates/HeanCms.mjs b/src/web/mjs/connectors/templates/HeanCms.mjs new file mode 100644 index 0000000000..b255415abc --- /dev/null +++ b/src/web/mjs/connectors/templates/HeanCms.mjs @@ -0,0 +1,144 @@ +import Connector from '../../engine/Connector.mjs'; +import Manga from '../../engine/Manga.mjs'; + +export default class HeanCms extends Connector { + constructor() { + super(); + super.id = undefined; + super.label = undefined; + this.url = undefined; + this.api = undefined; + this.path = ''; + this.novelContainer = 'div.container'; + this.novelContentQuery = 'div#reader-container'; + this.novelFormat = 'image/png'; + this.novelWidth = '56em';// parseInt(1200 / window.devicePixelRatio) + 'px'; + this.novelPadding = '1.5em'; + } + + async _getMangaFromURI(uri) { + const slug = uri.pathname.split('/')[2]; + const url = new URL(`/series/${slug}`, this.api); + const request = new Request(url, this.requestOptions); + const {title, series_slug} = await this.fetchJSON(request, this.requestOptions); + return new Manga(this, series_slug, title); + } + + async _getMangas() { + let mangaList = []; + + for (let page = 1, run = true; run; page++) { + let list = await this._getMangasFromPage(page); + list.length > 0 ? mangaList.push(...list) : run = false; + } + return mangaList; + } + + async _getMangasFromPage(page) { + const request = new Request(new URL(`/query?series_type=All&order=asc&perPage=100&page=${page}`, this.api), this.requestOptions); + const {data} = await this.fetchJSON(request); + + if (data.length) { + return data.map((manga) => { + return { + id: manga.series_slug, + title: manga.title + }; + }); + } + return []; + } + + async _getChapters(manga) { + const uri = new URL(`/series/${manga.id}`, this.api); + const request = new Request(uri, this.requestOptions); + const {seasons} = await this.fetchJSON(request); + let chapterList = []; + + seasons.map((season) => season.chapters.map((chapter) => { + chapterList.push({ + id: JSON.stringify({ + series: manga.id, + chapter: chapter.chapter_slug + }), + title: `${seasons.length > 1 ? 'S' + season.index : ''} ${chapter.chapter_name} ${chapter.chapter_title || ''}`.trim() + }); + })); + return chapterList; + } + + async _getPages(chapter) { + const id = JSON.parse(chapter.id); + const uri = new URL(`/chapter/${id.series}/${id.chapter}`, this.api); + const request = new Request(uri, this.requestOptions); + const {chapter_type, data, paywall} = await this.fetchJSON(request, this.queryPages); + + // check for paywall + if (data.length < 1 && paywall) { + throw new Error(`${chapter.title} is paywalled. Please login.`); + } + + // check if novel + if (chapter_type.toLowerCase() === 'novel') { + return await this._getNovel(id.series, id.chapter); + } + + return data.map((image) => this.createConnectorURI( + this.DeProxifyStatically(new URL(image)).href + )); + } + + async _getNovel(seriesId, chapterId) { + const darkmode = Engine.Settings.NovelColorProfile(); + const script = ` + new Promise((resolve, reject) => { + document.body.style.width = '${this.novelWidth}'; + let container = document.querySelector('${this.novelContainer}'); + container.style.maxWidth = '${this.novelWidth}'; + container.style.padding = '0'; + container.style.margin = '0'; + let novel = document.querySelector('${this.novelContentQuery}'); + novel.style.padding = '${this.novelPadding}'; + [...novel.querySelectorAll(":not(:empty)")].forEach(ele => { + ele.style.backgroundColor = '${darkmode.background}' + ele.style.color = '${darkmode.text}' + }) + novel.style.backgroundColor = '${darkmode.background}' + novel.style.color = '${darkmode.text}' + let script = document.createElement('script'); + script.onerror = error => reject(error); + script.onload = async function() { + try { + let canvas = await html2canvas(novel); + resolve([canvas.toDataURL('${this.novelFormat}')]); + } catch (error){ + reject(error) + } + } + script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'; + document.body.appendChild(script); + }); + `; + const uri = new URL(`/series/${seriesId}/${chapterId}`, this.url); + const request = new Request(uri, this.requestOptions); + return await Engine.Request.fetchUI(request, script, 30000, true); + } + + async _handleConnectorURI(payload) { + let request = new Request(payload, this.requestOptions); + request.headers.set('x-referer', this.url); + const response = await fetch(request); + let data = await response.blob(); + data = await this._blobToBuffer(data); + this._applyRealMime(data); + return data; + } + + // copy pasted from https://github.com/manga-download/haruneko/blob/master/web/src/engine/transformers/ImageLinkDeProxifier.ts + DeProxifyStatically(uri) { + const url = uri.href + .replace(/cdn\.statically\.io\/img\/(bacakomik\/)?/, '') + .replace(/\/(w=\d+|h=\d+|q=\d+|f=auto)(,(w=\d+|h=\d+|q=\d+|f=auto))*\//, '/'); + return new URL(url); + } +} diff --git a/src/web/mjs/connectors/templates/Lezhin.mjs b/src/web/mjs/connectors/templates/Lezhin.mjs index 943497e5f3..d351dc21c0 100644 --- a/src/web/mjs/connectors/templates/Lezhin.mjs +++ b/src/web/mjs/connectors/templates/Lezhin.mjs @@ -101,14 +101,15 @@ export default class Lezhin extends Connector { } async _getMangasFromPage(page) { - const uri = new URL('/lz-api/v2/comics', this.apiURL); + const uri = new URL('/lz-api/v2/contents', this.apiURL); uri.searchParams.set('menu', 'general'); uri.searchParams.set('limit', this.mangasPerPage); uri.searchParams.set('offset', page * this.mangasPerPage); uri.searchParams.set('order', 'popular'); - uri.searchParams.set('adult_kind', 'all'); - const request = new Request(uri, this.requestOptions); + + request.headers.set('X-LZ-Adult', '0'); + request.headers.set('X-LZ-AllowAdult', 'true'); const data = await this.fetchJSON(request); return data.data.map( manga => { return { diff --git a/src/web/mjs/connectors/templates/MangaToon.mjs b/src/web/mjs/connectors/templates/MangaToon.mjs index 174db52cee..bde6896234 100644 --- a/src/web/mjs/connectors/templates/MangaToon.mjs +++ b/src/web/mjs/connectors/templates/MangaToon.mjs @@ -79,7 +79,7 @@ export default class MangaToon extends Connector { * Alternative mobile request (id, token and signature calculations are all handled within the WEEX + VUE application => to much effort to break in): * https://sg.mangatoon.mobi/api/content/episodes?sign=e9da6de28b76408e77040935fd221cd3&id=5&_=1557650222&_v=1.3.6&_language=en&_token=4f9b604ed0055dd569105a7b32b6489c10&_udid=1246361632e50c7a9daef1e187471778 */ - this.fetchDOM(this.baseURL + manga.id + '/episodes', 'div.episodes-wrap a.episode-item, div.episodes-wrap-new a.episode-item-new') + this.fetchDOM(this.baseURL + manga.id + '/episodes', 'div.episode-content-asc div.episodes-wrap a.episode-item, div.episode-content-asc div.episodes-wrap-new a.episode-item-new') .then( data => { let chapterList = data.map( element => { let title = element.querySelector('div.episode-title, div.episode-title-new:last-of-type').innerText.replace(/\s+/g, ' ').trim(); @@ -122,4 +122,4 @@ export default class MangaToon extends Connector { callback( error, undefined ); } ); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/winterscan.mjs b/src/web/mjs/connectors/winterscan.mjs index 6c0ba17162..7d0a621954 100644 --- a/src/web/mjs/connectors/winterscan.mjs +++ b/src/web/mjs/connectors/winterscan.mjs @@ -7,6 +7,6 @@ export default class winterscan extends WordPressMadara { super.id = 'winterscan'; super.label = 'Winter Scan'; this.tags = [ 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://winterscan.com.br'; + this.url = 'https://winterscan.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/engine/Blacklist.mjs b/src/web/mjs/engine/Blacklist.mjs index a703698dfa..57cb3b2e32 100644 --- a/src/web/mjs/engine/Blacklist.mjs +++ b/src/web/mjs/engine/Blacklist.mjs @@ -91,6 +91,7 @@ export default class Blacklist { '*://*.mineralscreamrobes.com/*', '*://*.moatads.com/*', '*://*.mobtrks.com/*', + '*://*.muses.org/*', '*://*.nakamasweb.com/*', '*://*.onclasrv.com/*', '*://*.onesignal.com/*', diff --git a/src/web/mjs/engine/Connectors.mjs b/src/web/mjs/engine/Connectors.mjs index ee6d094555..e09b7fd1fb 100644 --- a/src/web/mjs/engine/Connectors.mjs +++ b/src/web/mjs/engine/Connectors.mjs @@ -9,7 +9,7 @@ export default class Connectors { try { let response = await fetch(uri); let data = await response.json(); - return data.filter(plugin => !plugin.startsWith('.') && plugin.endsWith('.mjs')).map(plugin => uri + plugin) + return data.filter(plugin => !plugin.startsWith('.') && plugin.endsWith('.mjs')).map(plugin => uri + plugin); } catch(error) { //console.warn(error); return []; @@ -50,13 +50,13 @@ export default class Connectors { } } this._list.sort( ( a, b ) => { - return ( a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1 ); + return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1; } ); } catch(error) { console.warn(`Failed to load connector`, error); } } - + async _onConnectorProtocolHandler(request) { try { let uri = new URL(request.url); diff --git a/src/web/mjs/engine/HeaderGenerator.mjs b/src/web/mjs/engine/HeaderGenerator.mjs index b3881a5eb1..e64d5b9c04 100644 --- a/src/web/mjs/engine/HeaderGenerator.mjs +++ b/src/web/mjs/engine/HeaderGenerator.mjs @@ -40,7 +40,7 @@ export default class HeaderGenerator { static get _browserChrome() { let $ = HeaderGenerator; - let version = $._rn( 105, 113 ) + '.' + $._rn( 0, 99 ) + '.' + $._rn( 0, 9999 ) + '.' + $._rn( 0, 999 ); + let version = $._rn( 120, 122 ) + '.' + $._rn( 0, 99 ) + '.' + $._rn( 0, 9999 ) + '.' + $._rn( 0, 999 ); return 'Mozilla/5.0 (' + $._os + ') AppleWebKit/537.36 (KHTML, like Gecko) Chrome/' + version + ' Safari/537.36'; }