├── .gitignore ├── 69主站.json ├── LICENSE ├── README.md ├── book ├── build.gradle.kts └── src │ ├── lib │ ├── rhino-1.7.14.jar │ └── xmlpull-1.1.3.1.jar │ └── main │ ├── kotlin │ ├── android │ │ └── os │ │ │ └── Build.kt │ ├── book │ │ ├── app │ │ │ ├── App.kt │ │ │ └── Message.kt │ │ ├── appCtx.kt │ │ ├── icu4j │ │ │ ├── CharsetDetector.java │ │ │ ├── CharsetMatch.java │ │ │ ├── CharsetRecog_2022.java │ │ │ ├── CharsetRecog_UTF8.java │ │ │ ├── CharsetRecog_Unicode.java │ │ │ ├── CharsetRecog_mbcs.java │ │ │ ├── CharsetRecog_sbcs.java │ │ │ └── CharsetRecognizer.java │ │ ├── model │ │ │ ├── BaseBook.kt │ │ │ ├── BaseRssArticle.kt │ │ │ ├── BaseSource.kt │ │ │ ├── Book.kt │ │ │ ├── BookChapter.kt │ │ │ ├── BookSource.kt │ │ │ ├── Cache.kt │ │ │ ├── FlexChildStyle.kt │ │ │ ├── Header.kt │ │ │ ├── HttpTTS.kt │ │ │ ├── ReplaceRule.kt │ │ │ ├── RowUi.kt │ │ │ ├── RssArticle.kt │ │ │ ├── RssSource.kt │ │ │ ├── RssStar.kt │ │ │ ├── SearchBook.kt │ │ │ ├── SharedJsScope.kt │ │ │ ├── TxtTocRule.kt │ │ │ └── rule │ │ │ │ ├── BookInfoRule.kt │ │ │ │ ├── BookListRule.kt │ │ │ │ ├── ContentRule.kt │ │ │ │ ├── ExploreRule.kt │ │ │ │ ├── SearchRule.kt │ │ │ │ └── TocRule.kt │ │ ├── util │ │ │ ├── ACache.kt │ │ │ ├── AppConst.kt │ │ │ ├── AppPattern.kt │ │ │ ├── Base64.kt │ │ │ ├── ChineseUtils.kt │ │ │ ├── Coroutine.kt │ │ │ ├── EncoderUtils.kt │ │ │ ├── EncodingDetect.kt │ │ │ ├── Ext.kt │ │ │ ├── File.kt │ │ │ ├── FileExtensions.kt │ │ │ ├── FileUtils.kt │ │ │ ├── GSON.kt │ │ │ ├── HtmlFormatter.kt │ │ │ ├── JsURL.kt │ │ │ ├── JsonExtensions.kt │ │ │ ├── LogUtils.kt │ │ │ ├── MD5Utils.kt │ │ │ ├── Maputil.kt │ │ │ ├── MyCache.kt │ │ │ ├── NetworkUtils.kt │ │ │ ├── RegexExtensions.kt │ │ │ ├── String.kt │ │ │ ├── StringUtils.kt │ │ │ ├── TextUtils.java │ │ │ ├── UrlUtil.kt │ │ │ ├── Utf8BomUtils.kt │ │ │ ├── VertExt.kt │ │ │ ├── ZipUtils.kt │ │ │ ├── crypto │ │ │ │ ├── AsymmetricCrypto.kt │ │ │ │ └── Base64.java │ │ │ ├── help │ │ │ │ ├── BookHelp.kt │ │ │ │ ├── CacheManager.kt │ │ │ │ ├── CookieManager.kt │ │ │ │ ├── CookieStore.kt │ │ │ │ ├── DefaultData.kt │ │ │ │ ├── RuleBigDataHelp.kt │ │ │ │ └── SourceAnalyzer.kt │ │ │ └── http │ │ │ │ ├── ByteConverter.kt │ │ │ │ ├── ConcurrentRateLimiter.kt │ │ │ │ ├── DecompressInterceptor.kt │ │ │ │ ├── HttpHelper.kt │ │ │ │ ├── OkHttpClient.kt │ │ │ │ ├── OkHttpExceptionInterceptor.kt │ │ │ │ ├── OkhttpUncaughtExceptionHandler.kt │ │ │ │ ├── RequestMethod.kt │ │ │ │ ├── SSLHelper.kt │ │ │ │ └── StrResponse.kt │ │ └── webBook │ │ │ ├── BookChapterList.kt │ │ │ ├── BookContent.kt │ │ │ ├── BookInfo.kt │ │ │ ├── BookList.kt │ │ │ ├── Debug.kt │ │ │ ├── DebugLog.kt │ │ │ ├── Debugger.kt │ │ │ ├── RssSourceExtensions.kt │ │ │ ├── WBook.kt │ │ │ ├── analyzeRule │ │ │ ├── AnalyzeByJSonPath.kt │ │ │ ├── AnalyzeByJSoup.kt │ │ │ ├── AnalyzeByRegex.kt │ │ │ ├── AnalyzeByXPath.kt │ │ │ ├── AnalyzeRule.kt │ │ │ ├── AnalyzeUrl.kt │ │ │ ├── CustomUrl.kt │ │ │ ├── JsEncodeUtils.kt │ │ │ ├── JsExtensions.kt │ │ │ ├── QueryTTF.java │ │ │ ├── RuleAnalyzer.kt │ │ │ ├── RuleData.kt │ │ │ ├── RuleDataInterface.kt │ │ │ └── SymmetricCryptoAndroid.kt │ │ │ ├── exception │ │ │ ├── ActivelyCancelException.kt │ │ │ ├── ConcurrentException.kt │ │ │ ├── NoStackTraceException.kt │ │ │ ├── RegexTimeoutException.kt │ │ │ └── TocEmptyException.kt │ │ │ ├── localBook │ │ │ ├── BaseLocalBookParse.kt │ │ │ ├── CbzFile.kt │ │ │ ├── EpubFile.kt │ │ │ ├── LocalBook.kt │ │ │ ├── TextFile.kt │ │ │ └── UmdFile.kt │ │ │ └── rss │ │ │ ├── Rss.kt │ │ │ ├── RssParserByRule.kt │ │ │ └── RssParserDefault.kt │ ├── com │ │ └── script │ │ │ ├── AbstractScriptEngine.kt │ │ │ ├── Bindings.kt │ │ │ ├── Compilable.kt │ │ │ ├── CompiledScript.kt │ │ │ ├── Invocable.kt │ │ │ ├── RhinoContextFactory.kt │ │ │ ├── ScriptBindings.kt │ │ │ ├── ScriptBindingsExtensions.kt │ │ │ ├── ScriptContext.kt │ │ │ ├── ScriptEngine.kt │ │ │ ├── ScriptException.kt │ │ │ ├── SimpleBindings.kt │ │ │ ├── SimpleScriptContext.kt │ │ │ └── rhino │ │ │ ├── ExternalScriptable.kt │ │ │ ├── InterfaceImplementor.kt │ │ │ ├── JSAdapter.kt │ │ │ ├── JavaAdapter.kt │ │ │ ├── RhinoClassShutter.kt │ │ │ ├── RhinoCompiledScript.kt │ │ │ ├── RhinoContext.kt │ │ │ ├── RhinoExtensions.kt │ │ │ ├── RhinoInterruptedError.kt │ │ │ ├── RhinoScriptEngine.kt │ │ │ ├── RhinoTopLevel.kt │ │ │ ├── RhinoWrapFactory.kt │ │ │ └── VMBridgeReflect.kt │ └── me │ │ └── ag2s │ │ ├── epublib │ │ ├── Constants.java │ │ ├── browsersupport │ │ │ ├── NavigationEvent.java │ │ │ ├── NavigationEventListener.java │ │ │ ├── NavigationHistory.java │ │ │ ├── Navigator.java │ │ │ └── package-info.java │ │ ├── domain │ │ │ ├── Author.java │ │ │ ├── Date.java │ │ │ ├── EpubBook.java │ │ │ ├── EpubResourceProvider.java │ │ │ ├── FileResourceProvider.java │ │ │ ├── Guide.java │ │ │ ├── GuideReference.java │ │ │ ├── Identifier.java │ │ │ ├── LazyResource.java │ │ │ ├── LazyResourceProvider.java │ │ │ ├── ManifestItemProperties.java │ │ │ ├── ManifestItemRefProperties.java │ │ │ ├── ManifestProperties.java │ │ │ ├── MediaType.java │ │ │ ├── MediaTypes.java │ │ │ ├── Metadata.java │ │ │ ├── Relator.java │ │ │ ├── Resource.java │ │ │ ├── ResourceInputStream.java │ │ │ ├── ResourceReference.java │ │ │ ├── Resources.java │ │ │ ├── Spine.java │ │ │ ├── SpineReference.java │ │ │ ├── TOCReference.java │ │ │ ├── TableOfContents.java │ │ │ └── TitledResourceReference.java │ │ ├── epub │ │ │ ├── BookProcessor.java │ │ │ ├── BookProcessorPipeline.java │ │ │ ├── DOMUtil.java │ │ │ ├── EpubProcessorSupport.java │ │ │ ├── EpubReader.java │ │ │ ├── EpubWriter.java │ │ │ ├── HtmlProcessor.java │ │ │ ├── NCXDocumentV2.java │ │ │ ├── NCXDocumentV3.java │ │ │ ├── PackageDocumentBase.java │ │ │ ├── PackageDocumentMetadataReader.java │ │ │ ├── PackageDocumentMetadataWriter.java │ │ │ ├── PackageDocumentReader.java │ │ │ ├── PackageDocumentWriter.java │ │ │ └── ResourcesLoader.java │ │ └── util │ │ │ ├── CollectionUtil.java │ │ │ ├── IOUtil.java │ │ │ ├── NoCloseOutputStream.java │ │ │ ├── NoCloseWriter.java │ │ │ ├── ResourceUtil.java │ │ │ ├── StringUtil.java │ │ │ └── commons │ │ │ └── io │ │ │ ├── BOMInputStream.java │ │ │ ├── ByteOrderMark.java │ │ │ ├── IOConsumer.java │ │ │ ├── ProxyInputStream.java │ │ │ ├── XmlStreamReader.java │ │ │ └── XmlStreamReaderException.java │ │ └── umdlib │ │ ├── domain │ │ ├── UmdBook.java │ │ ├── UmdChapters.java │ │ ├── UmdCover.java │ │ ├── UmdEnd.java │ │ └── UmdHeader.java │ │ ├── tool │ │ ├── StreamReader.java │ │ ├── UmdUtils.java │ │ └── WrapOutputStream.java │ │ └── umd │ │ └── UmdReader.java │ └── resources │ └── defaultData │ └── txtTocRule.json ├── bookshelf.json ├── build.gradle.kts ├── build.sh ├── conf ├── conf.yml └── mysqlconf.yml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── png ├── book.png ├── cookie.png ├── editsource.jpg ├── faxian.png ├── found.jpg ├── home.png ├── home2.png ├── home3.jpg ├── login.png ├── my.jpg ├── read.png ├── search.png ├── source.jpg └── sourcelogin.jpg ├── settings.gradle.kts ├── src ├── main │ ├── kotlin │ │ └── web │ │ │ ├── App.kt │ │ │ ├── config │ │ │ ├── CacheConfig.kt │ │ │ ├── DbConfig.kt │ │ │ └── InitConfig.kt │ │ │ ├── controller │ │ │ ├── HomeController.kt │ │ │ ├── admin │ │ │ │ ├── BookSourceController.kt │ │ │ │ ├── CodeController.kt │ │ │ │ ├── DebugBookSource.kt │ │ │ │ ├── HomeController.kt │ │ │ │ ├── LoginContorller.kt │ │ │ │ ├── RssSourceController.kt │ │ │ │ └── UserController.kt │ │ │ └── api │ │ │ │ ├── ApiWebSocket.kt │ │ │ │ ├── BaseController.kt │ │ │ │ ├── BaseDebug.kt │ │ │ │ ├── BookController.kt │ │ │ │ ├── DebugWebSocket.kt │ │ │ │ ├── LocalBookController.kt │ │ │ │ ├── ReadController.kt │ │ │ │ ├── ReplaceRuleController.kt │ │ │ │ ├── RssController.kt │ │ │ │ ├── RssDebugWebSocket.kt │ │ │ │ ├── SourceController.kt │ │ │ │ ├── TTsController.kt │ │ │ │ └── UserController.kt │ │ │ ├── cron │ │ │ ├── BookJob.kt │ │ │ ├── CacheJob.kt │ │ │ ├── Gcjob.kt │ │ │ └── JsonFileJob.kt │ │ │ ├── filter │ │ │ └── ErrorsFilter.kt │ │ │ ├── interceptor │ │ │ └── AdminAuthInterceptorImpl.kt │ │ │ ├── mapper │ │ │ ├── BookCacheMapper.kt │ │ │ ├── BookGroupMapper.kt │ │ │ ├── BookSourceMapper.kt │ │ │ ├── BooklistMapper.kt │ │ │ ├── CodeMapper.kt │ │ │ ├── HttpTTSMapper.kt │ │ │ ├── ReplaceRuleMapper.kt │ │ │ ├── RssSourceMapper.kt │ │ │ ├── UserBookSourceMapper.kt │ │ │ ├── UserCookieMapper.kt │ │ │ ├── UserRssSourceMapper.kt │ │ │ ├── UsersMapper.kt │ │ │ └── UsertockenMapper.kt │ │ │ ├── model │ │ │ ├── BaseRssSource.kt │ │ │ ├── BaseSource.kt │ │ │ ├── BookCache.kt │ │ │ ├── BookGroup.kt │ │ │ ├── BookSource.kt │ │ │ ├── Booklist.kt │ │ │ ├── Code.kt │ │ │ ├── HttpTts.kt │ │ │ ├── ReplaceRule.kt │ │ │ ├── RssSource.kt │ │ │ ├── UserBookSource.kt │ │ │ ├── UserCookie.kt │ │ │ ├── UserRssSource.kt │ │ │ ├── Users.kt │ │ │ └── Usertocken.kt │ │ │ ├── response │ │ │ ├── JsonResponse.kt │ │ │ ├── PageResponse.kt │ │ │ └── static.kt │ │ │ └── util │ │ │ ├── BigDataHelp.kt │ │ │ ├── ResponseManager.kt │ │ │ ├── SslUtils.kt │ │ │ ├── admin │ │ │ └── static.kt │ │ │ ├── gson │ │ │ └── LocalDateTimeAdapter.kt │ │ │ ├── hash │ │ │ ├── aes.kt │ │ │ ├── hash.kt │ │ │ ├── md5.kt │ │ │ ├── sha1.kt │ │ │ ├── sha256.kt │ │ │ ├── sha384.kt │ │ │ └── sha512.kt │ │ │ ├── mail │ │ │ ├── Mail.kt │ │ │ └── MailConf.kt │ │ │ ├── mapper │ │ │ └── mapper.kt │ │ │ ├── page │ │ │ ├── PageException.kt │ │ │ └── page.kt │ │ │ ├── read │ │ │ ├── BookContent.kt │ │ │ ├── Bookcache.kt │ │ │ └── book.kt │ │ │ └── validation │ │ │ ├── email.kt │ │ │ └── phone.kt │ └── resources │ │ ├── app.yml │ │ ├── conf.yml │ │ ├── confmysql.yml │ │ ├── spy.properties │ │ ├── static │ │ ├── assets │ │ │ ├── AssetManifest.bin │ │ │ ├── AssetManifest.bin.json │ │ │ ├── AssetManifest.json │ │ │ ├── FontManifest.json │ │ │ ├── NOTICES │ │ │ ├── assets │ │ │ │ ├── bg │ │ │ │ │ ├── 1.jpg │ │ │ │ │ ├── 10.jpg │ │ │ │ │ ├── 11.jpg │ │ │ │ │ ├── 12.jpg │ │ │ │ │ ├── 13.jpg │ │ │ │ │ ├── 14.jpg │ │ │ │ │ ├── 2.jpg │ │ │ │ │ ├── 3.jpg │ │ │ │ │ ├── 4.jpg │ │ │ │ │ ├── 5.jpg │ │ │ │ │ ├── 6.jpg │ │ │ │ │ ├── 7.jpg │ │ │ │ │ ├── 8.jpg │ │ │ │ │ └── 9.jpg │ │ │ │ └── images │ │ │ │ │ ├── default_avatar.jpeg │ │ │ │ │ ├── fq.png │ │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ │ ├── logo.png │ │ │ │ │ ├── no_cover.jpeg │ │ │ │ │ ├── qd.png │ │ │ │ │ ├── qq.png │ │ │ │ │ └── splash.png │ │ │ ├── fonts │ │ │ │ └── MaterialIcons-Regular.otf │ │ │ ├── packages │ │ │ │ ├── cupertino_icons │ │ │ │ │ └── assets │ │ │ │ │ │ └── CupertinoIcons.ttf │ │ │ │ ├── flutter_inappwebview │ │ │ │ │ └── assets │ │ │ │ │ │ └── t_rex_runner │ │ │ │ │ │ ├── t-rex.css │ │ │ │ │ │ └── t-rex.html │ │ │ │ ├── flutter_inappwebview_web │ │ │ │ │ └── assets │ │ │ │ │ │ └── web │ │ │ │ │ │ └── web_support.js │ │ │ │ ├── fluttertoast │ │ │ │ │ └── assets │ │ │ │ │ │ ├── toastify.css │ │ │ │ │ │ └── toastify.js │ │ │ │ └── wakelock_plus │ │ │ │ │ └── assets │ │ │ │ │ └── no_sleep.js │ │ │ └── shaders │ │ │ │ └── ink_sparkle.frag │ │ ├── canvaskit │ │ │ ├── canvaskit.js │ │ │ ├── canvaskit.js.symbols │ │ │ ├── canvaskit.wasm │ │ │ ├── chromium │ │ │ │ ├── canvaskit.js │ │ │ │ ├── canvaskit.js.symbols │ │ │ │ └── canvaskit.wasm │ │ │ ├── skwasm.js │ │ │ ├── skwasm.js.symbols │ │ │ ├── skwasm.wasm │ │ │ └── skwasm.worker.js │ │ ├── flutter.js │ │ ├── flutter_bootstrap.js │ │ ├── flutter_service_worker.js │ │ ├── icons │ │ │ ├── Icon-192.png │ │ │ ├── Icon-512.png │ │ │ ├── Icon-maskable-192.png │ │ │ └── Icon-maskable-512.png │ │ ├── index.html │ │ ├── main.dart.js │ │ ├── main.dart.js_1.part.js │ │ ├── main.dart.js_100.part.js │ │ ├── main.dart.js_101.part.js │ │ ├── main.dart.js_102.part.js │ │ ├── main.dart.js_103.part.js │ │ ├── main.dart.js_104.part.js │ │ ├── main.dart.js_105.part.js │ │ ├── main.dart.js_106.part.js │ │ ├── main.dart.js_107.part.js │ │ ├── main.dart.js_108.part.js │ │ ├── main.dart.js_109.part.js │ │ ├── main.dart.js_111.part.js │ │ ├── main.dart.js_113.part.js │ │ ├── main.dart.js_115.part.js │ │ ├── main.dart.js_118.part.js │ │ ├── main.dart.js_12.part.js │ │ ├── main.dart.js_121.part.js │ │ ├── main.dart.js_125.part.js │ │ ├── main.dart.js_127.part.js │ │ ├── main.dart.js_128.part.js │ │ ├── main.dart.js_129.part.js │ │ ├── main.dart.js_130.part.js │ │ ├── main.dart.js_132.part.js │ │ ├── main.dart.js_133.part.js │ │ ├── main.dart.js_135.part.js │ │ ├── main.dart.js_136.part.js │ │ ├── main.dart.js_137.part.js │ │ ├── main.dart.js_138.part.js │ │ ├── main.dart.js_141.part.js │ │ ├── main.dart.js_143.part.js │ │ ├── main.dart.js_145.part.js │ │ ├── main.dart.js_147.part.js │ │ ├── main.dart.js_149.part.js │ │ ├── main.dart.js_15.part.js │ │ ├── main.dart.js_150.part.js │ │ ├── main.dart.js_151.part.js │ │ ├── main.dart.js_152.part.js │ │ ├── main.dart.js_154.part.js │ │ ├── main.dart.js_155.part.js │ │ ├── main.dart.js_156.part.js │ │ ├── main.dart.js_157.part.js │ │ ├── main.dart.js_162.part.js │ │ ├── main.dart.js_163.part.js │ │ ├── main.dart.js_165.part.js │ │ ├── main.dart.js_166.part.js │ │ ├── main.dart.js_167.part.js │ │ ├── main.dart.js_168.part.js │ │ ├── main.dart.js_170.part.js │ │ ├── main.dart.js_171.part.js │ │ ├── main.dart.js_172.part.js │ │ ├── main.dart.js_174.part.js │ │ ├── main.dart.js_176.part.js │ │ ├── main.dart.js_178.part.js │ │ ├── main.dart.js_18.part.js │ │ ├── main.dart.js_180.part.js │ │ ├── main.dart.js_181.part.js │ │ ├── main.dart.js_183.part.js │ │ ├── main.dart.js_184.part.js │ │ ├── main.dart.js_186.part.js │ │ ├── main.dart.js_187.part.js │ │ ├── main.dart.js_189.part.js │ │ ├── main.dart.js_19.part.js │ │ ├── main.dart.js_191.part.js │ │ ├── main.dart.js_192.part.js │ │ ├── main.dart.js_193.part.js │ │ ├── main.dart.js_195.part.js │ │ ├── main.dart.js_196.part.js │ │ ├── main.dart.js_198.part.js │ │ ├── main.dart.js_199.part.js │ │ ├── main.dart.js_20.part.js │ │ ├── main.dart.js_201.part.js │ │ ├── main.dart.js_202.part.js │ │ ├── main.dart.js_203.part.js │ │ ├── main.dart.js_204.part.js │ │ ├── main.dart.js_205.part.js │ │ ├── main.dart.js_206.part.js │ │ ├── main.dart.js_208.part.js │ │ ├── main.dart.js_209.part.js │ │ ├── main.dart.js_210.part.js │ │ ├── main.dart.js_23.part.js │ │ ├── main.dart.js_24.part.js │ │ ├── main.dart.js_25.part.js │ │ ├── main.dart.js_26.part.js │ │ ├── main.dart.js_28.part.js │ │ ├── main.dart.js_29.part.js │ │ ├── main.dart.js_3.part.js │ │ ├── main.dart.js_31.part.js │ │ ├── main.dart.js_32.part.js │ │ ├── main.dart.js_34.part.js │ │ ├── main.dart.js_36.part.js │ │ ├── main.dart.js_37.part.js │ │ ├── main.dart.js_38.part.js │ │ ├── main.dart.js_39.part.js │ │ ├── main.dart.js_4.part.js │ │ ├── main.dart.js_42.part.js │ │ ├── main.dart.js_43.part.js │ │ ├── main.dart.js_44.part.js │ │ ├── main.dart.js_45.part.js │ │ ├── main.dart.js_47.part.js │ │ ├── main.dart.js_48.part.js │ │ ├── main.dart.js_49.part.js │ │ ├── main.dart.js_5.part.js │ │ ├── main.dart.js_50.part.js │ │ ├── main.dart.js_51.part.js │ │ ├── main.dart.js_52.part.js │ │ ├── main.dart.js_53.part.js │ │ ├── main.dart.js_54.part.js │ │ ├── main.dart.js_55.part.js │ │ ├── main.dart.js_56.part.js │ │ ├── main.dart.js_57.part.js │ │ ├── main.dart.js_58.part.js │ │ ├── main.dart.js_6.part.js │ │ ├── main.dart.js_61.part.js │ │ ├── main.dart.js_62.part.js │ │ ├── main.dart.js_64.part.js │ │ ├── main.dart.js_65.part.js │ │ ├── main.dart.js_66.part.js │ │ ├── main.dart.js_68.part.js │ │ ├── main.dart.js_69.part.js │ │ ├── main.dart.js_7.part.js │ │ ├── main.dart.js_70.part.js │ │ ├── main.dart.js_71.part.js │ │ ├── main.dart.js_72.part.js │ │ ├── main.dart.js_74.part.js │ │ ├── main.dart.js_75.part.js │ │ ├── main.dart.js_76.part.js │ │ ├── main.dart.js_78.part.js │ │ ├── main.dart.js_79.part.js │ │ ├── main.dart.js_80.part.js │ │ ├── main.dart.js_82.part.js │ │ ├── main.dart.js_83.part.js │ │ ├── main.dart.js_84.part.js │ │ ├── main.dart.js_86.part.js │ │ ├── main.dart.js_88.part.js │ │ ├── main.dart.js_89.part.js │ │ ├── main.dart.js_90.part.js │ │ ├── main.dart.js_93.part.js │ │ ├── main.dart.js_94.part.js │ │ ├── main.dart.js_96.part.js │ │ ├── main.dart.js_97.part.js │ │ ├── main.dart.js_98.part.js │ │ ├── main.dart.js_99.part.js │ │ ├── manifest.json │ │ ├── static │ │ │ ├── boy.jpeg │ │ │ ├── css │ │ │ │ └── login.css │ │ │ ├── font_1997429_8xzvctxta3u.eot │ │ │ ├── font_1997429_8xzvctxta3u.svg │ │ │ ├── font_1997429_8xzvctxta3u.ttf │ │ │ ├── font_1997429_8xzvctxta3u.woff │ │ │ ├── font_1997429_8xzvctxta3u.woff2 │ │ │ ├── fonts │ │ │ │ └── MaterialIcons-Regular.woff2 │ │ │ ├── image │ │ │ │ ├── close.png │ │ │ │ ├── error.jpeg │ │ │ │ ├── one-se.png │ │ │ │ ├── one.png │ │ │ │ ├── three-se.png │ │ │ │ ├── three.png │ │ │ │ ├── two-se.png │ │ │ │ └── two.png │ │ │ ├── js │ │ │ │ ├── ajax.js │ │ │ │ └── jquery-ui.min.js │ │ │ └── layui │ │ │ │ ├── css │ │ │ │ └── layui.css │ │ │ │ ├── font │ │ │ │ ├── iconfont.eot │ │ │ │ ├── iconfont.svg │ │ │ │ ├── iconfont.ttf │ │ │ │ ├── iconfont.woff │ │ │ │ └── iconfont.woff2 │ │ │ │ └── layui.js │ │ └── version.json │ │ └── templates │ │ ├── admin │ │ ├── addcookie.html │ │ ├── adduser.html │ │ ├── book.html │ │ ├── code.html │ │ ├── header.html │ │ ├── index.html │ │ └── rss.html │ │ ├── errors │ │ └── 404.html │ │ ├── login.html │ │ └── regester.html └── test │ └── kotlin │ └── main.kt ├── 天天看小说.json └── 霹雳书屋.json /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | .idea/ 7 | logs/ 8 | build/ 9 | bookcache/ 10 | libs/ 11 | cache/ 12 | local 13 | cookie/ 14 | storage/ 15 | read.db 16 | solon-read.iml 17 | 18 | ### IntelliJ IDEA ### 19 | .idea/modules.xml 20 | .idea/jarRepositories.xml 21 | .idea/compiler.xml 22 | .idea/libraries/ 23 | *.iws 24 | *.iml 25 | *.ipr 26 | out/ 27 | !**/src/main/**/out/ 28 | !**/src/test/**/out/ 29 | 30 | ### Kotlin ### 31 | .kotlin 32 | 33 | ### Eclipse ### 34 | .apt_generated 35 | .classpath 36 | .factorypath 37 | .project 38 | .settings 39 | .springBeans 40 | .sts4-cache 41 | bin/ 42 | !**/src/main/**/bin/ 43 | !**/src/test/**/bin/ 44 | 45 | ### NetBeans ### 46 | /nbproject/private/ 47 | /nbbuild/ 48 | /dist/ 49 | /nbdist/ 50 | /.nb-gradle/ 51 | 52 | ### VS Code ### 53 | .vscode/ 54 | 55 | ### Mac OS ### 56 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 autobcb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /book/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") 3 | } 4 | 5 | val kotlin_version: String ="2.1.0" 6 | group = "read" 7 | version = "1.0-SNAPSHOT" 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version") 15 | implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1") 16 | 17 | // 规则相关 18 | implementation("org.jsoup:jsoup:1.16.2") 19 | implementation("cn.wanghaomiao:JsoupXpath:2.5.3") 20 | implementation("com.jayway.jsonpath:json-path:2.9.0") 21 | 22 | // json 23 | implementation("com.google.code.gson:gson:2.11.0") 24 | implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.+") 25 | 26 | //log 27 | implementation("org.slf4j:slf4j-api:2.0.16") 28 | //implementation("org.slf4j:slf4j-simple:2.0.16") 29 | 30 | // Retrofit 31 | implementation("com.squareup.retrofit2:retrofit:2.6.1") 32 | implementation("com.julienviet:retrofit-vertx:1.1.3") 33 | implementation("org.bouncycastle:bcpkix-jdk18on:1.80") 34 | 35 | // 网络 36 | implementation("com.squareup.okhttp3:okhttp:4.12.0") 37 | implementation("com.squareup.okhttp3:logging-interceptor:4.1.0") 38 | 39 | //加解密类库 40 | implementation("cn.hutool:hutool-crypto:5.8.22") 41 | 42 | //js 43 | // implementation(files("src/lib/rhino-1.7.14.jar")) 44 | implementation("org.mozilla:rhino:1.8.0") 45 | implementation(files("src/lib/xmlpull-1.1.3.1.jar")) 46 | implementation("org.apache.commons:commons-text:1.13.0") 47 | implementation("com.github.liuyueyi:quick-transfer-core:0.2.16") 48 | testImplementation(kotlin("test")) 49 | } 50 | sourceSets { 51 | main { 52 | java.srcDir("src/main/kotlin") 53 | } 54 | } 55 | 56 | tasks.test { 57 | useJUnitPlatform() 58 | } 59 | kotlin { 60 | jvmToolchain(19) 61 | } -------------------------------------------------------------------------------- /book/src/lib/rhino-1.7.14.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/book/src/lib/rhino-1.7.14.jar -------------------------------------------------------------------------------- /book/src/lib/xmlpull-1.1.3.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/book/src/lib/xmlpull-1.1.3.1.jar -------------------------------------------------------------------------------- /book/src/main/kotlin/android/os/Build.kt: -------------------------------------------------------------------------------- 1 | package android.os 2 | 3 | object Build { 4 | @JvmStatic 5 | val MANUFACTURER="OPPO" 6 | @JvmStatic 7 | val MODEL="PKH110" 8 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/app/App.kt: -------------------------------------------------------------------------------- 1 | package book.app 2 | 3 | import book.util.http.StrResponse 4 | 5 | object App { 6 | var startBrowserAwait =fun (urlStr: String,title: String,tocken:String,header:String): StrResponse { 7 | return StrResponse(urlStr,"") 8 | } 9 | var webview =fun (html: String?, url: String?, js: String?,tocken:String,header:String):StrResponse{ 10 | return StrResponse(url?:"", "") 11 | } 12 | var webviewbody =fun (html: String?, url: String?, js: String?,tocken:String,header:String,body:String):StrResponse{ 13 | return StrResponse(url?:"", "") 14 | } 15 | var toast =fun (str: String,tocken:String){ 16 | 17 | } 18 | var getVerificationCode =fun (imgurl:String,tocken:String):String{ 19 | return "" 20 | } 21 | 22 | var getWebViewUA =fun (tocken:String):String{ 23 | return "" 24 | } 25 | var log =fun (str: String,tocken:String){ 26 | 27 | } 28 | var get =fun (url: String?, header:String,tocken:String):StrResponse{ 29 | return StrResponse(url?:"", "") 30 | } 31 | 32 | var post =fun (url: String?,body:String, header:String,tocken:String):StrResponse{ 33 | return StrResponse(url?:"", "") 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/app/Message.kt: -------------------------------------------------------------------------------- 1 | package book.app 2 | 3 | data class WebMessage ( 4 | val msg: String, 5 | val url: String, 6 | val html: String = "", 7 | val title: String, 8 | val header:String="", 9 | val body:String="", 10 | val id: String, 11 | ) 12 | 13 | data class ToastMessage ( 14 | val msg: String, 15 | val str: String, 16 | ) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/appCtx.kt: -------------------------------------------------------------------------------- 1 | package book 2 | 3 | import book.util.getWorkDir 4 | import java.io.File 5 | import java.nio.file.Files 6 | 7 | object appCtx { 8 | val cacheDir: String by lazy { 9 | getWorkDir("storage", "cache") 10 | } 11 | 12 | val externalFiles= File("storage").also { 13 | if (!it.exists()) { 14 | it.mkdirs() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/BaseRssArticle.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | 3 | import book.util.GSON 4 | import book.util.help.RuleBigDataHelp 5 | import book.webBook.analyzeRule.RuleDataInterface 6 | 7 | interface BaseRssArticle : RuleDataInterface { 8 | 9 | var origin: String 10 | var link: String 11 | 12 | var variable: String? 13 | 14 | override fun putVariable(key: String, value: String?): Boolean { 15 | if (super.putVariable(key, value)) { 16 | variable = GSON.toJson(variableMap) 17 | } 18 | return true 19 | } 20 | 21 | override fun putBigVariable(key: String, value: String?) { 22 | RuleBigDataHelp.putRssVariable(origin,userid, link, key, value) 23 | } 24 | 25 | override fun getBigVariable(key: String): String? { 26 | return RuleBigDataHelp.getRssVariable(origin,userid, link, key) 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/Cache.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | 3 | data class Cache( 4 | // @PrimaryKey 5 | val key: String = "", 6 | var value: String? = null, 7 | var deadline: Long = 0L 8 | ) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/FlexChildStyle.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | 3 | 4 | data class FlexChildStyle( 5 | val layout_flexGrow: Float = 0F, 6 | val layout_flexShrink: Float = 1F, 7 | val layout_alignSelf: String = "auto", 8 | val layout_flexBasisPercent: Float = -1F, 9 | val layout_wrapBefore: Boolean = false, 10 | ) { 11 | 12 | fun alignSelf(): Int { 13 | return when (layout_alignSelf) { 14 | "auto" -> -1 15 | "flex_start" -> 0 16 | "flex_end" -> 1 17 | "center" -> 2 18 | "baseline" -> 3 19 | "stretch" -> 4 20 | else -> -1 21 | } 22 | } 23 | 24 | 25 | 26 | companion object { 27 | val defaultStyle = FlexChildStyle() 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/Header.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | 3 | class Header { 4 | var headers: Map = emptyMap() 5 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/RowUi.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | data class RowUi( 3 | var name: String, 4 | var type: String = "text", 5 | var action: String? = null, 6 | var style: FlexChildStyle? = null 7 | ) { 8 | 9 | @Suppress("ConstPropertyName") 10 | object Type { 11 | 12 | const val text = "text" 13 | const val password = "password" 14 | const val button = "button" 15 | 16 | } 17 | 18 | fun style(): FlexChildStyle { 19 | return style ?: FlexChildStyle.defaultStyle 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/RssArticle.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | 3 | import book.util.GSON 4 | import book.util.fromJsonObject 5 | import book.util.help.CacheManager 6 | import com.google.gson.annotations.Expose 7 | 8 | data class RssArticle( 9 | override var origin: String = "", 10 | var sort: String = "", 11 | var title: String = "", 12 | var order: Long = 0, 13 | override var link: String = "", 14 | var pubDate: String? = null, 15 | var description: String? = null, 16 | var content: String? = null, 17 | var image: String? = null, 18 | var group: String = "默认分组", 19 | var read: Boolean = false, 20 | @Expose(serialize = false, deserialize = false) 21 | override var variable: String? = null, 22 | override var userid: String ="", 23 | ) : BaseRssArticle { 24 | 25 | override fun hashCode() = link.hashCode() 26 | 27 | override fun equals(other: Any?): Boolean { 28 | other ?: return false 29 | return if (other is RssArticle) origin == other.origin && link == other.link else false 30 | } 31 | 32 | @delegate:Expose(serialize = false, deserialize = false) 33 | override val variableMap: HashMap by lazy { 34 | GSON.fromJsonObject>(variable).getOrNull() ?: hashMapOf() 35 | } 36 | 37 | fun toStar() = RssStar( 38 | origin = origin, 39 | sort = sort, 40 | title = title, 41 | starTime = System.currentTimeMillis(), 42 | link = link, 43 | pubDate = pubDate, 44 | description = description, 45 | content = content, 46 | image = image, 47 | group = group, 48 | variable = variable, 49 | userid = userid, 50 | ) 51 | } 52 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/RssStar.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | 3 | import book.util.GSON 4 | import book.util.fromJsonObject 5 | import book.util.help.CacheManager 6 | import com.google.gson.annotations.Expose 7 | 8 | data class RssStar( 9 | override var origin: String = "", 10 | var sort: String = "", 11 | var title: String = "", 12 | var starTime: Long = 0, 13 | override var link: String = "", 14 | var pubDate: String? = null, 15 | var description: String? = null, 16 | var content: String? = null, 17 | var image: String? = null, 18 | var group: String = "默认分组", 19 | @Expose(serialize = false, deserialize = false) 20 | override var variable: String? = null, 21 | override var userid: String ="", 22 | ) : BaseRssArticle { 23 | 24 | @delegate:Expose(serialize = false, deserialize = false) 25 | override val variableMap: HashMap by lazy { 26 | GSON.fromJsonObject>(variable).getOrNull() ?: hashMapOf() 27 | } 28 | 29 | fun toRssArticle() = RssArticle( 30 | origin = origin, 31 | sort = sort, 32 | title = title, 33 | link = link, 34 | pubDate = pubDate, 35 | description = description, 36 | content = content, 37 | image = image, 38 | group = group, 39 | variable = variable, 40 | userid = userid, 41 | ) 42 | } 43 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/TxtTocRule.kt: -------------------------------------------------------------------------------- 1 | package book.model 2 | 3 | data class TxtTocRule( 4 | // @PrimaryKey 5 | var id: Long = System.currentTimeMillis(), 6 | var name: String = "", 7 | var rule: String = "", 8 | var serialNumber: Int = -1, 9 | var enable: Boolean = true 10 | ) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/rule/BookInfoRule.kt: -------------------------------------------------------------------------------- 1 | package book.model.rule 2 | 3 | data class BookInfoRule( 4 | var init: String? = null, 5 | var name: String? = null, 6 | var author: String? = null, 7 | var intro: String? = null, 8 | var kind: String? = null, 9 | var lastChapter: String? = null, 10 | var updateTime: String? = null, 11 | var coverUrl: String? = null, 12 | var tocUrl: String? = null, 13 | var wordCount: String? = null, 14 | var canReName: String? = null 15 | ) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/rule/BookListRule.kt: -------------------------------------------------------------------------------- 1 | package book.model.rule 2 | 3 | interface BookListRule { 4 | var bookList: String? 5 | var name: String? 6 | var author: String? 7 | var intro: String? 8 | var kind: String? 9 | var lastChapter: String? 10 | var updateTime: String? 11 | var bookUrl: String? 12 | var coverUrl: String? 13 | var wordCount: String? 14 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/rule/ContentRule.kt: -------------------------------------------------------------------------------- 1 | package book.model.rule 2 | 3 | data class ContentRule( 4 | var content: String? = null, 5 | var nextContentUrl: String? = null, 6 | var title: String? = null, 7 | var webJs: String? = null, 8 | var sourceRegex: String? = null, 9 | var payAction: String? = null, 10 | var replaceRegex: String? = null, //替换规则 11 | var imageStyle: String? = null, //默认大小居中,FULL最大宽度 12 | var imageDecode: String? = null, //图片bytes二次解密js, 返回解密后的bytes 13 | ) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/rule/ExploreRule.kt: -------------------------------------------------------------------------------- 1 | package book.model.rule 2 | 3 | 4 | data class ExploreRule( 5 | override var bookList: String? = null, 6 | override var name: String? = null, 7 | override var author: String? = null, 8 | override var intro: String? = null, 9 | override var kind: String? = null, 10 | override var lastChapter: String? = null, 11 | override var updateTime: String? = null, 12 | override var bookUrl: String? = null, 13 | override var coverUrl: String? = null, 14 | override var wordCount: String? = null 15 | ) : BookListRule -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/rule/SearchRule.kt: -------------------------------------------------------------------------------- 1 | package book.model.rule 2 | 3 | data class SearchRule( 4 | override var bookList: String? = null, 5 | override var name: String? = null, 6 | override var author: String? = null, 7 | override var intro: String? = null, 8 | override var kind: String? = null, 9 | override var lastChapter: String? = null, 10 | override var updateTime: String? = null, 11 | override var bookUrl: String? = null, 12 | override var coverUrl: String? = null, 13 | override var wordCount: String? = null, 14 | var checkKeyWord: String? = null 15 | ) : BookListRule -------------------------------------------------------------------------------- /book/src/main/kotlin/book/model/rule/TocRule.kt: -------------------------------------------------------------------------------- 1 | package book.model.rule 2 | 3 | data class TocRule( 4 | var preUpdateJs: String? = null, 5 | var chapterList: String? = null, 6 | var chapterName: String? = null, 7 | var chapterUrl: String? = null, 8 | var isVolume: String? = null, 9 | var isVip: String? = null, 10 | var isPay: String ? = null, 11 | var wordCount: String? = null, 12 | var updateTime: String? = null, 13 | var nextTocUrl: String? = null 14 | ) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/AppConst.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import java.text.SimpleDateFormat 4 | 5 | object AppConst { 6 | 7 | 8 | const val UA_NAME = "User-Agent" 9 | 10 | val userAgent: String by lazy { 11 | //"Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.2)" 12 | //"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0" 13 | // "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1 Edg/132.0.0.0" 14 | //"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" 15 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.366 Edg/135.0.0.0" 16 | } 17 | 18 | val defaultuserAgent: String by lazy { 19 | "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/128.0.0.0 Mobile DuckDuckGo/5 Safari/537.36" 20 | } 21 | 22 | 23 | val TIME_FORMAT: SimpleDateFormat by lazy { 24 | SimpleDateFormat("HH:mm") 25 | } 26 | 27 | val timeFormat: SimpleDateFormat by lazy { 28 | SimpleDateFormat("HH:mm") 29 | } 30 | 31 | val dateFormat: SimpleDateFormat by lazy { 32 | SimpleDateFormat("yyyy/MM/dd HH:mm") 33 | } 34 | 35 | val fileNameFormat: SimpleDateFormat by lazy { 36 | SimpleDateFormat("yy-MM-dd-HH-mm-ss") 37 | } 38 | 39 | val keyboardToolChars: List by lazy { 40 | arrayListOf( 41 | "@", "&", "|", "%", "/", ":", "[", "]", "{", "}", "<", ">", "\\", "$", "#", "!", ".", 42 | "href", "src", "textNodes", "xpath", "json", "css", "id", "class", "tag" 43 | ) 44 | } 45 | 46 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/AppPattern.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import java.util.regex.Pattern 4 | 5 | object AppPattern { 6 | val JS_PATTERN: Pattern = 7 | Pattern.compile("([\\w\\W]*?)|@js:([\\w\\W]*)", Pattern.CASE_INSENSITIVE) 8 | val EXP_PATTERN: Pattern = Pattern.compile("\\{\\{([\\w\\W]*?)\\}\\}") 9 | val titleNumPattern: Pattern = Pattern.compile("(第)(.+?)(章)") 10 | 11 | //匹配格式化后的图片格式 12 | val imgPattern: Pattern = Pattern.compile("]*src=\"([^\"]*(?:\"[^>]+\\})?)\"[^>]*>") 13 | 14 | //dataURL图片类型 15 | val dataUriRegex = Regex("data:.*?;base64,(.*)") 16 | 17 | val nameRegex = Regex("\\s+作\\s*者.*|\\s+\\S+\\s+著") 18 | val authorRegex = Regex("^\\s*作\\s*者[::\\s]+|\\s+著") 19 | val fileNameRegex = Regex("[\\\\/:*?\"<>|.]") 20 | val splitGroupRegex = Regex("[,;,;]") 21 | 22 | //书源调试信息中的各种符号 23 | val debugMessageSymbolRegex = Regex("[⇒◇┌└≡]") 24 | 25 | //本地书籍支持类型 26 | val bookFileRegex = Regex(".*\\.(txt|epub|umd)", RegexOption.IGNORE_CASE) 27 | 28 | val semicolonRegex = ";".toRegex() 29 | 30 | /** 31 | * 所有标点 32 | */ 33 | val bdRegex = Regex("(\\p{P})+") 34 | 35 | /** 36 | * 换行 37 | */ 38 | val rnRegex = Regex("[\\r\\n]") 39 | 40 | /** 41 | * 不发音段落判断 42 | */ 43 | val notReadAloudRegex = Regex("^(\\s|\\p{C}|\\p{P}|\\p{Z}|\\p{S})+$") 44 | 45 | val xmlContentTypeRegex = "(application|text)/\\w*\\+?xml.*".toRegex() 46 | 47 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/Base64.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | object Base64 { 4 | 5 | const val DEFAULT = 0 6 | const val NO_PADDING = 1 7 | const val NO_WRAP = 2 8 | const val CRLF = 4 9 | const val URL_SAFE = 8 10 | const val NO_CLOSE = 16 11 | 12 | fun encodeToString(data: ByteArray, flags: Int): String { 13 | return book.util.crypto.Base64.encodeToString(data, flags) 14 | } 15 | 16 | fun encode(data: ByteArray?, flags: Int): ByteArray { 17 | return book.util.crypto.Base64.encode(data, flags) 18 | } 19 | 20 | 21 | fun decode(str: String, flags: Int): ByteArray { 22 | return book.util.crypto.Base64.decode(str, flags) 23 | } 24 | 25 | fun decode(str: ByteArray?, flags: Int): ByteArray { 26 | return book.util.crypto.Base64.decode(str, flags) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/ChineseUtils.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import com.github.liuyueyi.quick.transfer.ChineseUtils 4 | import com.github.liuyueyi.quick.transfer.constants.TransType 5 | 6 | object ChineseUtils { 7 | 8 | private var fixed = false 9 | 10 | fun s2t(content: String): String { 11 | return ChineseUtils.s2t(content) 12 | } 13 | 14 | fun t2s(content: String): String { 15 | if (!fixed) { 16 | fixT2sDict() 17 | } 18 | return ChineseUtils.t2s(content) 19 | } 20 | 21 | fun preLoad(async: Boolean, vararg transType: TransType) { 22 | ChineseUtils.preLoad(async, *transType) 23 | } 24 | 25 | fun unLoad(vararg transType: TransType) { 26 | ChineseUtils.unLoad(*transType) 27 | } 28 | 29 | fun fixT2sDict() { 30 | fixed = true 31 | val excludeList = listOf( 32 | "槃", 33 | "划槳", "列根", "雪梨", "雪糕", 34 | "零錢", "零钱", "離線", "碟片", "模組", "桌球", "案頭", "機車", "電漿", 35 | "鳳梨", "魔戒", "載入", "菲林", "整合", "變數", 36 | "路易斯", "非同步", "出租车", "周杰倫", "马铃薯", "馬鈴薯", "機械人", "電單車", 37 | "電扶梯", "音效卡", "飆車族", "點陣圖", "個入球", "顆進球", 38 | "魔獸紀元", "高空彈跳", "铁达尼号", 39 | "魔鬼終結者", "純文字檔案" 40 | ) 41 | ChineseUtils.loadExcludeDict(TransType.TRADITIONAL_TO_SIMPLE, excludeList) 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/EncoderUtils.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | 4 | @Suppress("unused") 5 | object EncoderUtils { 6 | 7 | fun escape(src: String): String { 8 | val tmp = StringBuilder() 9 | for (char in src) { 10 | val charCode = char.code 11 | if (charCode in 48..57 || charCode in 65..90 || charCode in 97..122) { 12 | tmp.append(char) 13 | continue 14 | } 15 | 16 | val prefix = when { 17 | charCode < 16 -> "%0" 18 | charCode < 256 -> "%" 19 | else -> "%u" 20 | } 21 | tmp.append(prefix).append(charCode.toString(16)) 22 | } 23 | return tmp.toString() 24 | } 25 | 26 | @JvmOverloads 27 | fun base64Decode(str: String, flags: Int = Base64.DEFAULT): String { 28 | val bytes = Base64.decode(str, flags) 29 | return String(bytes) 30 | } 31 | 32 | @JvmOverloads 33 | fun base64Encode(str: String, flags: Int = Base64.NO_WRAP): String? { 34 | return Base64.encodeToString(str.toByteArray(), flags) 35 | } 36 | 37 | @JvmOverloads 38 | fun base64Encode(bytes: ByteArray, flags: Int = Base64.NO_WRAP): String { 39 | return Base64.encodeToString(bytes, flags) 40 | } 41 | 42 | @JvmOverloads 43 | fun base64DecodeToByteArray(str: String, flags: Int = Base64.DEFAULT): ByteArray { 44 | return Base64.decode(str, flags) 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/File.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import java.io.File 4 | 5 | fun File.getFile(vararg subDirFiles: String): File { 6 | val path = FileUtils.getPath(this, *subDirFiles) 7 | return File(path) 8 | } 9 | 10 | fun File.exists(vararg subDirFiles: String): Boolean { 11 | return getFile(*subDirFiles).exists() 12 | } 13 | 14 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/FileExtensions.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | 4 | import java.io.File 5 | import java.io.FileOutputStream 6 | 7 | 8 | 9 | fun File.createFileIfNotExist(): File { 10 | if (!exists()) { 11 | parentFile?.createFolderIfNotExist() 12 | createNewFile() 13 | } 14 | return this 15 | } 16 | 17 | fun File.createFileReplace(): File { 18 | if (!exists()) { 19 | parent?.let { 20 | File(it).mkdirs() 21 | } 22 | createNewFile() 23 | } else { 24 | delete() 25 | createNewFile() 26 | } 27 | return this 28 | } 29 | 30 | fun File.createFolderIfNotExist(): File { 31 | if (!exists()) { 32 | mkdirs() 33 | } 34 | return this 35 | } 36 | 37 | fun File.createFolderReplace(): File { 38 | if (exists()) { 39 | FileUtils.delete(this, true) 40 | } 41 | mkdirs() 42 | return this 43 | } 44 | 45 | fun File.checkWrite(): Boolean { 46 | var file: File? = null 47 | return try { 48 | val filename = System.currentTimeMillis().toString() 49 | file = FileUtils.createFileIfNotExist(this, filename) 50 | file.outputStream().bufferedWriter().use { it.write(filename) } 51 | file.inputStream().bufferedReader().use { it.readText() == filename } 52 | } catch (e: Exception) { 53 | false 54 | } finally { 55 | file?.delete() 56 | } 57 | } 58 | 59 | fun File.outputStream(append: Boolean = false): FileOutputStream { 60 | return FileOutputStream(this, append) 61 | } 62 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/JsURL.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import java.net.URL 4 | import java.net.URLDecoder 5 | 6 | class JsURL(url: String, baseUrl: String? = null) { 7 | 8 | val searchParams: Map? 9 | val host: String 10 | val origin: String 11 | val pathname: String 12 | 13 | init { 14 | val mUrl = if (!baseUrl.isNullOrEmpty()) { 15 | val base = URL(baseUrl) 16 | URL(base, url) 17 | } else { 18 | URL(url) 19 | } 20 | host = mUrl.host 21 | origin = if (mUrl.port > 0) { 22 | "${mUrl.protocol}://$host:${mUrl}:${mUrl.port}" 23 | } else { 24 | "${mUrl.protocol}://$host:${mUrl}" 25 | } 26 | pathname = mUrl.path 27 | val query = mUrl.query 28 | searchParams = query?.let { _ -> 29 | val map = hashMapOf() 30 | query.split("&").forEach { 31 | val x = it.split("=") 32 | map[x[0]] = URLDecoder.decode(x[1], "utf-8") 33 | } 34 | map 35 | } 36 | } 37 | 38 | 39 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/JsonExtensions.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import com.jayway.jsonpath.* 4 | 5 | val jsonPath: ParseContext by lazy { 6 | JsonPath.using( 7 | Configuration.builder() 8 | .options(Option.SUPPRESS_EXCEPTIONS) 9 | .build() 10 | ) 11 | } 12 | 13 | fun ReadContext.readString(path: String): String? = this.read(path, String::class.java) 14 | 15 | fun ReadContext.readBool(path: String): Boolean? = this.read(path, Boolean::class.java) 16 | 17 | fun ReadContext.readInt(path: String): Int? = this.read(path, Int::class.java) 18 | 19 | fun ReadContext.readLong(path: String): Long? = this.read(path, Long::class.java) 20 | 21 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/LogUtils.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("unused") 2 | package book.util 3 | 4 | 5 | fun Throwable.printOnDebug() { 6 | printStackTrace() 7 | } 8 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/MD5Utils.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import java.security.MessageDigest 4 | import java.security.NoSuchAlgorithmException 5 | 6 | /** 7 | * 将字符串转化为MD5 8 | */ 9 | 10 | object MD5Utils { 11 | 12 | fun md5Encode(str: String?): String { 13 | if (str == null) return "" 14 | var reStr = "" 15 | try { 16 | val md5:MessageDigest = MessageDigest.getInstance("MD5") 17 | val bytes:ByteArray = md5.digest(str.toByteArray()) 18 | val stringBuffer:StringBuilder = StringBuilder() 19 | for (b in bytes) { 20 | val bt:Int = b.toInt() and 0xff 21 | if (bt < 16) { 22 | stringBuffer.append(0) 23 | } 24 | stringBuffer.append(Integer.toHexString(bt)) 25 | } 26 | reStr = stringBuffer.toString() 27 | } catch (e: NoSuchAlgorithmException) { 28 | e.printStackTrace() 29 | } 30 | 31 | return reStr 32 | } 33 | 34 | fun md5Encode16(str: String): String { 35 | var reStr = md5Encode(str) 36 | reStr = reStr.substring(8, 24) 37 | return reStr 38 | } 39 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/Maputil.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | fun HashMap.has(key: String, ignoreCase: Boolean = false): Boolean { 4 | for (item in this) { 5 | if (key.equals(item.key, ignoreCase)) { 6 | return true 7 | } 8 | } 9 | return false 10 | } 11 | 12 | fun HashMap.get(key: String, ignoreCase: Boolean = false): T? { 13 | for (item in this) { 14 | if (key.equals(item.key, ignoreCase)) { 15 | return item.value 16 | } 17 | } 18 | return null 19 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/MyCache.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import kotlinx.coroutines.runBlocking 4 | import kotlinx.coroutines.sync.Mutex 5 | import kotlinx.coroutines.sync.withLock 6 | 7 | class MyCache(val num:Int) { 8 | private val keys:MutableList = mutableListOf() 9 | private val map:HashMap = hashMapOf() 10 | private val mutex = Mutex() 11 | 12 | fun add(key:String, value:Any)= runBlocking{ 13 | mutex.withLock { 14 | if(keys.contains(key)){ 15 | keys.remove(key) 16 | } 17 | map[key] = value 18 | keys.add(key) 19 | runCatching { 20 | while(keys.size> num){ 21 | val k=keys[0] 22 | keys.remove(k) 23 | map.remove(k) 24 | } 25 | } 26 | } 27 | } 28 | 29 | fun remove(key:String)= runBlocking{ 30 | mutex.withLock { 31 | map.remove(key) 32 | if(keys.contains(key)){ 33 | keys.remove(key) 34 | } 35 | } 36 | } 37 | 38 | fun get(key:String):Any?{ 39 | return map[key] 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/Utf8BomUtils.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | object Utf8BomUtils { 4 | private val UTF8_BOM_BYTES = byteArrayOf(0xEF.toByte(), 0xBB.toByte(), 0xBF.toByte()) 5 | 6 | fun removeUTF8BOM(xmlText: String): String { 7 | val bytes = xmlText.toByteArray() 8 | val containsBOM = (bytes.size > 3 9 | && bytes[0] == UTF8_BOM_BYTES[0] 10 | && bytes[1] == UTF8_BOM_BYTES[1] 11 | && bytes[2] == UTF8_BOM_BYTES[2]) 12 | if (containsBOM) { 13 | return String(bytes, 3, bytes.size - 3) 14 | } 15 | return xmlText 16 | } 17 | 18 | fun removeUTF8BOM(bytes: ByteArray): ByteArray { 19 | val containsBOM = (bytes.size > 3 20 | && bytes[0] == UTF8_BOM_BYTES[0] 21 | && bytes[1] == UTF8_BOM_BYTES[1] 22 | && bytes[2] == UTF8_BOM_BYTES[2]) 23 | if (containsBOM) { 24 | val copy = ByteArray(bytes.size - 3) 25 | System.arraycopy(bytes, 3, copy, 0, bytes.size - 3) 26 | return copy 27 | } 28 | return bytes 29 | } 30 | 31 | fun hasBom(bytes: ByteArray): Boolean { 32 | return (bytes.size > 3 33 | && bytes[0] == UTF8_BOM_BYTES[0] 34 | && bytes[1] == UTF8_BOM_BYTES[1] 35 | && bytes[2] == UTF8_BOM_BYTES[2]) 36 | } 37 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/VertExt.kt: -------------------------------------------------------------------------------- 1 | package book.util 2 | 3 | import org.slf4j.LoggerFactory 4 | import java.io.File 5 | import java.nio.file.Paths 6 | 7 | var storageFinalPath = "" 8 | var workDirPath = "" 9 | var workDirInit = false 10 | class VertExt 11 | private val logger = LoggerFactory.getLogger(VertExt::class.java) 12 | 13 | fun getWorkDir(subPath: String = ""): String { 14 | if (!workDirInit && workDirPath.isEmpty()) { 15 | var osName = System.getProperty("os.name") 16 | var currentDir = System.getProperty("user.dir") 17 | logger.info("osName: {} currentDir: {}", osName, currentDir) 18 | // MacOS 存放目录为用户目录 19 | if (osName.startsWith("Mac OS", true) && !currentDir.startsWith("/Users/")) { 20 | workDirPath = Paths.get(System.getProperty("user.home"), ".reader").toString() 21 | } else { 22 | workDirPath = currentDir 23 | } 24 | workDirInit = true 25 | } 26 | var path = Paths.get(workDirPath, subPath); 27 | logger.info(subPath, path) 28 | return path.toString(); 29 | } 30 | 31 | fun getWorkDir(vararg subDirFiles: String): String { 32 | return getWorkDir(getRelativePath(*subDirFiles)) 33 | } 34 | 35 | fun getRelativePath(vararg subDirFiles: String): String { 36 | val path = StringBuilder("") 37 | subDirFiles.forEach { 38 | if (it.isNotEmpty()) { 39 | path.append(File.separator).append(it) 40 | } 41 | } 42 | return path.toString().let{ 43 | if (it.startsWith("/")) { 44 | it.substring(1) 45 | } else { 46 | it 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/help/CookieManager.kt: -------------------------------------------------------------------------------- 1 | package book.util.help 2 | 3 | interface CookieManager { 4 | 5 | /** 6 | * 保存cookie 7 | */ 8 | fun setCookie(url: String, cookie: String?) 9 | 10 | /** 11 | * 替换cookie 12 | */ 13 | fun replaceCookie(url: String, cookie: String) 14 | 15 | /** 16 | * 获取cookie 17 | */ 18 | fun getCookie(url: String): String 19 | 20 | /** 21 | * 移除cookie 22 | */ 23 | fun removeCookie(url: String) 24 | 25 | fun cookieToMap(cookie: String): MutableMap 26 | 27 | fun mapToCookie(cookieMap: Map?): String? 28 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/help/DefaultData.kt: -------------------------------------------------------------------------------- 1 | package book.util.help 2 | 3 | import book.model.TxtTocRule 4 | import book.util.GSON 5 | import book.util.fromJsonArray 6 | 7 | object DefaultData { 8 | const val txtTocRuleFileName = "txtTocRule.json" 9 | 10 | val txtTocRules: List by lazy { 11 | val json = String(DefaultData::class.java.getResource("/defaultData/${txtTocRuleFileName}").readBytes()) 12 | GSON.fromJsonArray(json).getOrNull() ?: emptyList() 13 | } 14 | 15 | // val rssSources by lazy { 16 | // val json = String( 17 | // File("defaultData${File.separator}rssSources.json") 18 | // .readBytes() 19 | // ) 20 | // GSON.fromJsonArray(json)!! 21 | // } 22 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/http/ByteConverter.kt: -------------------------------------------------------------------------------- 1 | package book.util.http 2 | 3 | import okhttp3.ResponseBody 4 | import retrofit2.Converter 5 | import retrofit2.Retrofit 6 | import java.lang.reflect.Type 7 | 8 | class ByteConverter : Converter.Factory() { 9 | 10 | override fun responseBodyConverter( 11 | type: Type?, 12 | annotations: Array?, 13 | retrofit: Retrofit? 14 | ): Converter? { 15 | return Converter { value -> 16 | value.bytes() 17 | } 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/http/DecompressInterceptor.kt: -------------------------------------------------------------------------------- 1 | package book.util.http 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Response 5 | import okhttp3.ResponseBody.Companion.asResponseBody 6 | import okhttp3.internal.http.promisesBody 7 | import okio.buffer 8 | import okio.source 9 | import java.util.zip.GZIPInputStream 10 | import java.util.zip.Inflater 11 | import java.util.zip.InflaterInputStream 12 | 13 | object DecompressInterceptor : Interceptor { 14 | override fun intercept(chain: Interceptor.Chain): Response { 15 | val request = chain.request() 16 | val requestBuilder = request.newBuilder() 17 | 18 | var transparentDecompress = false 19 | if (request.header("Accept-Encoding") == null && request.header("Range") == null) { 20 | transparentDecompress = true 21 | requestBuilder.header("Accept-Encoding", "gzip, deflate") 22 | } 23 | 24 | val response = chain.proceed(requestBuilder.build()) 25 | val body = response.body 26 | 27 | if (!transparentDecompress || !response.promisesBody() || body == null) { 28 | return response 29 | } 30 | 31 | val encoding = response.header("Content-Encoding")?.lowercase() 32 | val source = when (encoding) { 33 | "gzip" -> GZIPInputStream(body.byteStream()).source().buffer() 34 | "deflate" -> InflaterInputStream(body.byteStream(), Inflater(true)).source().buffer() 35 | else -> return response 36 | } 37 | 38 | return response.newBuilder() 39 | .removeHeader("Content-Encoding") 40 | .removeHeader("Content-Length") 41 | .body(source.asResponseBody(body.contentType(), -1)) 42 | .build() 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/http/OkHttpExceptionInterceptor.kt: -------------------------------------------------------------------------------- 1 | package book.util.http 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Response 5 | import java.io.IOException 6 | 7 | object OkHttpExceptionInterceptor : Interceptor { 8 | 9 | @Throws(IOException::class) 10 | override fun intercept(chain: Interceptor.Chain): Response { 11 | try { 12 | return chain.proceed(chain.request()) 13 | } catch (e: IOException) { 14 | throw e 15 | } catch (e: Throwable) { 16 | throw IOException(e) 17 | } 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/http/OkhttpUncaughtExceptionHandler.kt: -------------------------------------------------------------------------------- 1 | package book.util.http 2 | 3 | 4 | 5 | object OkhttpUncaughtExceptionHandler : Thread.UncaughtExceptionHandler { 6 | 7 | override fun uncaughtException(t: Thread, e: Throwable) { 8 | println("Okhttp Dispatcher中的线程执行出错\n${e.localizedMessage}" ) 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/util/http/RequestMethod.kt: -------------------------------------------------------------------------------- 1 | package book.util.http 2 | 3 | enum class RequestMethod { 4 | GET, POST 5 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/Debug.kt: -------------------------------------------------------------------------------- 1 | package book.webBook 2 | 3 | import org.slf4j.Logger 4 | import org.slf4j.LoggerFactory 5 | 6 | private val logger: Logger = LoggerFactory.getLogger(Debug::class.java) 7 | 8 | object Debug : DebugLog{ 9 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/DebugLog.kt: -------------------------------------------------------------------------------- 1 | package book.webBook 2 | 3 | import okhttp3.logging.HttpLoggingInterceptor 4 | import org.slf4j.Logger 5 | import org.slf4j.LoggerFactory 6 | 7 | private val logger: Logger = LoggerFactory.getLogger(DebugLog::class.java) 8 | 9 | interface DebugLog: HttpLoggingInterceptor.Logger { 10 | fun log( 11 | sourceUrl: String? = "", 12 | msg: String? = "", 13 | isHtml: Boolean = false 14 | ) { 15 | logger.info("sourceUrl: {}, msg: {}", sourceUrl, msg) 16 | } 17 | 18 | override fun log(message: String) { 19 | logger.debug(message) 20 | } 21 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/analyzeRule/CustomUrl.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.analyzeRule 2 | 3 | import book.util.GSON 4 | import book.util.fromJsonObject 5 | 6 | class CustomUrl(url: String) { 7 | 8 | private val mUrl: String 9 | private val attribute = hashMapOf() 10 | 11 | init { 12 | val urlMatcher = AnalyzeUrl.paramPattern.matcher(url) 13 | mUrl = if (urlMatcher.find()) { 14 | val attr = url.substring(urlMatcher.end()) 15 | GSON.fromJsonObject>(attr).getOrNull()?.let { 16 | attribute.putAll(it) 17 | } 18 | url.substring(0, urlMatcher.start()) 19 | } else { 20 | url 21 | } 22 | } 23 | 24 | fun putAttribute(key: String, value: Any?): CustomUrl { 25 | if (value == null) { 26 | attribute.remove(key) 27 | } else { 28 | attribute[key] = value 29 | } 30 | return this 31 | } 32 | 33 | fun getUrl(): String { 34 | return mUrl 35 | } 36 | 37 | fun getAttr(): Map { 38 | return attribute 39 | } 40 | 41 | override fun toString(): String { 42 | if (attribute.isEmpty()) { 43 | return mUrl 44 | } 45 | return mUrl + "," + GSON.toJson(attribute) 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/analyzeRule/RuleData.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.analyzeRule 2 | 3 | import book.util.GSON 4 | 5 | class RuleData : RuleDataInterface { 6 | 7 | override var userid: String ="" 8 | 9 | 10 | override val variableMap by lazy { 11 | hashMapOf() 12 | } 13 | 14 | override fun putBigVariable(key: String, value: String?) { 15 | if (value == null) { 16 | variableMap.remove(key) 17 | } else { 18 | variableMap[key] = value 19 | } 20 | } 21 | 22 | override fun getBigVariable(key: String): String? { 23 | return null 24 | } 25 | 26 | fun getVariable(): String? { 27 | if (variableMap.isEmpty()) { 28 | return null 29 | } 30 | return GSON.toJson(variableMap) 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/analyzeRule/RuleDataInterface.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.analyzeRule 2 | 3 | interface RuleDataInterface { 4 | 5 | 6 | val variableMap: HashMap 7 | 8 | var userid: String 9 | 10 | fun putVariable(key: String, value: String?): Boolean { 11 | val keyExist = variableMap.contains(key) 12 | return when { 13 | value == null -> { 14 | variableMap.remove(key) 15 | putBigVariable(key, null) 16 | keyExist 17 | } 18 | 19 | /* value.length < 10000 -> { 20 | putBigVariable(key, value) 21 | variableMap[key] = value 22 | true 23 | }*/ 24 | 25 | else -> { 26 | variableMap.remove(key) 27 | putBigVariable(key, value) 28 | keyExist 29 | } 30 | } 31 | } 32 | 33 | fun getVariable(key: String): String { 34 | return variableMap[key] ?: getBigVariable(key) ?: "" 35 | } 36 | 37 | fun putBigVariable(key: String, value: String?) 38 | 39 | fun getBigVariable(key: String): String? 40 | 41 | 42 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/analyzeRule/SymmetricCryptoAndroid.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.analyzeRule 2 | 3 | 4 | import book.util.EncoderUtils 5 | import cn.hutool.crypto.symmetric.SymmetricCrypto 6 | import java.io.InputStream 7 | import java.nio.charset.Charset 8 | 9 | class SymmetricCryptoAndroid( 10 | algorithm: String, 11 | key: ByteArray?, 12 | ) : SymmetricCrypto(algorithm, key) { 13 | 14 | override fun encryptBase64(data: ByteArray): String { 15 | return EncoderUtils.base64Encode(encrypt(data)) 16 | } 17 | 18 | override fun encryptBase64(data: String, charset: String?): String { 19 | return EncoderUtils.base64Encode(encrypt(data, charset)) 20 | } 21 | 22 | override fun encryptBase64(data: String, charset: Charset?): String { 23 | return EncoderUtils.base64Encode(encrypt(data, charset)) 24 | } 25 | 26 | override fun encryptBase64(data: String): String { 27 | return EncoderUtils.base64Encode(encrypt(data)) 28 | } 29 | 30 | override fun encryptBase64(data: InputStream): String { 31 | return EncoderUtils.base64Encode(encrypt(data)) 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/exception/ActivelyCancelException.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.exception 2 | 3 | import kotlin.coroutines.cancellation.CancellationException 4 | 5 | class ActivelyCancelException : CancellationException() { 6 | 7 | override fun fillInStackTrace(): Throwable { 8 | stackTrace = emptyArray() 9 | return this 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/exception/ConcurrentException.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.exception 2 | 3 | class ConcurrentException(msg: String, val waitTime: Int) : NoStackTraceException(msg) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/exception/NoStackTraceException.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.exception 2 | 3 | /** 4 | * 不记录错误堆栈的报错 5 | */ 6 | open class NoStackTraceException(msg: String) : Exception(msg) { 7 | 8 | override fun fillInStackTrace(): Throwable { 9 | return this 10 | } 11 | 12 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/exception/RegexTimeoutException.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.exception 2 | 3 | class RegexTimeoutException(msg: String) : NoStackTraceException(msg) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/exception/TocEmptyException.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.exception 2 | 3 | /** 4 | * 目录为空 5 | */ 6 | class TocEmptyException(msg: String) : NoStackTraceException(msg) -------------------------------------------------------------------------------- /book/src/main/kotlin/book/webBook/localBook/BaseLocalBookParse.kt: -------------------------------------------------------------------------------- 1 | package book.webBook.localBook 2 | 3 | import book.model.Book 4 | import book.model.BookChapter 5 | import java.io.InputStream 6 | 7 | interface BaseLocalBookParse { 8 | 9 | fun upBookInfo(book: Book) 10 | 11 | fun getChapterList(book: Book): ArrayList 12 | 13 | fun getContent(book: Book, chapter: BookChapter): String? 14 | 15 | fun getImage(book: Book, href: String): InputStream? 16 | 17 | } 18 | -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/Bindings.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Decompiled with CFR 0.152. 3 | */ 4 | package com.script 5 | 6 | interface Bindings : MutableMap { 7 | 8 | override fun containsKey(key: String): Boolean 9 | 10 | override operator fun get(key: String): Any? 11 | 12 | override fun put(key: String, value: Any?): Any? 13 | 14 | override fun putAll(from: Map) 15 | 16 | override fun remove(key: String): Any? 17 | 18 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/Compilable.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Decompiled with CFR 0.152. 3 | */ 4 | package com.script 5 | 6 | import java.io.Reader 7 | 8 | interface Compilable { 9 | 10 | @Throws(ScriptException::class) 11 | fun compile(script: Reader): CompiledScript 12 | 13 | @Throws(ScriptException::class) 14 | fun compile(script: String): CompiledScript 15 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/CompiledScript.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Decompiled with CFR 0.152. 3 | */ 4 | package com.script 5 | 6 | import com.script.ScriptContext.Companion.ENGINE_SCOPE 7 | import com.script.ScriptContext.Companion.GLOBAL_SCOPE 8 | import org.mozilla.javascript.Scriptable 9 | import kotlin.coroutines.CoroutineContext 10 | 11 | abstract class CompiledScript { 12 | 13 | abstract fun getEngine(): ScriptEngine 14 | 15 | @Throws(ScriptException::class) 16 | abstract fun eval(context: ScriptContext): Any? 17 | 18 | @Throws(ScriptException::class) 19 | abstract fun eval(scope: Scriptable): Any? 20 | 21 | @Throws(ScriptException::class) 22 | abstract fun eval(scope: Scriptable, coroutineContext: CoroutineContext?): Any? 23 | 24 | @Throws(ScriptException::class) 25 | abstract suspend fun evalSuspend(scope: Scriptable): Any? 26 | 27 | @Throws(ScriptException::class) 28 | fun eval(bindings: Bindings?): Any? { 29 | var ctxt = getEngine().context 30 | if (bindings != null) { 31 | val tempContext = SimpleScriptContext() 32 | tempContext.setBindings(bindings, ENGINE_SCOPE) 33 | tempContext.setBindings(ctxt.getBindings(GLOBAL_SCOPE), GLOBAL_SCOPE) 34 | tempContext.writer = ctxt.writer 35 | tempContext.reader = ctxt.reader 36 | tempContext.errorWriter = ctxt.errorWriter 37 | ctxt = tempContext 38 | } 39 | return this.eval(ctxt) 40 | } 41 | 42 | @Throws(ScriptException::class) 43 | fun eval(): Any? { 44 | return this.eval(getEngine().context) 45 | } 46 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/Invocable.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Decompiled with CFR 0.152. 3 | */ 4 | package com.script 5 | 6 | interface Invocable { 7 | fun getInterface(clazz: Class): T? 8 | 9 | fun getInterface(obj: Any?, paramClass: Class): T? 10 | 11 | @Throws(ScriptException::class, NoSuchMethodException::class) 12 | fun invokeFunction(name: String, vararg args: Any): Any? 13 | 14 | @Throws(ScriptException::class, NoSuchMethodException::class) 15 | fun invokeMethod(obj: Any?, name: String, vararg args: Any): Any? 16 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/RhinoContextFactory.kt: -------------------------------------------------------------------------------- 1 | package com.script 2 | 3 | import org.mozilla.javascript.ContextFactory 4 | 5 | open class RhinoContextFactory : ContextFactory() { 6 | 7 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/ScriptBindings.kt: -------------------------------------------------------------------------------- 1 | package com.script 2 | 3 | import org.mozilla.javascript.Context 4 | import org.mozilla.javascript.NativeObject 5 | import org.mozilla.javascript.ScriptableObject 6 | 7 | class ScriptBindings : NativeObject() { 8 | 9 | companion object { 10 | private val topLevelScope: ScriptableObject by lazy { 11 | val cx = Context.enter() 12 | try { 13 | cx.initStandardObjects() 14 | } finally { 15 | Context.exit() 16 | } 17 | } 18 | } 19 | 20 | init { 21 | prototype = topLevelScope 22 | } 23 | 24 | operator fun set(key: String, value: Any?) { 25 | Context.enter() 26 | try { 27 | put(key, this, Context.javaToJS(value, this)) 28 | } finally { 29 | Context.exit() 30 | } 31 | } 32 | 33 | operator fun set(index: Int, value: Any?) { 34 | Context.enter() 35 | try { 36 | put(index, this, Context.javaToJS(value, this)) 37 | } finally { 38 | Context.exit() 39 | } 40 | } 41 | 42 | fun put(key: String, value: Any?) { 43 | set(key, value) 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/ScriptBindingsExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.script 2 | 3 | import org.mozilla.javascript.Context 4 | 5 | inline fun buildScriptBindings(block: (bindings: ScriptBindings) -> Unit): ScriptBindings { 6 | val bindings = ScriptBindings() 7 | Context.enter() 8 | try { 9 | block(bindings) 10 | } finally { 11 | Context.exit() 12 | } 13 | return bindings 14 | } 15 | -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/ScriptContext.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Decompiled with CFR 0.152. 3 | */ 4 | package com.script 5 | 6 | import java.io.Reader 7 | import java.io.Writer 8 | 9 | interface ScriptContext { 10 | 11 | var errorWriter: Writer 12 | 13 | var reader: Reader 14 | 15 | val scopes: List 16 | 17 | var writer: Writer 18 | 19 | fun getAttribute(name: String): Any? 20 | 21 | fun getAttribute(name: String, scope: Int): Any? 22 | 23 | fun getAttributesScope(name: String): Int 24 | 25 | fun getBindings(scope: Int): Bindings? 26 | 27 | fun removeAttribute(name: String, scope: Int): Any? 28 | 29 | fun setAttribute(name: String, value: Any?, scope: Int) 30 | 31 | fun setBindings(bindings: Bindings?, scope: Int) 32 | 33 | companion object { 34 | const val ENGINE_SCOPE = 100 35 | const val GLOBAL_SCOPE = 200 36 | } 37 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/ScriptException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Decompiled with CFR 0.152. 3 | */ 4 | package com.script 5 | 6 | class ScriptException : Exception { 7 | var columnNumber: Int 8 | private set 9 | var fileName: String? 10 | private set 11 | var lineNumber: Int 12 | private set 13 | 14 | constructor(s: String?) : super(s) { 15 | fileName = null 16 | lineNumber = -1 17 | columnNumber = -1 18 | } 19 | 20 | constructor(e: Exception?) : super(e) { 21 | fileName = null 22 | lineNumber = -1 23 | columnNumber = -1 24 | } 25 | 26 | constructor(message: String?, fileName2: String?, lineNumber2: Int) : super(message) { 27 | fileName = fileName2 28 | lineNumber = lineNumber2 29 | columnNumber = -1 30 | } 31 | 32 | constructor(message: String?, fileName2: String?, lineNumber2: Int, columnNumber2: Int) : super( 33 | message 34 | ) { 35 | fileName = fileName2 36 | lineNumber = lineNumber2 37 | columnNumber = columnNumber2 38 | } 39 | 40 | override val message: String 41 | get() { 42 | val ret = super.message 43 | if (fileName == null) { 44 | return ret!! 45 | } 46 | var ret2 = "$ret in $fileName" 47 | if (lineNumber != -1) { 48 | ret2 = "$ret2 at line number $lineNumber" 49 | } 50 | return if (columnNumber != -1) { 51 | "$ret2 at column number $columnNumber" 52 | } else ret2 53 | } 54 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/SimpleBindings.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Decompiled with CFR 0.152. 3 | */ 4 | package com.script 5 | 6 | class SimpleBindings @JvmOverloads constructor( 7 | private val map: MutableMap = HashMap() 8 | ) : Bindings { 9 | 10 | override fun put(key: String, value: Any?): Any? { 11 | return map.put(key, value) 12 | } 13 | 14 | override fun putAll(from: Map) { 15 | map.putAll(from) 16 | } 17 | 18 | override fun clear() { 19 | map.clear() 20 | } 21 | 22 | override fun containsKey(key: String): Boolean { 23 | return map.containsKey(key) 24 | } 25 | 26 | override fun containsValue(value: Any?): Boolean { 27 | return map.containsValue(value) 28 | } 29 | 30 | override val entries: MutableSet> 31 | get() = map.entries 32 | 33 | override operator fun get(key: String): Any? { 34 | return map[key] 35 | } 36 | 37 | override fun isEmpty(): Boolean { 38 | return map.isEmpty() 39 | } 40 | 41 | override val keys: MutableSet 42 | get() = map.keys 43 | 44 | override fun remove(key: String): Any? { 45 | return map.remove(key) 46 | } 47 | 48 | override val size: Int 49 | get() = map.size 50 | 51 | override val values: MutableCollection 52 | get() = map.values 53 | 54 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/rhino/RhinoContext.kt: -------------------------------------------------------------------------------- 1 | package com.script.rhino 2 | 3 | import kotlinx.coroutines.CancellationException 4 | import kotlinx.coroutines.ensureActive 5 | import org.mozilla.javascript.Context 6 | import org.mozilla.javascript.ContextFactory 7 | import kotlin.coroutines.CoroutineContext 8 | 9 | class RhinoContext(factory: ContextFactory) : Context(factory) { 10 | 11 | var coroutineContext: CoroutineContext? = null 12 | 13 | @Throws(RhinoInterruptError::class) 14 | fun ensureActive() { 15 | try { 16 | coroutineContext?.ensureActive() 17 | } catch (e: CancellationException) { 18 | throw RhinoInterruptError(e) 19 | } 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/rhino/RhinoInterruptedError.kt: -------------------------------------------------------------------------------- 1 | package com.script.rhino 2 | 3 | class RhinoInterruptError(override val cause: Throwable) : Error() 4 | -------------------------------------------------------------------------------- /book/src/main/kotlin/com/script/rhino/VMBridgeReflect.kt: -------------------------------------------------------------------------------- 1 | package com.script.rhino 2 | 3 | import org.mozilla.javascript.VMBridge 4 | 5 | object VMBridgeReflect { 6 | 7 | val instance: VMBridge by lazy { 8 | VMBridge::class.java.getDeclaredField("instance").apply { 9 | isAccessible = true 10 | }.get(null) as VMBridge 11 | } 12 | 13 | val contextLocal: ThreadLocal by lazy { 14 | @Suppress("UNCHECKED_CAST") 15 | instance::class.java.getDeclaredField("contextLocal").apply { 16 | isAccessible = true 17 | }.get(null) as ThreadLocal 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/Constants.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib; 2 | 3 | 4 | public interface Constants { 5 | 6 | String CHARACTER_ENCODING = "UTF-8"; 7 | String DOCTYPE_XHTML = ""; 8 | String NAMESPACE_XHTML = "http://www.w3.org/1999/xhtml"; 9 | String EPUB_GENERATOR_NAME = "Ag2S EpubLib"; 10 | String EPUB_DUOKAN_NAME = "DK-SONGTI"; 11 | char FRAGMENT_SEPARATOR_CHAR = '#'; 12 | String DEFAULT_TOC_ID = "toc"; 13 | } 14 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/browsersupport/NavigationEventListener.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.browsersupport; 2 | 3 | /** 4 | * Implemented by classes that want to be notified if the user moves to 5 | * another location in the book. 6 | * 7 | * @author paul 8 | * 9 | */ 10 | public interface NavigationEventListener { 11 | 12 | /** 13 | * Called whenever the user navigates to another position in the book. 14 | * 15 | * @param navigationEvent f 16 | */ 17 | void navigationPerformed(NavigationEvent navigationEvent); 18 | } -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/browsersupport/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Provides classes that help make an epub reader application. 3 | * 4 | * These classes have no dependencies on graphic toolkits, they're purely 5 | * to help with the browsing/navigation logic. 6 | */ 7 | package me.ag2s.epublib.browsersupport; 8 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/EpubResourceProvider.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.util.zip.ZipEntry; 6 | import java.util.zip.ZipFile; 7 | 8 | /** 9 | * @author jake 10 | */ 11 | public class EpubResourceProvider implements LazyResourceProvider { 12 | 13 | private final String epubFilename; 14 | 15 | /** 16 | * @param epubFilename the file name for the epub we're created from. 17 | */ 18 | public EpubResourceProvider(String epubFilename) { 19 | this.epubFilename = epubFilename; 20 | } 21 | 22 | @Override 23 | public InputStream getResourceStream(String href) throws IOException { 24 | ZipFile zipFile = new ZipFile(epubFilename); 25 | ZipEntry zipEntry = zipFile.getEntry(href); 26 | if (zipEntry == null) { 27 | zipFile.close(); 28 | throw new IllegalStateException( 29 | "Cannot find entry " + href + " in epub file " + epubFilename); 30 | } 31 | return new ResourceInputStream(zipFile.getInputStream(zipEntry), zipFile); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/FileResourceProvider.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | 3 | import java.io.File; 4 | import java.io.FileInputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | 8 | /** 9 | * 用于创建epub,添加大文件(如大量图片)时容易OOM,使用LazyResource,避免OOM. 10 | * 11 | */ 12 | 13 | public class FileResourceProvider implements LazyResourceProvider { 14 | //需要导入资源的父目录 15 | String dir; 16 | 17 | /** 18 | * 创建一个文件夹里面文件夹的LazyResourceProvider,用于LazyResource。 19 | * @param parentDir 文件的目录 20 | */ 21 | public FileResourceProvider(String parentDir) { 22 | this.dir = parentDir; 23 | } 24 | 25 | /** 26 | * 创建一个文件夹里面文件夹的LazyResourceProvider,用于LazyResource。 27 | * @param parentFile 文件夹 28 | */ 29 | @SuppressWarnings("unused") 30 | public FileResourceProvider(File parentFile) { 31 | this.dir = parentFile.getPath(); 32 | } 33 | 34 | /** 35 | * 根据子文件名href,再父目录下读取文件获取FileInputStream 36 | * @param href 子文件名href 37 | * @return 对应href的FileInputStream 38 | * @throws IOException 抛出IOException 39 | */ 40 | @Override 41 | public InputStream getResourceStream(String href) throws IOException { 42 | return new FileInputStream(new File(dir, href)); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/LazyResourceProvider.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | 6 | /** 7 | * @author jake 8 | */ 9 | public interface LazyResourceProvider { 10 | 11 | InputStream getResourceStream(String href) throws IOException; 12 | } 13 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/ManifestItemProperties.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | @SuppressWarnings("unused") 3 | public enum ManifestItemProperties implements ManifestProperties { 4 | COVER_IMAGE("cover-image"), 5 | MATHML("mathml"), 6 | NAV("nav"), 7 | REMOTE_RESOURCES("remote-resources"), 8 | SCRIPTED("scripted"), 9 | SVG("svg"), 10 | SWITCH("switch"); 11 | 12 | private final String name; 13 | 14 | ManifestItemProperties(String name) { 15 | this.name = name; 16 | } 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/ManifestItemRefProperties.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | @SuppressWarnings("unused") 3 | public enum ManifestItemRefProperties implements ManifestProperties { 4 | PAGE_SPREAD_LEFT("page-spread-left"), 5 | PAGE_SPREAD_RIGHT("page-spread-right"); 6 | 7 | private final String name; 8 | 9 | ManifestItemRefProperties(String name) { 10 | this.name = name; 11 | } 12 | 13 | public String getName() { 14 | return name; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/ManifestProperties.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | 3 | public interface ManifestProperties { 4 | 5 | String getName(); 6 | } 7 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/ResourceInputStream.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | 3 | import java.io.FilterInputStream; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | import java.util.zip.ZipFile; 7 | 8 | /** 9 | * A wrapper class for closing a ZipFile object when the InputStream derived 10 | * from it is closed. 11 | * 12 | * @author ttopalov 13 | */ 14 | public class ResourceInputStream extends FilterInputStream { 15 | 16 | private final ZipFile zipFile; 17 | 18 | /** 19 | * Constructor. 20 | * 21 | * @param in 22 | * The InputStream object. 23 | * @param zipFile 24 | * The ZipFile object. 25 | */ 26 | public ResourceInputStream(InputStream in, ZipFile zipFile) { 27 | super(in); 28 | this.zipFile = zipFile; 29 | } 30 | 31 | @Override 32 | public void close() throws IOException { 33 | super.close(); 34 | zipFile.close(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/domain/ResourceReference.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.domain; 2 | 3 | import java.io.Serializable; 4 | 5 | public class ResourceReference implements Serializable { 6 | 7 | private static final long serialVersionUID = 2596967243557743048L; 8 | 9 | protected Resource resource; 10 | 11 | public ResourceReference(Resource resource) { 12 | this.resource = resource; 13 | } 14 | 15 | 16 | public Resource getResource() { 17 | return resource; 18 | } 19 | 20 | /** 21 | * Besides setting the resource it also sets the fragmentId to null. 22 | * 23 | * @param resource resource 24 | */ 25 | public void setResource(Resource resource) { 26 | this.resource = resource; 27 | } 28 | 29 | 30 | /** 31 | * The id of the reference referred to. 32 | * 33 | * null of the reference is null or has a null id itself. 34 | * 35 | * @return The id of the reference referred to. 36 | */ 37 | public String getResourceId() { 38 | if (resource != null) { 39 | return resource.getId(); 40 | } 41 | return null; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/epub/BookProcessor.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.epub; 2 | 3 | import me.ag2s.epublib.domain.EpubBook; 4 | 5 | /** 6 | * Post-processes a book. 7 | * 8 | * Can be used to clean up a book after reading or before writing. 9 | * 10 | * @author paul 11 | */ 12 | public interface BookProcessor { 13 | 14 | /** 15 | * A BookProcessor that returns the input book unchanged. 16 | */ 17 | BookProcessor IDENTITY_BOOKPROCESSOR = book -> book; 18 | 19 | EpubBook processBook(EpubBook book); 20 | } 21 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/epub/HtmlProcessor.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.epub; 2 | 3 | import me.ag2s.epublib.domain.Resource; 4 | import java.io.OutputStream; 5 | @SuppressWarnings("unused") 6 | public interface HtmlProcessor { 7 | 8 | void processHtmlResource(Resource resource, OutputStream out); 9 | } 10 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/util/NoCloseOutputStream.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.util; 2 | 3 | import java.io.IOException; 4 | import java.io.OutputStream; 5 | 6 | /** 7 | * OutputStream with the close() disabled. 8 | * We write multiple documents to a ZipOutputStream. 9 | * Some of the formatters call a close() after writing their data. 10 | * We don't want them to do that, so we wrap regular OutputStreams in this NoCloseOutputStream. 11 | * 12 | * @author paul 13 | */ 14 | @SuppressWarnings("unused") 15 | public class NoCloseOutputStream extends OutputStream { 16 | 17 | private final OutputStream outputStream; 18 | 19 | public NoCloseOutputStream(OutputStream outputStream) { 20 | this.outputStream = outputStream; 21 | } 22 | 23 | @Override 24 | public void write(int b) throws IOException { 25 | outputStream.write(b); 26 | } 27 | 28 | /** 29 | * A close() that does not call it's parent's close() 30 | */ 31 | public void close() { 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/epublib/util/NoCloseWriter.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.epublib.util; 2 | 3 | import java.io.IOException; 4 | import java.io.Writer; 5 | 6 | /** 7 | * Writer with the close() disabled. 8 | * We write multiple documents to a ZipOutputStream. 9 | * Some of the formatters call a close() after writing their data. 10 | * We don't want them to do that, so we wrap regular Writers in this NoCloseWriter. 11 | * 12 | * @author paul 13 | */ 14 | @SuppressWarnings("unused") 15 | public class NoCloseWriter extends Writer { 16 | 17 | private final Writer writer; 18 | 19 | public NoCloseWriter(Writer writer) { 20 | this.writer = writer; 21 | } 22 | 23 | @Override 24 | public void close() { 25 | } 26 | 27 | @Override 28 | public void flush() throws IOException { 29 | writer.flush(); 30 | } 31 | 32 | @Override 33 | public void write(char[] cbuf, int off, int len) throws IOException { 34 | writer.write(cbuf, off, len); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /book/src/main/kotlin/me/ag2s/umdlib/domain/UmdEnd.java: -------------------------------------------------------------------------------- 1 | package me.ag2s.umdlib.domain; 2 | 3 | import java.io.IOException; 4 | 5 | import me.ag2s.umdlib.tool.WrapOutputStream; 6 | 7 | /** 8 | * End part of UMD book, nothing to be special 9 | * 10 | * @author Ray Liang (liangguanhui@qq.com) 11 | * 2009-12-20 12 | */ 13 | public class UmdEnd { 14 | 15 | public void buildEnd(WrapOutputStream wos) throws IOException { 16 | wos.writeBytes('#', 0x0C, 0, 0x01, 0x09); 17 | wos.writeInt(wos.getWritten() + 4); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #keytool -genkeypair -alias mykey -keyalg RSA -keystore mykeystore.jks -validity 365 2 | jarsigner -keystore /Users/q9uo11/mykeystore.jks -storepass 123456 -keypass 123456 build/libs/solon-read-1.0-SNAPSHOT.jar mykey -------------------------------------------------------------------------------- /conf/conf.yml: -------------------------------------------------------------------------------- 1 | solon.dataSources: 2 | db: 3 | class: "com.zaxxer.hikari.HikariDataSource" 4 | driverClassName: org.sqlite.JDBC 5 | jdbcUrl: jdbc:sqlite:read.db 6 | maxPoolSize: 1 7 | admin: 8 | username: "admin" 9 | password: "adminadmin" 10 | #code: "接口的code参数" //如果需要使用获取邀请码参数请修改这个参数,重启生效 11 | user: 12 | allowuptxt: false #是否允许上传txt 允许 true 不允许 false 13 | allowcache: false #是否允许添加缓存 允许 true 不允许 false 14 | allowimg: false #是否使用图片解密 允许 true 不允许 false 15 | source: 0 #0为不允许修改书源,1为允许修改后台书源,2独立书源 16 | smtp: 17 | host: #smtp邮箱host 18 | protocols: TLSv1.2 #通讯协议 19 | port: #端口 20 | account: #邮箱账号 21 | password: #邮箱密码,部分邮箱是安全码 22 | personal: #发送人的昵称 23 | codesubject: 验证码 #验证码邮件的主题 24 | codetext: 您的验证码是$code,当前验证码十分钟有效请尽快使用 #验证码邮件的内容,必须有$code,发送邮件时会把$code替换成验证码 25 | default: 26 | tts: #默认tts链接 27 | rule: #默认净化链接 -------------------------------------------------------------------------------- /conf/mysqlconf.yml: -------------------------------------------------------------------------------- 1 | solon.dataSources: 2 | db: 3 | class: "com.zaxxer.hikari.HikariDataSource" 4 | driverClassName: com.mysql.cj.jdbc.Driver 5 | jdbcUrl: jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC 6 | username: 用户 7 | password: 密码 8 | admin: 9 | username: "admin" 10 | password: "adminadmin" 11 | #code: "接口的code参数" //如果需要使用获取邀请码参数请修改这个参数,重启生效 12 | user: 13 | allowuptxt: false #是否允许上传txt 允许 true 不允许 false 14 | allowcache: false #是否允许添加缓存 允许 true 不允许 false 15 | allowimg: false #是否使用图片解密 允许 true 不允许 false 16 | source: 0 #0为不允许修改书源,1为允许修改后台书源,2独立书源 17 | smtp: 18 | host: #smtp邮箱host 19 | protocols: TLSv1.2 #通讯协议 20 | port: #端口 21 | account: #邮箱账号 22 | password: #邮箱密码,部分邮箱是安全码 23 | personal: #发送人的昵称 24 | codesubject: 验证码 #验证码邮件的主题 25 | codetext: 您的验证码是$code,当前验证码十分钟有效请尽快使用 #验证码邮件的内容,必须有$code,发送邮件时会把$code替换成验证码 26 | default: 27 | tts: #默认tts链接 28 | rule: #默认净化链接 -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Jan 08 02:40:21 CST 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /png/book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/book.png -------------------------------------------------------------------------------- /png/cookie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/cookie.png -------------------------------------------------------------------------------- /png/editsource.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/editsource.jpg -------------------------------------------------------------------------------- /png/faxian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/faxian.png -------------------------------------------------------------------------------- /png/found.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/found.jpg -------------------------------------------------------------------------------- /png/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/home.png -------------------------------------------------------------------------------- /png/home2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/home2.png -------------------------------------------------------------------------------- /png/home3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/home3.jpg -------------------------------------------------------------------------------- /png/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/login.png -------------------------------------------------------------------------------- /png/my.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/my.jpg -------------------------------------------------------------------------------- /png/read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/read.png -------------------------------------------------------------------------------- /png/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/search.png -------------------------------------------------------------------------------- /png/source.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/source.jpg -------------------------------------------------------------------------------- /png/sourcelogin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/png/sourcelogin.jpg -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" 3 | } 4 | rootProject.name = "solon-read" 5 | include("book") 6 | -------------------------------------------------------------------------------- /src/main/kotlin/web/App.kt: -------------------------------------------------------------------------------- 1 | package web 2 | 3 | 4 | import org.noear.solon.Solon 5 | import org.noear.solon.annotation.SolonMain 6 | import org.noear.solon.scheduling.annotation.EnableScheduling 7 | import org.noear.solon.web.cors.CrossFilter 8 | import org.noear.solon.web.staticfiles.StaticMappings 9 | import org.noear.solon.web.staticfiles.repository.FileStaticRepository 10 | 11 | 12 | @SolonMain 13 | @EnableScheduling 14 | class App 15 | 16 | 17 | fun main(args: Array) { 18 | Solon.start(App::class.java, args) { app -> 19 | app.enableSessionState(true) 20 | app.enableWebSocket(true); 21 | app.filter(CrossFilter().pathPatterns("/assets/covers/**").allowedOrigins("*")) 22 | app.filter(CrossFilter().pathPatterns("/assets/codes/**").allowedOrigins("*")) 23 | StaticMappings.add("/assets/", FileStaticRepository("storage/assets/")); 24 | app.get("/") { ctx -> ctx.forward("/index.html"); } 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/config/CacheConfig.kt: -------------------------------------------------------------------------------- 1 | package web.config 2 | 3 | import org.noear.solon.annotation.Bean 4 | import org.noear.solon.annotation.Configuration 5 | import org.noear.solon.annotation.Inject 6 | import org.noear.solon.data.cache.CacheService 7 | import org.noear.solon.data.cache.CacheServiceSupplier 8 | 9 | 10 | @Configuration 11 | class CacheConfig { 12 | 13 | @Bean 14 | fun cahce(@Inject("\${cache}") supplier: CacheServiceSupplier): CacheService { 15 | return supplier.get() 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/controller/admin/HomeController.kt: -------------------------------------------------------------------------------- 1 | package web.controller.admin 2 | 3 | import org.noear.solon.annotation.Controller 4 | import org.noear.solon.annotation.Get 5 | import org.noear.solon.annotation.Mapping 6 | import org.noear.solon.core.handle.ModelAndView 7 | 8 | 9 | 10 | @Controller 11 | @Mapping("/admin") 12 | class HomeController { 13 | 14 | @get:Get 15 | @get:Mapping("/adduser") 16 | val adduser = ModelAndView("admin/adduser.html") 17 | 18 | @get:Get 19 | @get:Mapping("/addcookie") 20 | val addcookie = ModelAndView("admin/addcookie.html") 21 | 22 | @get:Get 23 | @get:Mapping("/login") 24 | val login =ModelAndView("login.html") 25 | 26 | @get:Get 27 | @get:Mapping("/?") 28 | val index =ModelAndView("admin/index.html").also { 29 | it.put("index","layui-this") 30 | } 31 | 32 | @get:Get 33 | @get:Mapping("/book") 34 | val book =ModelAndView("admin/book.html").also { 35 | it.put("book","layui-this") 36 | } 37 | 38 | @get:Get 39 | @get:Mapping("/rss") 40 | val rss =ModelAndView("admin/rss.html").also { 41 | it.put("rss","layui-this") 42 | } 43 | 44 | @get:Get 45 | @get:Mapping("/code") 46 | val cookie =ModelAndView("admin/code.html").also { 47 | it.put("code","layui-this") 48 | } 49 | 50 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/controller/admin/LoginContorller.kt: -------------------------------------------------------------------------------- 1 | package web.controller.admin 2 | 3 | import org.noear.solon.annotation.* 4 | import org.noear.solon.core.handle.Context 5 | import org.noear.solon.core.util.DataThrowable 6 | import web.response.* 7 | import web.util.admin.loginok 8 | import web.util.admin.logout as logout2 9 | 10 | 11 | @Controller 12 | @Mapping("/admin") 13 | class LoginContorller { 14 | 15 | @Inject(value = "\${admin.username}", autoRefreshed=true) 16 | lateinit var _username:String 17 | 18 | @Inject(value = "\${admin.password}", autoRefreshed=true) 19 | lateinit var _password: String 20 | 21 | 22 | 23 | @Post 24 | @Mapping("/login") 25 | fun login(ctx: Context, username: String?, password: String?)=run { 26 | if (username.isNullOrBlank() || password.isNullOrBlank() ) { 27 | throw DataThrowable().data(JsonResponse(isSuccess = false, errorMsg = NOT_BANK)) 28 | } 29 | 30 | if(_username.equals(username) && _password.equals(password)) { 31 | loginok(username!!,ctx) 32 | JsonResponse(true) 33 | }else{ 34 | JsonResponse(isSuccess = false, errorMsg =PASS_ERROR ) 35 | } 36 | } 37 | 38 | 39 | 40 | @Mapping("/logout") 41 | fun logout(ctx: Context){ 42 | logout2(ctx) 43 | ctx.redirect("/admin/login") 44 | } 45 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/cron/CacheJob.kt: -------------------------------------------------------------------------------- 1 | package web.cron 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper 4 | import kotlinx.coroutines.runBlocking 5 | import org.noear.solon.annotation.Inject 6 | import org.noear.solon.scheduling.annotation.Scheduled 7 | import org.slf4j.LoggerFactory 8 | import web.cron.BookJob.Companion 9 | import web.model.BookCache 10 | import web.model.Booklist 11 | import web.util.mapper.mapper 12 | import web.util.read.Bookcache 13 | import kotlin.concurrent.thread 14 | 15 | @Scheduled(fixedRate = 1000 * 60) 16 | class CacheJob: Runnable { 17 | private val logger = LoggerFactory.getLogger(BookJob::class.java) 18 | companion object { 19 | private var isupdatebookcron = false 20 | } 21 | 22 | @Inject(value = "\${admin.cron:true}", autoRefreshed=true) 23 | var cron:Boolean=true 24 | 25 | override fun run() = runBlocking{ 26 | if(!cron){ 27 | return@runBlocking 28 | } 29 | if (isupdatebookcron) { 30 | return@runBlocking 31 | } 32 | logger.info("开始添加缓存") 33 | isupdatebookcron = true 34 | val caches = mapper.get().bookCacheMapper.selectList(QueryWrapper()) 35 | runCatching { 36 | caches.forEach { 37 | thread { Bookcache.addcache(it.id!!) } 38 | } 39 | } 40 | logger.info("已添加缓存完成") 41 | isupdatebookcron = false 42 | } 43 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/cron/Gcjob.kt: -------------------------------------------------------------------------------- 1 | package web.cron 2 | 3 | import org.noear.solon.scheduling.annotation.Scheduled 4 | 5 | @Scheduled(fixedRate = 1000 * 60*60*24) 6 | class Gcjob: Runnable { 7 | 8 | override fun run(){ 9 | System.gc() 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/cron/JsonFileJob.kt: -------------------------------------------------------------------------------- 1 | package web.cron 2 | 3 | import org.noear.solon.scheduling.annotation.Scheduled 4 | import java.io.File 5 | import java.nio.file.Files 6 | import java.nio.file.attribute.BasicFileAttributes 7 | 8 | @Scheduled(fixedRate = 1000 * 60*60*24) 9 | class JsonFileJob : Runnable{ 10 | val filepath="storage/assets/json" 11 | 12 | override fun run(){ 13 | var file= File(filepath) 14 | file.walk().maxDepth(1).forEach { 15 | if(it.isFile && it.extension == "json"){ 16 | kotlin.runCatching { 17 | val attributes = Files.readAttributes(it.toPath(), BasicFileAttributes::class.java) 18 | val creationTime = attributes.creationTime() 19 | val instant = creationTime.toInstant() 20 | val time=(System.currentTimeMillis()-instant.toEpochMilli())/(60*60*24*1000) 21 | if(time > 7){ 22 | it.delete() 23 | } 24 | } 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/filter/ErrorsFilter.kt: -------------------------------------------------------------------------------- 1 | package web.filter 2 | 3 | import com.google.gson.Gson 4 | import org.noear.solon.annotation.Component 5 | import org.noear.solon.core.exception.StatusException 6 | import org.noear.solon.core.handle.Context 7 | import org.noear.solon.core.handle.Filter 8 | import org.noear.solon.core.handle.FilterChain 9 | import org.noear.solon.core.handle.ModelAndView 10 | import org.slf4j.LoggerFactory 11 | import web.model.Users 12 | 13 | 14 | @Component(index = 0) 15 | class ErrorsFilter : Filter { 16 | 17 | val log = LoggerFactory.getLogger(ErrorsFilter::class.java) 18 | 19 | override fun doFilter(ctx: Context?, chain: FilterChain?) { 20 | runCatching { 21 | chain!!.doFilter(ctx) 22 | }.onFailure { 23 | when(it){ 24 | is StatusException->{ 25 | if(it.code == 404){ 26 | ctx!!.status(it.code) 27 | ctx.render(ModelAndView("errors/404.html")) 28 | }else{ 29 | ctx!!.status(it.code) 30 | throw it 31 | } 32 | } 33 | else->{ 34 | ctx!!.status(500) 35 | throw it 36 | } 37 | } 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/interceptor/AdminAuthInterceptorImpl.kt: -------------------------------------------------------------------------------- 1 | package web.interceptor 2 | 3 | import org.noear.solon.core.handle.Handler 4 | import org.noear.solon.annotation.Component 5 | import org.noear.solon.core.handle.Context 6 | import org.noear.solon.core.route.PathRule 7 | import org.noear.solon.core.route.RouterInterceptor 8 | import org.noear.solon.core.route.RouterInterceptorChain 9 | import web.util.admin.islogin 10 | 11 | 12 | @Component 13 | class AdminAuthInterceptorImpl: RouterInterceptor { 14 | override fun pathPatterns(): PathRule { 15 | return PathRule().include("/admin").include("/admin/**").exclude("/admin/login") 16 | } 17 | 18 | @Throws(Throwable::class) 19 | override fun doIntercept(ctx: Context, mainHandler: Handler?, chain: RouterInterceptorChain) { 20 | if (islogin(ctx)){ 21 | chain.doIntercept(ctx, mainHandler); 22 | }else{ 23 | ctx.redirect("/admin/login") 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/BookCacheMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Delete 5 | import org.apache.ibatis.annotations.Param 6 | import org.apache.ibatis.annotations.Select 7 | import org.apache.ibatis.annotations.Update 8 | import web.model.BookCache 9 | import web.model.Booklist 10 | 11 | interface BookCacheMapper : BaseMapper{ 12 | 13 | @Delete("Delete FROM book_cache WHERE userid = #{id}") 14 | fun delUserCache(@Param("id") id: String): Int 15 | 16 | 17 | @Delete("Delete FROM book_cache WHERE userid = #{id} and bookid = #{bookid}") 18 | fun delBookCache(@Param("id") id: String ,@Param("bookid") bookid: String): Int 19 | 20 | @Select("SELECT * FROM book_cache WHERE userid = #{id} and bookid = #{bookid} LIMIT 1") 21 | fun getCache(@Param("id") id: String ,@Param("bookid") bookid: String): BookCache? 22 | 23 | 24 | @Update("UPDATE book_cache set total_chapter_num = #{total_chapter_num} WHERE id = #{id}") 25 | fun updatetime(@Param("id") id: String,@Param("total_chapter_num") total_chapter_num: Int):Int 26 | 27 | 28 | @Select("SELECT * FROM book_cache WHERE userid = #{id} ") 29 | fun getlistbyuserid(@Param("id") id: String ): List 30 | 31 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/BookGroupMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Delete 5 | import org.apache.ibatis.annotations.Param 6 | import org.apache.ibatis.annotations.Select 7 | import web.model.BookGroup 8 | 9 | interface BookGroupMapper : BaseMapper { 10 | 11 | 12 | @Select("SELECT * FROM book_group WHERE userid = #{id} ") 13 | fun getGroupbyuserid(@Param("id") id: String ): List 14 | 15 | @Select("SELECT * FROM book_group WHERE bookgroup = #{bookgroup} and userid = #{id} LIMIT 1" ) 16 | fun getGroupbyName(@Param("id") id: String ,@Param("bookgroup") bookgroup: String): BookGroup? 17 | 18 | @Delete("Delete FROM book_group WHERE userid = #{id}") 19 | fun delUsergroup(@Param("id") id: String): Int 20 | 21 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/BookSourceMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Param 5 | import org.apache.ibatis.annotations.Select 6 | import org.apache.ibatis.annotations.Update 7 | import web.model.BookSource 8 | 9 | interface BookSourceMapper : BaseMapper { 10 | @Select("SELECT * FROM book_source WHERE book_source_url = #{bookSourceUrl} LIMIT 1") 11 | fun getBookSource(@Param("bookSourceUrl") bookSourceUrl: String): BookSource? 12 | 13 | @Select("SELECT * FROM book_source WHERE enabled= #{enabled} order by sourceorder asc") 14 | fun getBookSourcelist(@Param("enabled") enabled: Boolean): List? 15 | 16 | @Select("SELECT * FROM book_source order by sourceorder asc") 17 | fun getallBookSourcelist(): List? 18 | 19 | 20 | @Update("UPDATE book_source set enabled= #{enabled} WHERE book_source_url = #{bookSourceUrl}") 21 | fun changeEnabled(@Param("bookSourceUrl") bookSourceUrl: String,@Param("enabled") enabled: Boolean):Int 22 | 23 | @Update("UPDATE book_source set enabled_explore= #{enabled} WHERE book_source_url = #{bookSourceUrl}") 24 | fun changeenabledExplore(@Param("bookSourceUrl") bookSourceUrl: String,@Param("enabled") enabled: Boolean):Int 25 | 26 | @Update("UPDATE book_source set sourceorder= #{sourceorder} WHERE book_source_url = #{bookSourceUrl}") 27 | fun changeorder(@Param("bookSourceUrl") bookSourceUrl: String,@Param("sourceorder") sourceorder: Int):Int 28 | 29 | 30 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/CodeMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Param 5 | import org.apache.ibatis.annotations.Select 6 | import web.model.Code 7 | 8 | interface CodeMapper: BaseMapper { 9 | 10 | @Select("SELECT * FROM code WHERE code = #{code} LIMIT 1") 11 | fun getCode(@Param("code") code: String): Code? 12 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/HttpTTSMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Param 5 | import org.apache.ibatis.annotations.Select 6 | import web.model.HttpTts 7 | 8 | interface HttpTTSMapper: BaseMapper { 9 | 10 | @Select("SELECT * FROM http_tts WHERE id = #{id} and userid = #{userid} LIMIT 1") 11 | fun gettts(@Param("id") id: String,@Param("userid") userid: String): HttpTts? 12 | 13 | @Select("SELECT * FROM http_tts WHERE id = #{id} and userid = #{userid}") 14 | fun gettts2(@Param("id") id: String,@Param("userid") userid: String): List? 15 | 16 | @Select("SELECT * FROM http_tts WHERE userid = #{userid} and name = #{name}") 17 | fun getttsbyname(@Param("userid") userid: String, @Param("name") name: String): List 18 | 19 | @Select("SELECT * FROM http_tts WHERE userid = #{userid} ") 20 | fun getalltts(@Param("userid") userid: String): List 21 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/RssSourceMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Param 5 | import org.apache.ibatis.annotations.Select 6 | import org.apache.ibatis.annotations.Update 7 | import web.model.BookSource 8 | import web.model.RssSource 9 | 10 | interface RssSourceMapper : BaseMapper { 11 | @Select("SELECT * FROM rss_source order by sourceorder asc") 12 | fun getallSourcelist(): List? 13 | 14 | @Select("SELECT * FROM rss_source where enabled = true order by sourceorder asc") 15 | fun getEnabledSourcelist(): List? 16 | 17 | @Select("SELECT * FROM rss_source WHERE source_url = #{source_url} LIMIT 1") 18 | fun getRssSource(@Param("source_url") source_url: String): RssSource? 19 | 20 | @Update("UPDATE rss_source set sourceorder= #{sourceorder} WHERE source_url = #{source_url}") 21 | fun changeorder(@Param("source_url") source_url: String,@Param("sourceorder") sourceorder: Int):Int 22 | 23 | @Update("UPDATE rss_source set enabled= #{enabled} WHERE source_url = #{source_url}") 24 | fun changeEnabled(@Param("source_url") source_url: String,@Param("enabled") enabled: Boolean):Int 25 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/UserCookieMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Delete 5 | import org.apache.ibatis.annotations.Param 6 | import org.apache.ibatis.annotations.Select 7 | import web.model.Booklist 8 | import web.model.UserCookie 9 | 10 | interface UserCookieMapper: BaseMapper { 11 | 12 | @Select("SELECT * FROM user_cookie WHERE userid = #{id} and host = #{url} LIMIT 1") 13 | fun getcookie(@Param("id") id: String, @Param("url") url: String): UserCookie? 14 | 15 | @Select("SELECT * FROM user_cookie WHERE userid = #{id} and host like '%\${url}%' LIMIT 1") 16 | fun getcookiemo(@Param("id") id: String, @Param("url") url: String): UserCookie? 17 | 18 | @Delete("Delete FROM user_cookie WHERE userid = #{id} and host = #{url}") 19 | fun removeCookie(@Param("id") id: String, @Param("url") url: String): Int 20 | 21 | @Delete("Delete FROM user_cookie WHERE userid = #{id}") 22 | fun delUsercookies(@Param("id") id: String): Int 23 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/UserRssSourceMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Delete 5 | import org.apache.ibatis.annotations.Param 6 | import org.apache.ibatis.annotations.Select 7 | import org.apache.ibatis.annotations.Update 8 | import web.model.UserRssSource 9 | 10 | interface UserRssSourceMapper : BaseMapper { 11 | 12 | 13 | @Select("SELECT * FROM user_rss_source WHERE userid = #{userid} order by sourceorder asc") 14 | fun getallSourcelist(@Param("userid") userid: String): List? 15 | 16 | 17 | @Select("SELECT * FROM user_rss_source WHERE source_url = #{source_url} and userid = #{userid} LIMIT 1") 18 | fun getRssSource(@Param("source_url") source_url: String, @Param("userid") userid: String): UserRssSource? 19 | 20 | @Update("UPDATE user_rss_source set sourceorder= #{sourceorder} WHERE id = #{id}") 21 | fun changeorder(@Param("id") id: String, @Param("sourceorder") sourceorder: Int): Int 22 | 23 | @Update("UPDATE user_rss_source set enabled= #{enabled} WHERE id = #{id}") 24 | fun changeEnabled(@Param("id") id: String, @Param("enabled") enabled: Boolean):Int 25 | 26 | @Delete("Delete FROM user_rss_source WHERE source_url = #{source_url} and userid = #{userid}") 27 | fun delRssSource(@Param("source_url") source_url: String,@Param("userid") userid: String): Int 28 | 29 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/mapper/UsertockenMapper.kt: -------------------------------------------------------------------------------- 1 | package web.mapper 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 4 | import org.apache.ibatis.annotations.Delete 5 | import org.apache.ibatis.annotations.Param 6 | import org.apache.ibatis.annotations.Select 7 | import web.model.Usertocken 8 | 9 | interface UsertockenMapper: BaseMapper { 10 | 11 | @Select("SELECT * FROM usertocken WHERE userid = #{id}") 12 | fun getUsertockens(@Param("id") id: String): List? 13 | 14 | @Delete("Delete FROM usertocken WHERE userid = #{id}") 15 | fun delUsertockens(@Param("id") id: String): Int 16 | 17 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/model/BaseRssSource.kt: -------------------------------------------------------------------------------- 1 | package web.model 2 | 3 | import java.time.LocalDateTime 4 | 5 | class BaseRssSource( 6 | var sourceUrl: String = "", 7 | var sourceName: String = "", 8 | var sourceIcon: String = "", 9 | var sourceorder: Int? = null, 10 | var sourceGroup: String? = null, 11 | var sourceComment: String? = null, 12 | var enabled: Boolean? = null, 13 | var json: String? = null, 14 | var createtime: LocalDateTime? = null 15 | ) -------------------------------------------------------------------------------- /src/main/kotlin/web/model/BaseSource.kt: -------------------------------------------------------------------------------- 1 | package web.model 2 | 3 | 4 | data class BaseSource ( 5 | var bookSourceUrl: String , // 地址,包括 http/https 6 | var bookSourceName: String? = null , // 名称 7 | var bookSourceGroup: String? = null, 8 | var sourceorder: Int? = null, 9 | var bookSourceType: Int? = null , // 类型,0 文本,1 音频 10 | var enabled: Boolean = false , // 是否启用 11 | var enabledExplore: Boolean? = null , //启用发现 12 | var json: String , 13 | ){} -------------------------------------------------------------------------------- /src/main/kotlin/web/model/BookGroup.kt: -------------------------------------------------------------------------------- 1 | package web.model 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill 4 | import com.baomidou.mybatisplus.annotation.TableField 5 | import com.baomidou.mybatisplus.annotation.TableId 6 | import org.dromara.autotable.annotation.AutoTable 7 | import org.dromara.autotable.annotation.PrimaryKey 8 | import org.noear.snack.annotation.ONodeAttr 9 | import web.util.hash.Md5 10 | import java.time.LocalDateTime 11 | 12 | @AutoTable(value = "book_group") 13 | class BookGroup { 14 | @TableId 15 | @PrimaryKey 16 | var id : String? =null 17 | 18 | var userid : String? =null 19 | 20 | var bookgroup : String? = null 21 | 22 | @ONodeAttr(format = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 23 | @TableField(fill = FieldFill.INSERT,value = "createtime") 24 | var createtime: LocalDateTime? = null 25 | 26 | fun create(userid:String,bookgroup:String):BookGroup{ 27 | this.bookgroup=bookgroup 28 | this.userid = userid 29 | this.createtime = LocalDateTime.now() 30 | this.id = Md5("$userid${this.bookgroup}") 31 | return this 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/model/Code.kt: -------------------------------------------------------------------------------- 1 | package web.model 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill 4 | import com.baomidou.mybatisplus.annotation.TableField 5 | import com.baomidou.mybatisplus.annotation.TableId 6 | import org.dromara.autotable.annotation.AutoTable 7 | import org.dromara.autotable.annotation.PrimaryKey 8 | import org.noear.snack.annotation.ONodeAttr 9 | import java.time.LocalDateTime 10 | import java.util.* 11 | 12 | 13 | @AutoTable(value = "code") 14 | class Code { 15 | @TableId 16 | @PrimaryKey() 17 | var code: String? = null 18 | 19 | 20 | 21 | @ONodeAttr(format = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 22 | @TableField(fill = FieldFill.INSERT,value = "createtime") 23 | var createtime: LocalDateTime? = null 24 | 25 | fun create(code:String):Code{ 26 | this.code = code 27 | this.createtime = LocalDateTime.now() 28 | return this 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/model/ReplaceRule.kt: -------------------------------------------------------------------------------- 1 | package web.model 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.TableId 5 | import org.dromara.autotable.annotation.AutoTable 6 | import org.dromara.autotable.annotation.ColumnType 7 | import org.dromara.autotable.annotation.PrimaryKey 8 | import web.util.hash.Md5 9 | 10 | @AutoTable(value = "replace_rule") 11 | class ReplaceRule { 12 | 13 | @TableId 14 | @PrimaryKey 15 | var id : String? =null 16 | 17 | var userid : String? =null 18 | //名称 19 | var name: String = "" 20 | //分组 21 | var groupname: String? = null 22 | //替换内容 23 | @ColumnType(value = "LONGTEXT") 24 | var pattern: String = "" 25 | //替换为 26 | @ColumnType(value = "LONGTEXT") 27 | var replacement: String = "" 28 | //作用范围 29 | @ColumnType(value = "LONGTEXT") 30 | var scope: String? = null 31 | //作用于标题 32 | var scopeTitle: Boolean = false 33 | //作用于正文 34 | var scopeContent: Boolean = true 35 | //排除范围 36 | @ColumnType(value = "LONGTEXT") 37 | var excludeScope: String? = null 38 | //是否启用 39 | var isEnabled: Boolean = true 40 | //是否正则 41 | var isRegex: Boolean = true 42 | //超时时间 43 | var timeoutMillisecond: Long = 3000L 44 | //排序 45 | var ruleorder: Int = Int.MIN_VALUE 46 | 47 | 48 | fun getValidTimeoutMillisecond(): Long { 49 | if (timeoutMillisecond <= 0) { 50 | return 3000L 51 | } 52 | return timeoutMillisecond 53 | } 54 | 55 | fun create(userid:String,name:String):ReplaceRule{ 56 | this.userid = userid 57 | this.name = name 58 | this.id = Md5(userid+name) 59 | return this 60 | } 61 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/model/UserCookie.kt: -------------------------------------------------------------------------------- 1 | package web.model 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill 4 | import com.baomidou.mybatisplus.annotation.TableField 5 | import com.baomidou.mybatisplus.annotation.TableId 6 | import org.dromara.autotable.annotation.AutoTable 7 | import org.dromara.autotable.annotation.ColumnType 8 | import org.dromara.autotable.annotation.PrimaryKey 9 | import org.noear.snack.annotation.ONodeAttr 10 | import web.util.hash.Md5 11 | import java.time.LocalDateTime 12 | import java.util.* 13 | 14 | @AutoTable(value = "user_cookie") 15 | class UserCookie { 16 | @TableId 17 | @PrimaryKey 18 | var id : String? =null 19 | 20 | var userid : String? =null 21 | 22 | var host : String? = null 23 | 24 | @ColumnType(value = "MEDIUMTEXT") 25 | var value:String? = null 26 | 27 | @ONodeAttr(format = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 28 | @TableField(fill = FieldFill.INSERT,value = "createtime") 29 | var createtime: LocalDateTime? = null 30 | 31 | fun create(userid:String,host:String):UserCookie{ 32 | this.id = Md5("$userid,$host") 33 | this.userid = userid 34 | this.createtime = LocalDateTime.now() 35 | this.host = host 36 | return this 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/model/Usertocken.kt: -------------------------------------------------------------------------------- 1 | package web.model 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill 4 | import com.baomidou.mybatisplus.annotation.TableField 5 | import com.baomidou.mybatisplus.annotation.TableId 6 | import org.dromara.autotable.annotation.AutoTable 7 | import org.dromara.autotable.annotation.PrimaryKey 8 | import org.noear.snack.annotation.ONodeAttr 9 | import java.time.LocalDateTime 10 | import java.util.* 11 | 12 | @AutoTable(value = "usertocken") 13 | class Usertocken { 14 | @TableId 15 | @PrimaryKey 16 | var id : String? =null 17 | var model: String? =null 18 | var userid : String? =null //用户id 19 | 20 | @ONodeAttr(format = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 21 | @TableField(fill = FieldFill.INSERT,value = "createtime") 22 | var createtime: LocalDateTime? = null 23 | 24 | fun create():Usertocken{ 25 | this.id = UUID.randomUUID().toString() 26 | this.createtime = LocalDateTime.now() 27 | return this 28 | } 29 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/response/JsonResponse.kt: -------------------------------------------------------------------------------- 1 | package web.response 2 | 3 | class JsonResponse (val isSuccess:Boolean, val errorMsg:String){ 4 | 5 | 6 | var data:Any? = null 7 | 8 | constructor(isSuccess:Boolean):this(isSuccess, errorMsg = if (isSuccess) SUCCESS else "") 9 | 10 | 11 | fun Data(data:Any?) : JsonResponse { 12 | this.data = data 13 | return this 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/response/PageResponse.kt: -------------------------------------------------------------------------------- 1 | package web.response 2 | 3 | class PageResponse(val count:Long, val page:Int,val data:Any){ 4 | val code:Int=0 5 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/response/static.kt: -------------------------------------------------------------------------------- 1 | package web.response 2 | 3 | val NEED_LOGIN = "NEED_LOGIN" 4 | 5 | val NOT_BANK = "NOT_BANK" 6 | 7 | val PASS_ERROR = "用户名或密码错误" 8 | 9 | val EMAIL_CHECK_ERROR = "邮箱填写错误" 10 | 11 | val EMAIL_IS = "邮箱已存在" 12 | 13 | val NOT_SOURCE = "书源不存在" 14 | 15 | val IS_WEBVIEW = "webview书源不支持缓存" 16 | 17 | val SUCCESS = "success" 18 | 19 | val BOOKSEARCHERROR="通过书源获取书本信息失败" 20 | 21 | val BOOKIS="书本已在书架" 22 | 23 | val CacheIS="当前书本已在缓存进程中" 24 | 25 | val GROUPIS="分组已存在" 26 | 27 | val NO_BOOK="书本不存在" 28 | 29 | val NO_PAY="购买操作不存在" 30 | 31 | val NOT_ALLOW_TXT ="不允许导入图书" 32 | 33 | val NOT_TXT ="当前文件格式不支持" 34 | 35 | val PASS_VAIL_ERROR="密码长度请在6位到15位之间" 36 | 37 | val EMAIL_ERROR="邮箱格式不正确" 38 | 39 | val PHONE_ERROR="手机号不正确" 40 | 41 | val USER_IS="用户名已存在" 42 | 43 | val USER_NOT="用户不存在" 44 | 45 | val NOT_IS="不存在" 46 | 47 | val USE_ERROE="错误使用" 48 | 49 | val COOKIE_IS="cookie已存在,请删除后重新添加" 50 | 51 | val USERNAME_NOT_CHANGE="不允许修改用户名" 52 | 53 | val SOURCE_URL_BANK="书源链接不能为空" 54 | 55 | val SOURCE_TYPE_ERROR="暂不支持非文本连接" 56 | 57 | val JSON_ERROR="json格式化错误" 58 | 59 | val DO_ERROR="导入失败" 60 | 61 | val NUM_ERROR="最小不能小于0" 62 | 63 | val ADD_ERROR="添加失败" 64 | 65 | val CODE_ERROR="邀请码不存在" 66 | 67 | val CAN_NOT="无权限" 68 | 69 | val SOURCE_JSON_ERROR="书源格式化错误" 70 | 71 | val SOURCE_URL_ERROR="书源URL不呢为空" 72 | 73 | val SOURCE_IS = "书源已存在" 74 | 75 | val CACHE_ERROR="最多5个缓存任务" 76 | 77 | val CODE_CHECK_ERROR= "验证码错误" 78 | 79 | val NAME_ERROR="名字重复" -------------------------------------------------------------------------------- /src/main/kotlin/web/util/ResponseManager.kt: -------------------------------------------------------------------------------- 1 | package web.util 2 | 3 | import kotlinx.coroutines.CompletableDeferred 4 | import java.util.concurrent.ConcurrentHashMap 5 | 6 | // 请求响应管理器(线程安全) 7 | object ResponseManager { 8 | private val pendingRequests = ConcurrentHashMap>() 9 | 10 | fun registerRequest(correlationId: String): CompletableDeferred { 11 | return CompletableDeferred().also { deferred -> 12 | pendingRequests[correlationId] = deferred 13 | } 14 | } 15 | 16 | fun completeRequest(correlationId: String, result: String) { 17 | pendingRequests.remove(correlationId)?.complete(result) 18 | } 19 | 20 | fun cleanupExpiredRequest(correlationId: String) { 21 | pendingRequests.remove(correlationId)?.cancel() 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/SslUtils.kt: -------------------------------------------------------------------------------- 1 | package web.util 2 | 3 | import java.security.cert.CertificateException 4 | import java.security.cert.X509Certificate 5 | import javax.net.ssl.* 6 | 7 | 8 | object SslUtils { 9 | @Throws(Exception::class) 10 | private fun trustAllHttpsCertificates() { 11 | val trustAllCerts = arrayOfNulls(1) 12 | val tm: TrustManager = miTM() 13 | trustAllCerts[0] = tm 14 | val sc = SSLContext.getInstance("SSL") 15 | sc.init(null, trustAllCerts, null) 16 | HttpsURLConnection.setDefaultSSLSocketFactory(sc.socketFactory) 17 | } 18 | 19 | /** 20 | * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用 21 | * @throws Exception 22 | */ 23 | @Throws(Exception::class) 24 | fun ignoreSsl() { 25 | val hv = HostnameVerifier { urlHostName, session -> 26 | println("Warning: URL Host: " + urlHostName + " vs. " + session.peerHost) 27 | true 28 | } 29 | trustAllHttpsCertificates() 30 | HttpsURLConnection.setDefaultHostnameVerifier(hv) 31 | } 32 | 33 | internal class miTM : TrustManager, X509TrustManager { 34 | override fun getAcceptedIssuers(): Array? { 35 | return null 36 | } 37 | 38 | fun isServerTrusted(certs: Array?): Boolean { 39 | return true 40 | } 41 | 42 | fun isClientTrusted(certs: Array?): Boolean { 43 | return true 44 | } 45 | 46 | @Throws(CertificateException::class) 47 | override fun checkServerTrusted(certs: Array, authType: String) { 48 | return 49 | } 50 | 51 | @Throws(CertificateException::class) 52 | override fun checkClientTrusted(certs: Array, authType: String) { 53 | return 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/kotlin/web/util/admin/static.kt: -------------------------------------------------------------------------------- 1 | package web.util.admin 2 | 3 | import org.noear.solon.core.handle.Context 4 | import web.model.Code 5 | import web.util.hash.Sha256 6 | import java.util.* 7 | 8 | fun getRandomString(length: Int) : String { 9 | val charset = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz0123456789" 10 | return (1..length) 11 | .map { charset.random() } 12 | .joinToString("") 13 | } 14 | 15 | fun getRandomNumString(length: Int) : String { 16 | val charset = "0123456789" 17 | return (1..length) 18 | .map { charset.random() } 19 | .joinToString("") 20 | } 21 | 22 | 23 | fun loginok(username:String, ctx: Context){ 24 | ctx.sessionSet("username", username) 25 | } 26 | 27 | fun logout(ctx: Context) { 28 | ctx.sessionRemove("username") 29 | } 30 | 31 | fun islogin(ctx: Context) :Boolean =run{ 32 | if(ctx.session("username") != null && ctx.session("username").toString().isNotBlank()){ 33 | true 34 | }else{ 35 | false 36 | } 37 | } 38 | 39 | fun getMailCode():String{ 40 | val randoms = getRandomNumString(6) 41 | return randoms 42 | } 43 | 44 | 45 | fun getcodes(num:Int):MutableList{ 46 | var codes = mutableListOf() 47 | var date= Date().time 48 | for(i in 1..num){ 49 | val randoms = getRandomString(6) 50 | val code= "$date$randoms" 51 | codes.add(code) 52 | } 53 | return codes 54 | } 55 | 56 | 57 | fun passsign(password: String):String{ 58 | return Sha256(password) 59 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/gson/LocalDateTimeAdapter.kt: -------------------------------------------------------------------------------- 1 | package web.util.gson 2 | 3 | 4 | import com.google.gson.* 5 | import java.lang.reflect.Type 6 | import java.time.LocalDateTime 7 | import java.time.format.DateTimeFormatter 8 | 9 | 10 | class LocalDateTimeAdapter : JsonSerializer, 11 | JsonDeserializer { 12 | override fun serialize(src: LocalDateTime?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement? { 13 | return JsonPrimitive(formatter.format(src)) 14 | } 15 | 16 | @Throws(JsonParseException::class) 17 | override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): LocalDateTime { 18 | return LocalDateTime.parse(json.asString, formatter) 19 | } 20 | 21 | companion object { 22 | private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /src/main/kotlin/web/util/hash/hash.kt: -------------------------------------------------------------------------------- 1 | package web.util.hash 2 | 3 | import java.security.MessageDigest 4 | 5 | fun hash(algorithm: String, srcStr: String): String { 6 | try { 7 | val result = StringBuilder() 8 | val md = MessageDigest.getInstance(algorithm) 9 | val bytes = md.digest(srcStr.toByteArray(charset("utf-8"))) 10 | for (b in bytes) { 11 | val hex = Integer.toHexString(b.toInt() and 0xFF) 12 | if (hex.length == 1) 13 | result.append("0") 14 | result.append(hex) 15 | } 16 | return result.toString() 17 | } catch (e: Exception) { 18 | throw RuntimeException(e) 19 | } 20 | 21 | } 22 | 23 | fun hash(algorithm: String, bytes: ByteArray): ByteArray { 24 | try { 25 | val md = MessageDigest.getInstance(algorithm) 26 | md.update(bytes) 27 | return md.digest() 28 | } catch (e: Exception) { 29 | throw RuntimeException(e) 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/hash/md5.kt: -------------------------------------------------------------------------------- 1 | package web.util.hash 2 | 3 | fun Md5(srcStr: String): String { 4 | return hash("MD5", srcStr) 5 | } 6 | 7 | fun Md5(srcStr: ByteArray): ByteArray { 8 | return hash("MD5", srcStr) 9 | } 10 | 11 | -------------------------------------------------------------------------------- /src/main/kotlin/web/util/hash/sha1.kt: -------------------------------------------------------------------------------- 1 | package web.util.hash 2 | 3 | fun Sha1(srcStr: String): String { 4 | return hash("SHA-1", srcStr) 5 | } 6 | -------------------------------------------------------------------------------- /src/main/kotlin/web/util/hash/sha256.kt: -------------------------------------------------------------------------------- 1 | package web.util.hash 2 | 3 | fun Sha256(srcStr: String): String { 4 | return hash("SHA-256", srcStr) 5 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/hash/sha384.kt: -------------------------------------------------------------------------------- 1 | package web.util.hash 2 | 3 | fun Sha384(srcStr: String): String { 4 | return hash("SHA-384", srcStr) 5 | } 6 | -------------------------------------------------------------------------------- /src/main/kotlin/web/util/hash/sha512.kt: -------------------------------------------------------------------------------- 1 | package web.util.hash 2 | 3 | fun Sha512(srcStr: String): String { 4 | return hash("SHA-512", srcStr) 5 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/mail/Mail.kt: -------------------------------------------------------------------------------- 1 | package web.util.mail 2 | 3 | import java.util.* 4 | import javax.mail.* 5 | import javax.mail.internet.InternetAddress 6 | import javax.mail.internet.MimeMessage 7 | 8 | object Mail { 9 | 10 | private fun getmailSession():Session{ 11 | val conf=MailConf.get(); 12 | val account = conf.account 13 | val password = conf.password 14 | 15 | val props = mapOf( 16 | "mail.smtp.auth" to "true", 17 | "mail.smtp.host" to conf.host, 18 | "mail.smtp.ssl.enable" to "true", 19 | "mail.smtp.ssl.protocols" to conf.protocols, 20 | "mail.smtp.port" to conf.port, 21 | ) 22 | 23 | val properties = Properties().apply { putAll(props) } 24 | 25 | val authenticator = object : Authenticator() { 26 | override fun getPasswordAuthentication(): PasswordAuthentication { 27 | return PasswordAuthentication(account, password) 28 | } 29 | } 30 | val mailSession = Session.getInstance(properties, authenticator) 31 | return mailSession 32 | } 33 | 34 | 35 | 36 | fun SendCode(code:String,to:String){ 37 | val conf=MailConf.get(); 38 | val account = conf.account 39 | val personal = conf.personal 40 | val subject = conf.codesubject 41 | val text = conf.codetext.replaceFirst("\$code", code) 42 | val textMessage = MimeMessage(getmailSession()).apply { 43 | setFrom(InternetAddress(account, personal, "UTF-8")) 44 | setRecipient(Message.RecipientType.TO, InternetAddress(to)) 45 | setSubject(subject) 46 | setText(text) 47 | } 48 | 49 | Transport.send(textMessage) 50 | } 51 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/mail/MailConf.kt: -------------------------------------------------------------------------------- 1 | package web.util.mail 2 | 3 | import org.noear.solon.annotation.Bean 4 | import org.noear.solon.annotation.Configuration 5 | import org.noear.solon.annotation.Inject 6 | 7 | 8 | @Configuration 9 | class MailConf { 10 | 11 | @Inject(value = "\${smtp.host:}", autoRefreshed=true) 12 | var host:String="" 13 | 14 | @Inject(value = "\${smtp.protocols:TLSv1.2}", autoRefreshed=true) 15 | var protocols:String="" 16 | 17 | @Inject(value = "\${smtp.port:}", autoRefreshed=true) 18 | var port:String="" 19 | 20 | @Inject(value = "\${smtp.account:}", autoRefreshed=true) 21 | var account:String="" 22 | 23 | @Inject(value = "\${smtp.password:}", autoRefreshed=true) 24 | var password:String="" 25 | 26 | @Inject(value = "\${smtp.personal:}", autoRefreshed=true) 27 | var personal:String="" 28 | 29 | @Inject(value = "\${smtp.codesubject:}", autoRefreshed=true) 30 | var codesubject:String="" 31 | 32 | @Inject(value = "\${smtp.codetext:}", autoRefreshed=true) 33 | var codetext:String="" 34 | 35 | companion object{ 36 | var conf: MailConf?=null 37 | fun get(): MailConf { 38 | return conf!! 39 | } 40 | } 41 | 42 | 43 | @Bean 44 | fun init(){ 45 | conf =this 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/mapper/mapper.kt: -------------------------------------------------------------------------------- 1 | package web.util.mapper 2 | 3 | 4 | import org.apache.ibatis.solon.annotation.Db 5 | import org.noear.solon.annotation.Bean 6 | import org.noear.solon.annotation.Configuration 7 | import org.noear.solon.annotation.Inject 8 | import org.noear.solon.data.cache.CacheService 9 | import web.mapper.* 10 | import web.model.UserCookie 11 | 12 | @Configuration 13 | class mapper { 14 | @Db("db") 15 | @Inject 16 | lateinit var booklistMapper: BooklistMapper 17 | 18 | @Db("db") 19 | @Inject 20 | lateinit var bookSourcemapper: BookSourceMapper 21 | 22 | @Db("db") 23 | @Inject 24 | lateinit var userBookSourceMapper: UserBookSourceMapper 25 | 26 | 27 | @Db("db") 28 | @Inject 29 | lateinit var userCookieMapper: UserCookieMapper 30 | 31 | @Db("db") 32 | @Inject 33 | lateinit var usersMapper: UsersMapper 34 | 35 | @Db("db") 36 | @Inject 37 | lateinit var bookCacheMapper: BookCacheMapper 38 | 39 | @Inject 40 | lateinit var cacheService: CacheService 41 | 42 | 43 | 44 | companion object{ 45 | var mapper:mapper?=null 46 | fun get():mapper{ 47 | return mapper!! 48 | } 49 | } 50 | 51 | 52 | @Bean 53 | fun init(){ 54 | mapper =this 55 | } 56 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/page/PageException.kt: -------------------------------------------------------------------------------- 1 | package web.util.page 2 | 3 | class PageException(msg: String?) : Exception(msg) { 4 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/page/page.kt: -------------------------------------------------------------------------------- 1 | package web.util.page 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper 5 | import web.response.PageResponse 6 | 7 | fun Page(mapper: BaseMapper,queryWrapper: QueryWrapper, _page:Int, _limit:Int, _order:String?):Triple> { 8 | val page=_page.let { if (_page<1 ) 0 else _page } 9 | val limit=_limit.let { if (_limit <= 0 ) 20 else _limit } 10 | 11 | var count=mapper.selectCount(queryWrapper) 12 | if (count == 0.toLong()){ 13 | return Triple(0,page,emptyList()) 14 | } 15 | 16 | if (_order != null && _order.isNotBlank()){ 17 | var order=_order.trim().split(" ") 18 | if (order.size > 2){ 19 | throw PageException("排序错误") 20 | } 21 | if (order.size == 1 || !order[1].equals("DESC",true)){ 22 | queryWrapper.orderByAsc(order[0]) 23 | }else{ 24 | queryWrapper.orderByDesc(order[0]) 25 | } 26 | } 27 | var rowBegin = (page - 1) * limit 28 | if (rowBegin > 0){ 29 | queryWrapper.last("LIMIT $limit offset $rowBegin") 30 | }else{ 31 | queryWrapper.last("LIMIT $limit") 32 | } 33 | 34 | var list=mapper.selectList(queryWrapper) 35 | return Triple(count,page,list) 36 | } 37 | 38 | fun PageByAjax(mapper: BaseMapper,queryWrapper: QueryWrapper, _page:Int, _limit:Int, _order:String?):PageResponse{ 39 | var (count,page,data) = Page(mapper, queryWrapper, _page, _limit, _order) 40 | return PageResponse(count,page,data) 41 | } -------------------------------------------------------------------------------- /src/main/kotlin/web/util/validation/email.kt: -------------------------------------------------------------------------------- 1 | package web.util.validation 2 | 3 | import java.util.regex.Pattern 4 | 5 | /** 6 | * 正则表达式 判断邮箱格式是否正确 7 | */ 8 | fun isEmail(email: String?): Boolean { 9 | val str = 10 | "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$" 11 | val p = Pattern.compile(str) 12 | val m = p.matcher(email?:"") 13 | return m.matches() 14 | } 15 | -------------------------------------------------------------------------------- /src/main/kotlin/web/util/validation/phone.kt: -------------------------------------------------------------------------------- 1 | package web.util.validation 2 | 3 | import java.util.regex.Pattern 4 | 5 | 6 | /** 7 | * 手机号码正则判断 8 | */ 9 | fun isPhoneNum(phone: String?): Boolean { 10 | val compile = Pattern.compile("^(13|14|15|16|17|18|19)\\d{9}$") 11 | val matcher = compile.matcher(phone?:"") 12 | return matcher.matches() 13 | } 14 | //支持13、14、15、16、17、18、19开头后面任意搭9位 15 | -------------------------------------------------------------------------------- /src/main/resources/app.yml: -------------------------------------------------------------------------------- 1 | solon.app: 2 | name: read 3 | solon.logging: 4 | appender: 5 | console: 6 | pattern: "%d{yyyy-MM-dd HH:mm:ss} %-5level #${PID:-} %white(---) %-45(%cyan(%.32logger{30}:%L)) %msg%n" 7 | file: 8 | maxFileSize: "500 MB" 9 | logger: 10 | root: 11 | level: info 12 | mybatis.db: 13 | typeAliases: #支持包名 或 类名 //支持 ** 和 * 14 | - "web.model" 15 | # - "demo4031.*.AppxModel" 16 | mappers: #支持包名 或 类名 或 xml(.xml结尾)//支持 ** 和 * 17 | - "web.mapper" 18 | # - "classpath:demo4031/dso/mapper/*.xml" 19 | solon.config.add: "./conf.yml" 20 | cache: 21 | driverType: "local" 22 | defSeconds: 600 23 | solon.serialization.json: 24 | dateAsFormat: 'yyyy-MM-dd HH:mm:ss' #配置日期格式(默认输出为时间戳,对 Date、LocalDateTime 有效) 25 | dateAsTimeZone: 'GMT+8' #配置时区 26 | dateAsTicks: false #将date转为毫秒数(和 dateAsFormat 二选一) 27 | server.http: 28 | coreThreads: x2 29 | ioBound: true 30 | server.request: 31 | maxBodySize: 50mb 32 | maxFileSize: 50mb -------------------------------------------------------------------------------- /src/main/resources/conf.yml: -------------------------------------------------------------------------------- 1 | solon.dataSources: 2 | db: 3 | class: "com.zaxxer.hikari.HikariDataSource" 4 | driverClassName: com.p6spy.engine.spy.P6SpyDriver 5 | jdbcUrl: jdbc:p6spy:sqlite:read.db 6 | maxPoolSize: 1 7 | admin: 8 | username: "admin" 9 | password: "adminadmin" 10 | cron: false 11 | #code: "接口的code参数" //如果需要使用获取邀请码参数请修改这个参数,重启生效 12 | user: 13 | allowuptxt: true #是否允许上传txt 允许 true 不允许 false 14 | allowcache: true #是否允许添加缓存 允许 true 不允许 false 15 | source: 2 #0为不允许修改书源,1为允许修改后台书源,2独立书源 16 | smtp: 17 | host: #smtp邮箱host 18 | protocols: TLSv1.2 #通讯协议 19 | port: #端口 20 | account: #邮箱账号 21 | password: #邮箱密码,部分邮箱是安全码 22 | personal: #发送人的昵称 23 | codesubject: 验证码 #验证码邮件的主题 24 | codetext: 您的验证码是$code,当前验证码十分钟有效请尽快使用 #验证码邮件的内容,必须有$code,发送邮件时会把$code替换成验证码 25 | default: 26 | tts: #默认tts链接 27 | rule: #默认净化链接 28 | -------------------------------------------------------------------------------- /src/main/resources/confmysql.yml: -------------------------------------------------------------------------------- 1 | solon.dataSources: 2 | db: 3 | class: "com.zaxxer.hikari.HikariDataSource" 4 | driverClassName: com.p6spy.engine.spy.P6SpyDriver 5 | jdbcUrl: jdbc:p6spy:mysql://192.168.20.2:3306/test01?characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC 6 | username: test01 7 | password: 123456 8 | admin: 9 | username: "admin" 10 | password: "adminadmin" 11 | #code: "接口的code参数" //如果需要使用获取邀请码参数请修改这个参数,重启生效 12 | user: 13 | allowuptxt: false #是否允许上传txt 允许 true 不允许 false 14 | allowcache: false #是否允许添加缓存 允许 true 不允许 false 15 | source: 0 #0为不允许修改书源,1为允许修改后台书源,2独立书源 -------------------------------------------------------------------------------- /src/main/resources/spy.properties: -------------------------------------------------------------------------------- 1 | # ???????????????? 2 | modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory 3 | 4 | # ??????? 5 | logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger 6 | 7 | # ???????? 8 | appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger 9 | 10 | # ??JDBC???? 11 | deregisterdrivers=true 12 | 13 | # ???? 14 | useprefix=true 15 | 16 | # ??????? 17 | excludecategories=info,debug,result,commit,resultset 18 | 19 | # ???? 20 | dateformat=yyyy-MM-dd HH:mm:ss 21 | 22 | # ?????? 23 | # driverlist=org.h2.Driver 24 | 25 | # ???SQL?? 26 | outagedetection=true 27 | 28 | # ?SQL?????????? 29 | outagedetectioninterval=2 30 | 31 | # ?? flw_ ???? SQL ?? 32 | filter=true 33 | exclude=flw_* -------------------------------------------------------------------------------- /src/main/resources/static/assets/FontManifest.json: -------------------------------------------------------------------------------- 1 | [{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"boldface","fonts":[{"asset":"fonts/boldface/AlimamaShuHeiTi-Bold.ttf"}]},{"family":"circle","fonts":[{"asset":"fonts/circle/AlimamaFangYuanTiVF-Thin.ttf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}] -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/1.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/10.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/11.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/12.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/13.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/14.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/2.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/3.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/4.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/5.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/6.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/7.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/8.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/bg/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/bg/9.jpg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/default_avatar.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/default_avatar.jpeg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/fq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/fq.png -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/ic_launcher_round.webp -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/logo.png -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/no_cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/no_cover.jpeg -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/qd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/qd.png -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/qq.png -------------------------------------------------------------------------------- /src/main/resources/static/assets/assets/images/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/assets/images/splash.png -------------------------------------------------------------------------------- /src/main/resources/static/assets/fonts/MaterialIcons-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/fonts/MaterialIcons-Regular.otf -------------------------------------------------------------------------------- /src/main/resources/static/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf -------------------------------------------------------------------------------- /src/main/resources/static/assets/packages/fluttertoast/assets/toastify.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Minified by jsDelivr using clean-css v4.2.3. 3 | * Original file: /npm/toastify-js@1.9.3/src/toastify.css 4 | * 5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 | */ 7 | /*! 8 | * Toastify js 1.9.3 9 | * https://github.com/apvarun/toastify-js 10 | * @license MIT licensed 11 | * 12 | * Copyright (C) 2018 Varun A P 13 | */ 14 | .toastify{padding:12px 20px;color:#fff;display:inline-block;box-shadow:0 3px 6px -1px rgba(0,0,0,.12),0 10px 36px -4px rgba(77,96,232,.3);background:-webkit-linear-gradient(315deg,#73a5ff,#5477f5);background:linear-gradient(135deg,#73a5ff,#5477f5);position:fixed;opacity:0;transition:all .4s cubic-bezier(.215,.61,.355,1);border-radius:2px;cursor:pointer;text-decoration:none;max-width:calc(50% - 20px);z-index:2147483647}.toastify.on{opacity:1}.toast-close{opacity:.4;padding:0 5px}.toastify-right{right:15px}.toastify-left{left:15px}.toastify-top{top:-150px}.toastify-bottom{bottom:-150px}.toastify-rounded{border-radius:25px}.toastify-avatar{width:1.5em;height:1.5em;margin:-7px 5px;border-radius:2px}.toastify-center{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content;max-width:-moz-fit-content}@media only screen and (max-width:360px){.toastify-left,.toastify-right{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content}} -------------------------------------------------------------------------------- /src/main/resources/static/canvaskit/canvaskit.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/canvaskit/canvaskit.wasm -------------------------------------------------------------------------------- /src/main/resources/static/canvaskit/chromium/canvaskit.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/canvaskit/chromium/canvaskit.wasm -------------------------------------------------------------------------------- /src/main/resources/static/canvaskit/skwasm.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/canvaskit/skwasm.wasm -------------------------------------------------------------------------------- /src/main/resources/static/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/icons/Icon-192.png -------------------------------------------------------------------------------- /src/main/resources/static/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/icons/Icon-512.png -------------------------------------------------------------------------------- /src/main/resources/static/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /src/main/resources/static/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /src/main/resources/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | read 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_100.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_100",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,B,A={ 5 | oH(d,e,f,g,h,i){return new A.oG(i,h,g,e,d,f,null)}, 6 | oG:function oG(d,e,f,g,h,i,j){var _=this 7 | _.c=d 8 | _.d=e 9 | _.f=f 10 | _.r=g 11 | _.w=h 12 | _.x=i 13 | _.a=j}, 14 | apN:function apN(){this.d=!1 15 | this.c=this.a=null}, 16 | buj:function buj(d){this.a=d}, 17 | bui:function bui(d){this.a=d}},C,D 18 | J=c[1] 19 | B=c[0] 20 | A=a.updateHolder(c[75],A) 21 | C=c[80] 22 | D=c[13] 23 | A.oG.prototype={ 24 | X(){return new A.apN()}} 25 | A.apN.prototype={ 26 | a3(){this.aD() 27 | J.JJ(B.cq("de",0),new A.buj(this),y.d)}, 28 | ayJ(){var x,w,v,u 29 | B.dl("de") 30 | x=this.a 31 | w=x.c 32 | v=x.d 33 | u=x.f 34 | return D.c5p(!1,x.r,x.x,u,v,w)}, 35 | G(d){if(!this.d)return C.tp(null) 36 | return this.ayJ()}} 37 | var z=a.updateTypes([]) 38 | A.buj.prototype={ 39 | $1(d){var x=this.a 40 | x.t(new A.bui(x))}, 41 | $S:10} 42 | A.bui.prototype={ 43 | $0(){this.a.d=!0}, 44 | $S:0};(function inheritance(){var x=a.inherit 45 | x(A.oG,B.X) 46 | x(A.apN,B.a_) 47 | x(A.buj,B.cr) 48 | x(A.bui,B.cH)})() 49 | B.c7(b.typeUniverse,JSON.parse('{"oG":{"X":[],"o":[]},"apN":{"a_":["oG"]}}')) 50 | var y={d:B.A("aU")}}; 51 | ((a,b)=>{a[b]=a.current 52 | a.eventLog.push({p:"main.dart.js_100",e:"endPart",h:b})})($__dart_deferred_initializers__,"HMY20H4SoQnz7HOzz+ZT1+7Kk/U="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_101.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_101",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={ 5 | tp(d){return new A.J(0,0,d,null)}} 6 | A=c[0] 7 | B=a.updateHolder(c[80],B) 8 | var z=a.updateTypes([])}; 9 | ((a,b)=>{a[b]=a.current 10 | a.eventLog.push({p:"main.dart.js_101",e:"endPart",h:b})})($__dart_deferred_initializers__,"fc1XYvEEKC1xX8fxWJCAW7AKAUs="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_103.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_103",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,C={ 5 | er(d,e){var y=new A.bH(d,e,E.Q,-1) 6 | return new A.eO(y,y,y,y)}},D,A,E 7 | B=c[0] 8 | C=a.updateHolder(c[107],C) 9 | D=c[186] 10 | A=c[117] 11 | E=c[127] 12 | var z=a.updateTypes([]);(function constants(){D.je=new B.a8(0,1/0,0,1/0)})()}; 13 | ((a,b)=>{a[b]=a.current 14 | a.eventLog.push({p:"main.dart.js_103",e:"endPart",h:b})})($__dart_deferred_initializers__,"dCKMGrg1Z3LLpLTsXQ0Re8XLKVs="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_104.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_104",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,A={pN:function pN(){},PQ:function PQ(d,e){this.a=d 5 | this.$ti=e},aTt:function aTt(){},hn:function hn(){}} 6 | B=c[0] 7 | A=a.updateHolder(c[72],A) 8 | A.pN.prototype={ 9 | Zc(d,e){}, 10 | Za(d,e){}, 11 | ag2(d,e){}, 12 | ag3(d,e){}, 13 | zP(){}} 14 | A.PQ.prototype={ 15 | r5(d,e,f){this.a.cO(0,f,new A.aTt()).C(0,e)}, 16 | u_(d,e){var x,w,v,u=this.a,t=B.C(u).i("c2<1>"),s=B.a4(new B.c2(u,t),!0,t.i("E.E")) 17 | for(t=s.length,x=0;x()"]) 36 | A.aTt.prototype={ 37 | $0(){return B.b5(y.b)}, 38 | $S:z+0};(function aliases(){var x=A.hn.prototype 39 | x.SX=x.FD})();(function inheritance(){var x=a.inheritMany,w=a.inherit 40 | x(B.w,[A.pN,A.hn]) 41 | w(A.PQ,A.pN) 42 | w(A.aTt,B.cH)})() 43 | B.c7(b.typeUniverse,JSON.parse('{"PQ":{"pN":[]}}')) 44 | var y={b:B.A("hn")};(function lazyInitializers(){var x=a.lazyFinal 45 | x($,"ci6","oV",()=>B.bAv()) 46 | x($,"co1","jz",()=>new A.PQ(B.G(B.A("fa<@>"),B.A("b7")),B.A("PQ>")))})()}; 47 | ((a,b)=>{a[b]=a.current 48 | a.eventLog.push({p:"main.dart.js_104",e:"endPart",h:b})})($__dart_deferred_initializers__,"krxFJieNUI8Xmvewg6lzGXB5QWI="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_106.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_106",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,D,A={ 5 | bOG(d,e,f){var y,x,w,v,u,t,s=e.b 6 | if(s<=0||e.a<=0||f.b<=0||f.a<=0)return C.UE 7 | switch(d.a){case 0:y=f 8 | x=e 9 | break 10 | case 1:w=f.a 11 | v=f.b 12 | u=e.a 13 | y=w/v>u/s?new B.R(u*v/s,v):new B.R(w,s*w/u) 14 | x=e 15 | break 16 | case 2:w=f.a 17 | v=f.b 18 | u=e.a 19 | x=w/v>u/s?new B.R(u,u*v/w):new B.R(s*w/v,s) 20 | y=f 21 | break 22 | case 3:w=f.a 23 | v=f.b 24 | u=e.a 25 | if(w/v>u/s){x=new B.R(u,u*v/w) 26 | y=f}else{y=new B.R(w,s*w/u) 27 | x=e}break 28 | case 4:w=f.a 29 | v=f.b 30 | u=e.a 31 | if(w/v>u/s){y=new B.R(u*v/s,v) 32 | x=e}else{x=new B.R(s*w/v,s) 33 | y=f}break 34 | case 5:x=new B.R(Math.min(e.a,f.a),Math.min(s,f.b)) 35 | y=x 36 | break 37 | case 6:t=e.a/s 38 | w=f.b 39 | y=s>w?new B.R(w*t,w):e 40 | s=f.a 41 | if(y.a>s)y=new B.R(s,s/t) 42 | x=e 43 | break 44 | default:x=null 45 | y=null}return new A.a3w(x,y)}, 46 | uG:function uG(d,e){this.a=d 47 | this.b=e}, 48 | a3w:function a3w(d,e){this.a=d 49 | this.b=e}},C 50 | B=c[0] 51 | D=c[2] 52 | A=a.updateHolder(c[95],A) 53 | C=c[140] 54 | A.uG.prototype={ 55 | I(){return"BoxFit."+this.b}} 56 | A.a3w.prototype={} 57 | var z=a.updateTypes([]);(function inheritance(){var y=a.inherit 58 | y(A.uG,B.ex) 59 | y(A.a3w,B.w)})();(function constants(){C.jf=new A.uG(0,"fill") 60 | C.ct=new A.uG(1,"contain") 61 | C.bs=new A.uG(2,"cover") 62 | C.dU=new A.uG(3,"fitWidth") 63 | C.fp=new A.uG(4,"fitHeight") 64 | C.ro=new A.uG(6,"scaleDown") 65 | C.UE=new A.a3w(D.I,D.I)})()}; 66 | ((a,b)=>{a[b]=a.current 67 | a.eventLog.push({p:"main.dart.js_106",e:"endPart",h:b})})($__dart_deferred_initializers__,"uKubD8oy83sW9i3E/tdZTd9XRRU="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_108.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_108",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A 5 | A=c[0] 6 | var z=a.updateTypes([]);(function lazyInitializers(){var y=a.lazy 7 | y($,"ce4","ds",()=>A.iq(247,248,250,1))})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_108",e:"endPart",h:b})})($__dart_deferred_initializers__,"AGbtXriAKpjNzohxRfQhEbx5Zlc="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_111.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_111",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,D,A={Nu:function Nu(d,e){this.a=d 5 | this.b=e},b0Q:function b0Q(){},awV:function awV(){}, 6 | cb1(d){switch(d.a){case 0:return D.oS 7 | case 2:return D.JS 8 | case 1:return D.JR 9 | case 3:return C.ads 10 | case 4:return D.JT}}, 11 | uh(d,e){var x=0,w=B.i(y.a),v,u 12 | var $async$uh=B.d(function(f,g){if(f===1)return B.e(g,w) 13 | while(true)switch(x){case 0:if(e===C.Xg||e===C.Xh)u=!(d.geM()==="https"||d.geM()==="http") 14 | else u=!1 15 | if(u)throw B.k(B.ei(d,"url","To use an in-app web view, you must provide an http(s) URL.")) 16 | v=$.bTT().GF(d.j(0),new B.a5b(A.cb1(e),new B.a4F(!0,!0,D.or),null)) 17 | x=1 18 | break 19 | case 1:return B.f(v,w)}}) 20 | return B.h($async$uh,w)}},C 21 | B=c[0] 22 | D=c[2] 23 | A=a.updateHolder(c[90],A) 24 | C=c[136] 25 | A.Nu.prototype={ 26 | I(){return"LaunchMode."+this.b}} 27 | A.b0Q.prototype={} 28 | A.awV.prototype={} 29 | var z=a.updateTypes([]);(function inheritance(){var x=a.inherit,w=a.inheritMany 30 | x(A.Nu,B.ex) 31 | w(B.w,[A.b0Q,A.awV])})() 32 | var y={a:B.A("y")};(function constants(){C.arv=new A.awV() 33 | C.arA=new A.b0Q() 34 | C.e2=new A.Nu(0,"platformDefault") 35 | C.Xg=new A.Nu(1,"inAppWebView") 36 | C.Xh=new A.Nu(2,"inAppBrowserView") 37 | C.ads=new B.AJ(3,"externalApplication")})()}; 38 | ((a,b)=>{a[b]=a.current 39 | a.eventLog.push({p:"main.dart.js_111",e:"endPart",h:b})})($__dart_deferred_initializers__,"zp4Qdm4xB2tko7VWZxWBMYb9jN0="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_113.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_113",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,D,B={ 5 | c9M(d){var x,w=A.a([],y.h) 6 | for(x=0;!1;++x)w.push(d[x].j(0)) 7 | return w}, 8 | Rn(d,e){var x=0,w=A.i(y.f),v 9 | var $async$Rn=A.d(function(f,g){if(f===1)return A.e(g,w) 10 | while(true)switch(x){case 0:v=y.f 11 | x=d!==C.ahc?2:4 12 | break 13 | case 2:x=5 14 | return A.c(D.bS.dG("SystemChrome.setEnabledSystemUIMode",d.I(),v),$async$Rn) 15 | case 5:x=3 16 | break 17 | case 4:e.toString 18 | x=6 19 | return A.c(D.bS.dG("SystemChrome.setEnabledSystemUIOverlays",B.c9M(e),v),$async$Rn) 20 | case 6:case 3:return A.f(null,w)}}) 21 | return A.h($async$Rn,w)}, 22 | Rp:function Rp(d,e){this.a=d 23 | this.b=e}, 24 | q5(d){var x=0,w=A.i(y.f) 25 | var $async$q5=A.d(function(e,f){if(e===1)return A.e(f,w) 26 | while(true)switch(x){case 0:A.Y("\u663e\u793a\u72b6\u6001\u680f") 27 | $.bEe=!0 28 | x=2 29 | return A.c(B.Rn(C.ahb,null),$async$q5) 30 | case 2:return A.f(null,w)}}) 31 | return A.h($async$q5,w)}},C 32 | A=c[0] 33 | D=c[2] 34 | B=a.updateHolder(c[53],B) 35 | C=c[185] 36 | B.Rp.prototype={ 37 | I(){return"SystemUiMode."+this.b}} 38 | var z=a.updateTypes([]);(function inheritance(){var x=a.inherit 39 | x(B.Rp,A.ex)})() 40 | var y={h:A.A("r"),f:A.A("~")};(function constants(){C.ahb=new B.Rp(3,"edgeToEdge") 41 | C.ahc=new B.Rp(4,"manual")})();(function staticFields(){$.bEe=!0})()}; 42 | ((a,b)=>{a[b]=a.current 43 | a.eventLog.push({p:"main.dart.js_113",e:"endPart",h:b})})($__dart_deferred_initializers__,"9kwqBkh4b7Wf9U2F+1VV65cN0Sw="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_115.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_115",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={mi:function mi(d,e,f,g,h,i){var _=this 5 | _.c=d 6 | _.d=e 7 | _.e=f 8 | _.f=g 9 | _.a=h 10 | _.$ti=i},V0:function V0(d){var _=this 11 | _.d=null 12 | _.e=$ 13 | _.c=_.a=null 14 | _.$ti=d}},C 15 | A=c[0] 16 | B=a.updateHolder(c[65],B) 17 | C=c[117] 18 | B.mi.prototype={ 19 | az6(d,e){var x=this.d 20 | if(x!=null){x.$2(d,e) 21 | return}x=this.e 22 | if(x!=null)x.$1(d)}, 23 | X(){return new B.V0(this.$ti.i("V0<1>"))}} 24 | B.V0.prototype={ 25 | AE(d,e){this.a.az6(d,e)}, 26 | gaeT(){var x=this.e 27 | x===$&&A.b() 28 | return x}, 29 | a3(){var x,w,v=this 30 | v.aD() 31 | x=v.a.f 32 | w=$.al() 33 | v.e!==$&&A.c5() 34 | v.e=new A.bo(x,w,y.d)}, 35 | bV(){var x,w,v=this 36 | v.dn() 37 | x=v.c 38 | x.toString 39 | w=C.lf(x,y.a) 40 | x=v.d 41 | if(w!=x){if(x!=null)x.akw(v) 42 | v.d=w 43 | if(w!=null){w.ok.C(0,v) 44 | x=v.e 45 | x===$&&A.b() 46 | x.a1(0,w.ga9v()) 47 | w.Ds()}}}, 48 | bc(d){var x 49 | this.bA(d) 50 | x=this.e 51 | x===$&&A.b() 52 | x.sk(0,this.a.f)}, 53 | m(){var x=this,w=x.d 54 | if(w!=null)w.akw(x) 55 | w=x.e 56 | w===$&&A.b() 57 | w.R$=$.al() 58 | w.S$=0 59 | x.aN()}, 60 | G(d){return this.a.c}, 61 | $iOR:1} 62 | var z=a.updateTypes([]);(function inheritance(){var x=a.inherit 63 | x(B.mi,A.X) 64 | x(B.V0,A.a_)})() 65 | A.c7(b.typeUniverse,JSON.parse('{"mi":{"X":[],"o":[]},"V0":{"a_":["mi<1>"],"OR":["1"]}}')) 66 | var y={d:A.A("bo"),a:A.A("w?")}}; 67 | ((a,b)=>{a[b]=a.current 68 | a.eventLog.push({p:"main.dart.js_115",e:"endPart",h:b})})($__dart_deferred_initializers__,"TyFuxQ9F6njvN82I3s7c5THenwc="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_118.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_118",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[167] 6 | B=c[117] 7 | var z=a.updateTypes([]);(function constants(){A.uB=new B.be(58644,!1)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_118",e:"endPart",h:b})})($__dart_deferred_initializers__,"Pu96gcWFEizdL7oDbFx+a6c4rvU="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_121.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_121",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var z=a.updateTypes([]);(function staticFields(){$.bWc=!1})()}; 5 | ((a,b)=>{a[b]=a.current 6 | a.eventLog.push({p:"main.dart.js_121",e:"endPart",h:b})})($__dart_deferred_initializers__,"wEZ6meh+oLh6IyUf2S78RZI7ZAE="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_125.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_125",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[175] 6 | B=c[117] 7 | var z=a.updateTypes([]);(function constants(){A.Vo=new B.be(57491,!0) 8 | A.Vq=new B.be(57500,!0)})()}; 9 | ((a,b)=>{a[b]=a.current 10 | a.eventLog.push({p:"main.dart.js_125",e:"endPart",h:b})})($__dart_deferred_initializers__,"xFh7Yac1mnD3HXBNzk8Ye3CCjy0="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_128.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_128",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A,B,C={ 5 | Dm(d){var x=0,w=A.i(y.e),v,u,t,s,r,q 6 | var $async$Dm=A.d(function(e,f){if(e===1)return A.e(f,w) 7 | while(true)switch(x){case 0:u=y.g 8 | t=A.Q(["id",d],u,u) 9 | r=B.m 10 | q=B.r 11 | x=3 12 | return A.c(E.cw(F.bs("/noCookies"),t),$async$Dm) 13 | case 3:s=r.N(0,q.N(0,f)) 14 | u=J.M(s) 15 | if(u.h(s,"isSuccess")){v=!0 16 | x=1 17 | break}else throw A.k(A.av(D.bI(u.h(s,"errorMsg")))) 18 | case 1:return A.f(v,w)}}) 19 | return A.h($async$Dm,w)}},D,E,F 20 | J=c[1] 21 | A=c[0] 22 | B=c[2] 23 | C=a.updateHolder(c[21],C) 24 | D=c[102] 25 | E=c[105] 26 | F=c[87] 27 | var z=a.updateTypes([]) 28 | var y={g:A.A("l"),e:A.A("y")}}; 29 | ((a,b)=>{a[b]=a.current 30 | a.eventLog.push({p:"main.dart.js_128",e:"endPart",h:b})})($__dart_deferred_initializers__,"AO8le3QoIu39F+Q9kUQkZQarqiQ="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_133.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_133",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | aYN(d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){return new B.GZ(f,g,h,d,e,i,j,k,q,r,m,n,l,o,p)}},B 6 | A=a.updateHolder(c[37],A) 7 | B=c[117] 8 | var z=a.updateTypes([])}; 9 | ((a,b)=>{a[b]=a.current 10 | a.eventLog.push({p:"main.dart.js_133",e:"endPart",h:b})})($__dart_deferred_initializers__,"jNzFV7MeKIjhrr7OlQKBwB6uuFE="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_136.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_136",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | pd(d){var y=null 6 | return new B.yO(4,y,y,d,y,y,y,y)}},B 7 | A=a.updateHolder(c[69],A) 8 | B=c[92] 9 | var z=a.updateTypes([])}; 10 | ((a,b)=>{a[b]=a.current 11 | a.eventLog.push({p:"main.dart.js_136",e:"endPart",h:b})})($__dart_deferred_initializers__,"RDkQ+mnypojOk2jFH/Ha+M4MVkg="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_141.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_141",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[0] 6 | B=c[130] 7 | var z=a.updateTypes([]);(function constants(){B.iY=new A.J(null,6,null,null)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_141",e:"endPart",h:b})})($__dart_deferred_initializers__,"mygXK1GEwECzM+bNwN8uKoAgodg="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_143.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_143",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[0] 6 | B=c[152] 7 | var z=a.updateTypes([]);(function constants(){B.hj=new A.bk(16,16)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_143",e:"endPart",h:b})})($__dart_deferred_initializers__,"+hmUp2vV42nZsMm/hxGkFL2ALL4="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_145.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_145",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A,B={ 5 | kF(d,e){return B.c4d(d,e)}, 6 | c4d(d,e){var x=0,w=A.i(y.b),v,u=2,t,s,r,q,p,o 7 | var $async$kF=A.d(function(f,g){if(f===1){t=g 8 | x=u}while(true)switch(x){case 0:u=4 9 | x=$.GT==null?7:8 10 | break 11 | case 7:x=9 12 | return A.c(C.GU(),$async$kF) 13 | case 9:case 8:s=$.GT.qD(0,"storage","readwrite") 14 | r=J.D0(s,"storage") 15 | x=10 16 | return A.c(J.bzs(r,e,d),$async$kF) 17 | case 10:x=11 18 | return A.c(J.CZ(s),$async$kF) 19 | case 11:x=1 20 | break 21 | u=2 22 | x=6 23 | break 24 | case 4:u=3 25 | o=t 26 | q=A.H(o) 27 | A.Y("Web\u4fdd\u5b58\u5931\u8d25: "+d+", \u9519\u8bef: "+A.n(q)) 28 | x=6 29 | break 30 | case 3:x=2 31 | break 32 | case 6:x=1 33 | break 34 | case 1:return A.f(v,w) 35 | case 2:return A.e(t,w)}}) 36 | return A.h($async$kF,w)}},C 37 | J=c[1] 38 | A=c[0] 39 | B=a.updateHolder(c[59],B) 40 | C=c[62] 41 | var z=a.updateTypes([]) 42 | var y={b:A.A("~")}}; 43 | ((a,b)=>{a[b]=a.current 44 | a.eventLog.push({p:"main.dart.js_145",e:"endPart",h:b})})($__dart_deferred_initializers__,"iBArjIPlBKAs+XTApR5bsIpmcCw="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_15.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_15",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A={ 5 | c0C(d,e){var y,x 6 | for(y=J.aC(d);y.B();){x=y.gK(y) 7 | if(e.$1(x))return x}return null}} 8 | J=c[1] 9 | A=a.updateHolder(c[70],A) 10 | var z=a.updateTypes([])}; 11 | ((a,b)=>{a[b]=a.current 12 | a.eventLog.push({p:"main.dart.js_15",e:"endPart",h:b})})($__dart_deferred_initializers__,"ysir2J01mzsHKH4c6IiNhvqn9Sw="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_150.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_150",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | bLx(){var y,x=$.br 6 | x=x==null?null:x.d3(0,"setting:cachebook") 7 | y=B.e7(x==null?5:x) 8 | return y<0?0:y}},B 9 | A=a.updateHolder(c[50],A) 10 | B=c[111] 11 | var z=a.updateTypes([])}; 12 | ((a,b)=>{a[b]=a.current 13 | a.eventLog.push({p:"main.dart.js_150",e:"endPart",h:b})})($__dart_deferred_initializers__,"4HL/lPYfNCRtrKjwUkU2+iaYByI="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_152.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_152",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A 5 | A=c[0] 6 | var z=a.updateTypes([]);(function staticFields(){$.a9q=A.a([],A.A("r"))})()}; 7 | ((a,b)=>{a[b]=a.current 8 | a.eventLog.push({p:"main.dart.js_152",e:"endPart",h:b})})($__dart_deferred_initializers__,"15Uk+WVLT41rAJE2OYVQVNwumTw="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_154.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_154",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | bC5(){var y=$.br 6 | y=y==null?null:y.d3(0,"useReplaceRule") 7 | return y!=="false"}} 8 | A=a.updateHolder(c[33],A) 9 | var z=a.updateTypes([])}; 10 | ((a,b)=>{a[b]=a.current 11 | a.eventLog.push({p:"main.dart.js_154",e:"endPart",h:b})})($__dart_deferred_initializers__,"Ql1/vV9V9gLYfAIeiAO+HJXt33U="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_165.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_165",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[0] 6 | B=c[146] 7 | var z=a.updateTypes([]);(function constants(){B.fC=new A.aT(3e4)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_165",e:"endPart",h:b})})($__dart_deferred_initializers__,"BFnpRzB+ZTtEUudoHXAmakHf9j0="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_166.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_166",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | bLz(){var y=$.br 6 | C.e7(y==null?null:y.d3(0,"imgmax")) 7 | return 5}, 8 | bLy(){if(!$.dn())return!1 9 | var y=$.br 10 | y=y==null?null:y.d3(0,"setting:fontSizevalue") 11 | return y==="true"}},B,C,D 12 | A=a.updateHolder(c[42],A) 13 | B=c[156] 14 | C=c[111] 15 | D=c[117] 16 | var z=a.updateTypes([]);(function constants(){B.nI=new D.be(58121,!0)})()}; 17 | ((a,b)=>{a[b]=a.current 18 | a.eventLog.push({p:"main.dart.js_166",e:"endPart",h:b})})($__dart_deferred_initializers__,"s+m4PAHAOUSFVpqzqL55IgHg3GU="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_168.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_168",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[171] 6 | B=c[117] 7 | var z=a.updateTypes([]);(function constants(){A.uF=new B.be(61267,!1)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_168",e:"endPart",h:b})})($__dart_deferred_initializers__,"CJ3HlV6AK1T2ti6FW51UA0JBnHY="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_170.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_170",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[159] 6 | B=c[117] 7 | var z=a.updateTypes([]);(function constants(){A.uu=new B.be(57912,!1)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_170",e:"endPart",h:b})})($__dart_deferred_initializers__,"GqQPmVHAbkgxFv8y4mtYkxLa4HA="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_171.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_171",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[168] 6 | B=c[117] 7 | var z=a.updateTypes([]);(function constants(){A.nK=new B.be(58519,!1)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_171",e:"endPart",h:b})})($__dart_deferred_initializers__,"uu8nyaZAHRCpNGYKFHK5lu86oXo="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_176.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_176",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[153] 6 | B=c[117] 7 | var z=a.updateTypes([]);(function constants(){A.ka=new B.be(62260,!1)})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_176",e:"endPart",h:b})})($__dart_deferred_initializers__,"ziF2lR8m3jig6CrN6qBKz/XhdfA="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_18.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_18",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A 5 | A=c[0] 6 | var z=a.updateTypes([]);(function staticFields(){$.aXT=A.bd("_iv") 7 | $.bC1=A.bd("_encrypter")})()}; 8 | ((a,b)=>{a[b]=a.current 9 | a.eventLog.push({p:"main.dart.js_18",e:"endPart",h:b})})($__dart_deferred_initializers__,"giSFSCdWIMKBq+mQ/uypXzwCMIw="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_184.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_184",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,A={Pf:function Pf(d,e,f,g,h){var _=this 5 | _.D=d 6 | _.aj=e 7 | _.E$=f 8 | _.fx=g 9 | _.b=_.id=null 10 | _.c=0 11 | _.y=_.d=null 12 | _.z=!0 13 | _.Q=null 14 | _.as=!1 15 | _.at=null 16 | _.ay=$ 17 | _.ch=h 18 | _.CW=!1 19 | _.cx=$ 20 | _.cy=!0 21 | _.db=!1 22 | _.dx=null 23 | _.dy=!0 24 | _.fr=null}, 25 | bGw(d,e){return new A.Zo(!1,e,null)}, 26 | Zo:function Zo(d,e,f){this.e=d 27 | this.c=e 28 | this.a=f}},C,D 29 | B=c[0] 30 | A=a.updateHolder(c[46],A) 31 | C=c[161] 32 | D=c[117] 33 | A.Pf.prototype={ 34 | sae2(d){if(this.D===d)return 35 | this.D=d 36 | this.c5()}, 37 | sa_x(d){return}, 38 | dM(d,e){return this.D?this.gu(0).p(0,e):this.mN(d,e)}, 39 | j_(d){this.uv(d)}, 40 | hM(d){var y 41 | this.jB(d) 42 | y=this.D 43 | d.b=y}} 44 | A.Zo.prototype={ 45 | b8(d){var y=new A.Pf(!1,null,null,new B.bu(),B.aR()) 46 | y.b7() 47 | y.sbI(null) 48 | return y}, 49 | bf(d,e){e.sae2(!1) 50 | e.sa_x(null)}} 51 | var z=a.updateTypes([]);(function inheritance(){var y=a.inherit 52 | y(A.Pf,B.jn) 53 | y(A.Zo,B.bq)})() 54 | B.c7(b.typeUniverse,JSON.parse('{"Pf":{"N":[],"bD":["N"],"O":[],"aV":[]},"Zo":{"bq":[],"b_":[],"o":[]}}'));(function constants(){C.qG=new D.iP(0,-1)})()}; 55 | ((a,b)=>{a[b]=a.current 56 | a.eventLog.push({p:"main.dart.js_184",e:"endPart",h:b})})($__dart_deferred_initializers__,"MDleynXyGoYAcbIwXmNJVlnxpoU="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_187.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_187",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A,C,B={ 5 | bIB(d){var x=J.M(d),w=x.h(d,"title") 6 | w=w==null?null:J.ab(w) 7 | if(w==null)w="" 8 | x=x.h(d,"url") 9 | x=x==null?null:J.ab(x) 10 | return new B.o4(w,x==null?"":x)}, 11 | o4:function o4(d,e){this.a=d 12 | this.b=e}, 13 | a3m:function a3m(d,e,f,g){var _=this 14 | _.a=d 15 | _.b=e 16 | _.c=f 17 | _.d=g}, 18 | a_p(d){var x=0,w=A.i(y.h),v,u,t,s,r,q,p,o,n,m 19 | var $async$a_p=A.d(function(e,f){if(e===1)return A.e(f,w) 20 | while(true)switch(x){case 0:q=y.g 21 | p=A.Q(["bookSourceUrl",d],q,q) 22 | n=C.m 23 | m=C.r 24 | x=3 25 | return A.c(E.cw(F.bs("/getBookSourcesExploreUrl"),p),$async$a_p) 26 | case 3:o=n.N(0,m.N(0,f)) 27 | q=J.M(o) 28 | if(q.h(o,"isSuccess")){q=q.h(o,"data") 29 | u=J.M(q) 30 | t=u.h(q,"found") 31 | t=t==null?null:J.ab(t) 32 | if(t==null)t="" 33 | s=u.h(q,"loginUrl") 34 | s=s==null?null:J.ab(s) 35 | if(s==null)s="" 36 | r=u.h(q,"loginUi") 37 | r=r==null?null:J.ab(r) 38 | if(r==null)r="" 39 | q=u.h(q,"checkKeyWord") 40 | q=q==null?null:J.ab(q) 41 | v=new B.a3m(t,q==null?"":q,s,r) 42 | x=1 43 | break}else throw A.k(A.av(D.bI(q.h(o,"errorMsg")))) 44 | case 1:return A.f(v,w)}}) 45 | return A.h($async$a_p,w)}},D,E,F 46 | J=c[1] 47 | A=c[0] 48 | C=c[2] 49 | B=a.updateHolder(c[29],B) 50 | D=c[102] 51 | E=c[105] 52 | F=c[87] 53 | B.o4.prototype={} 54 | B.a3m.prototype={} 55 | var z=a.updateTypes([]);(function inheritance(){var x=a.inheritMany 56 | x(A.w,[B.o4,B.a3m])})() 57 | var y={h:A.A("a3m"),g:A.A("l")}}; 58 | ((a,b)=>{a[b]=a.current 59 | a.eventLog.push({p:"main.dart.js_187",e:"endPart",h:b})})($__dart_deferred_initializers__,"3RseMsAJwB+0iY/PP8n5QZ9pqzs="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_189.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_189",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,C={ 5 | bGM(d){return new E.Kj(F.qV,null,d,null,null)}},A,D,E,F 6 | B=c[0] 7 | C=a.updateHolder(c[35],C) 8 | A=c[164] 9 | D=c[117] 10 | E=c[103] 11 | F=c[181] 12 | var z=a.updateTypes([]);(function constants(){A.RI=new B.t(4293980400) 13 | A.LG=new D.S(!0,null,null,null,null,null,13,null,null,null,null,null,1.5,null,null,null,null,null,null,null,null,null,null,null,null,null)})()}; 14 | ((a,b)=>{a[b]=a.current 15 | a.eventLog.push({p:"main.dart.js_189",e:"endPart",h:b})})($__dart_deferred_initializers__,"I7WDl0fph9pfVMwSSjd8+Nl6PHY="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_19.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_19",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var z=a.updateTypes([]);(function staticFields(){$.br=null})()}; 5 | ((a,b)=>{a[b]=a.current 6 | a.eventLog.push({p:"main.dart.js_19",e:"endPart",h:b})})($__dart_deferred_initializers__,"r0YQ3BpbA8JH4ErudOPx/zJV2t0="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_20.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_20",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A,B={ 5 | GU(){var x=0,w=A.i(y.b),v=1,u,t,s,r,q,p 6 | var $async$GU=A.d(function(d,e){if(d===1){u=e 7 | x=v}while(true)switch(x){case 0:v=3 8 | s=C.bP5() 9 | $.c4a=s 10 | p=$ 11 | x=6 12 | return A.c(s.oI(0,"BookStorage",new B.aXU(),1),$async$GU) 13 | case 6:p.GT=e 14 | v=1 15 | x=5 16 | break 17 | case 3:v=2 18 | q=u 19 | t=A.H(q) 20 | A.Y("IndexedDB \u521d\u59cb\u5316\u5931\u8d25: "+A.n(t)) 21 | x=5 22 | break 23 | case 2:x=1 24 | break 25 | case 5:return A.f(null,w) 26 | case 1:return A.e(u,w)}}) 27 | return A.h($async$GU,w)}, 28 | aXU:function aXU(){}},C 29 | J=c[1] 30 | A=c[0] 31 | B=a.updateHolder(c[62],B) 32 | C=c[66] 33 | var z=a.updateTypes(["aU(Hm)"]) 34 | B.aXU.prototype={ 35 | $1(d){var x=d.gYW(d) 36 | J.bzf(x,"storage")}, 37 | $S:z+0};(function inheritance(){var x=a.inherit 38 | x(B.aXU,A.cr)})() 39 | var y={b:A.A("~")};(function staticFields(){$.c4a=null 40 | $.GT=null})()}; 41 | ((a,b)=>{a[b]=a.current 42 | a.eventLog.push({p:"main.dart.js_20",e:"endPart",h:b})})($__dart_deferred_initializers__,"z3idloNprnvuc647x+Syrn3jBvY="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_201.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_201",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A,B,C={ 5 | a_r(d,e){var x=0,w=A.i(y.e),v,u=2,t,s=[],r,q,p,o,n,m,l,k,j,i 6 | var $async$a_r=A.d(function(f,g){if(f===1){t=g 7 | x=u}while(true)switch(x){case 0:m=!1 8 | l=0 9 | k=y.g 10 | j=A.Q(["html",d,"id",e],k,k) 11 | case 3:if(!!0){x=4 12 | break}if(!(!m&&l<5)){x=4 13 | break}u=6 14 | k=$.br 15 | p=k==null?null:k.d3(0,"accessToken") 16 | if(p==null)A.a9(A.av("accessToken\u4e0d\u5b58\u5728")) 17 | o=D.mo() 18 | if(o==null)A.a9(A.av("baseUrl\u4e0d\u5b58\u5728")) 19 | x=9 20 | return A.c(E.cw(A.n(o)+"/api/4/savehtml?accessToken="+A.n(p),j),$async$a_r) 21 | case 9:k=g 22 | r=B.m.N(0,new A.Je(!1).JL(k,0,null,!0)) 23 | if(J.L(r,"isSuccess"))m=!0 24 | s.push(8) 25 | x=7 26 | break 27 | case 6:u=5 28 | i=t 29 | q=A.H(i) 30 | A.kZ().$1(A.n(q)) 31 | s.push(8) 32 | x=7 33 | break 34 | case 5:s=[2] 35 | case 7:u=2;++l 36 | x=s.pop() 37 | break 38 | case 8:x=3 39 | break 40 | case 4:if(!m)throw A.k(A.av("\u56de\u4f20\u4fe1\u606f\u5931\u8d25")) 41 | v=m 42 | x=1 43 | break 44 | case 1:return A.f(v,w) 45 | case 2:return A.e(t,w)}}) 46 | return A.h($async$a_r,w)}},D,E 47 | J=c[1] 48 | A=c[0] 49 | B=c[2] 50 | C=a.updateHolder(c[22],C) 51 | D=c[109] 52 | E=c[105] 53 | var z=a.updateTypes([]) 54 | var y={g:A.A("l"),e:A.A("y")}}; 55 | ((a,b)=>{a[b]=a.current 56 | a.eventLog.push({p:"main.dart.js_201",e:"endPart",h:b})})($__dart_deferred_initializers__,"vDjIA8lZhqd2W8uthcNpBcie9zs="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_203.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_203",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,C={ 5 | aXZ(d){var x=0,w=A.i(y.e),v,u 6 | var $async$aXZ=A.d(function(e,f){if(e===1)return A.e(f,w) 7 | while(true)switch(x){case 0:u=$.br 8 | u=u==null?null:u.cQ("accessToken",d) 9 | x=3 10 | return A.c(y.o.b(u)?u:A.aE(u,y.h),$async$aXZ) 11 | case 3:u=f 12 | v=u==null?!1:u 13 | x=1 14 | break 15 | case 1:return A.f(v,w)}}) 16 | return A.h($async$aXZ,w)}},B,D 17 | A=c[0] 18 | C=a.updateHolder(c[48],C) 19 | B=c[134] 20 | D=c[117] 21 | var z=a.updateTypes([]) 22 | A.c7(b.typeUniverse,JSON.parse('{"wg":{"X":[],"o":[]}}')) 23 | var y={o:A.A("P"),e:A.A("y"),h:A.A("y?")};(function constants(){B.U2=new A.V(24,24,24,24) 24 | B.uz=new D.be(58513,!1)})();(function staticFields(){$.yq=!1 25 | $.ZG=null})()}; 26 | ((a,b)=>{a[b]=a.current 27 | a.eventLog.push({p:"main.dart.js_203",e:"endPart",h:b})})($__dart_deferred_initializers__,"a3BY5RcPSEBJKw3EKLln5sfbZZM="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_204.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_204",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[158] 6 | B=c[117] 7 | var z=a.updateTypes([]);(function constants(){A.nM=new B.be(59069,!1) 8 | A.nN=new B.be(59070,!1)})()}; 9 | ((a,b)=>{a[b]=a.current 10 | a.eventLog.push({p:"main.dart.js_204",e:"endPart",h:b})})($__dart_deferred_initializers__,"fRkTM6uOSOwJzEQJCNYyccKgPiU="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_209.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_209",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | bLw(){var y=$.br 6 | return B.e7(y==null?null:y.d3(0,"setting:booklist"))}},B 7 | A=a.updateHolder(c[20],A) 8 | B=c[111] 9 | var z=a.updateTypes([])}; 10 | ((a,b)=>{a[b]=a.current 11 | a.eventLog.push({p:"main.dart.js_209",e:"endPart",h:b})})($__dart_deferred_initializers__,"MOqUaiOZTC1uu/4Mr+5ezb2I+mA="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_25.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_25",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | YF(d,e){var y=null 6 | return $.asG().a_M(0,d,e,y,y,y,y,y,y,y,y,y,y,y,y,y,y)}} 7 | A=a.updateHolder(c[68],A) 8 | var z=a.updateTypes([])}; 9 | ((a,b)=>{a[b]=a.current 10 | a.eventLog.push({p:"main.dart.js_25",e:"endPart",h:b})})($__dart_deferred_initializers__,"ILjik7badOzxzcXSVWJGQZQGHBI="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_28.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_28",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={avr:function avr(){this.a=null},avs:function avs(d,e){this.a=d 5 | this.b=e}, 6 | m8(){return new B.avr()}} 7 | A=c[0] 8 | B=a.updateHolder(c[104],B) 9 | B.avr.prototype={ 10 | C3(d,e,f){return this.avw(d,e,f,f)}, 11 | hb(d,e){return this.C3(d,null,e)}, 12 | avw(d,e,f,g){var x=0,w=A.i(g),v,u=2,t,s=[],r=this,q,p,o,n,m 13 | var $async$C3=A.d(function(h,i){if(h===1){t=i 14 | x=u}while(true)switch(x){case 0:n=r.a 15 | m=new A.iK(new A.ak($.ao,y.o),y.f) 16 | r.a=m.a 17 | u=3 18 | x=n!=null?6:7 19 | break 20 | case 6:x=8 21 | return A.c(n,$async$C3) 22 | case 8:case 7:q=d.$0() 23 | x=y.i.b(q)?9:11 24 | break 25 | case 9:o=q 26 | x=12 27 | return A.c(f.i("P<0>").b(o)?o:A.aE(o,f),$async$C3) 28 | case 12:o=i 29 | v=o 30 | s=[1] 31 | x=4 32 | break 33 | x=10 34 | break 35 | case 11:v=q 36 | s=[1] 37 | x=4 38 | break 39 | case 10:s.push(5) 40 | x=4 41 | break 42 | case 3:s=[2] 43 | case 4:u=2 44 | p=new B.avs(r,m) 45 | p.$0() 46 | x=s.pop() 47 | break 48 | case 5:case 1:return A.f(v,w) 49 | case 2:return A.e(t,w)}}) 50 | return A.h($async$C3,w)}, 51 | j(d){return"Lock["+A.uj(this)+"]"}} 52 | var z=a.updateTypes([]) 53 | B.avs.prototype={ 54 | $0(){var x=this.a,w=this.b 55 | if(x.a===w.a)x.a=null 56 | w.e8(0)}, 57 | $S:0};(function inheritance(){var x=a.inherit 58 | x(B.avr,A.w) 59 | x(B.avs,A.cH)})() 60 | var y={i:A.A("P<@>"),o:A.A("ak<~>"),f:A.A("iK<~>")}}; 61 | ((a,b)=>{a[b]=a.current 62 | a.eventLog.push({p:"main.dart.js_28",e:"endPart",h:b})})($__dart_deferred_initializers__,"SLZtuqSNZ+1lcoQT9WTzp98deOo="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_31.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_31",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={ 5 | aIm(){var x=0,w=A.i(y.b) 6 | var $async$aIm=A.d(function(d,e){if(d===1)return A.e(e,w) 7 | while(true)switch(x){case 0:x=2 8 | return A.c(C.EF(),$async$aIm) 9 | case 2:return A.f(null,w)}}) 10 | return A.h($async$aIm,w)}},C 11 | A=c[0] 12 | B=a.updateHolder(c[14],B) 13 | C=c[60] 14 | var z=a.updateTypes([]) 15 | var y={b:A.A("~")}}; 16 | ((a,b)=>{a[b]=a.current 17 | a.eventLog.push({p:"main.dart.js_31",e:"endPart",h:b})})($__dart_deferred_initializers__,"uHHV9dcWxiFmMhmLkvBHaaVAGe4="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_32.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_32",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A,C,B={ 5 | EF(){var x=0,w=A.i(y.b),v=1,u,t,s,r,q,p 6 | var $async$EF=A.d(function(d,e){if(d===1){u=e 7 | x=v}while(true)switch(x){case 0:v=3 8 | s=C.bP5() 9 | $.c0j=s 10 | p=$ 11 | x=6 12 | return A.c(s.oI(0,"ImageCacheStorage",new B.aIl(),1),$async$EF) 13 | case 6:p.EE=e 14 | v=1 15 | x=5 16 | break 17 | case 3:v=2 18 | q=u 19 | t=A.H(q) 20 | A.Y("IndexedDB \u521d\u59cb\u5316\u5931\u8d25: "+A.n(t)) 21 | x=5 22 | break 23 | case 2:x=1 24 | break 25 | case 5:return A.f(null,w) 26 | case 1:return A.e(u,w)}}) 27 | return A.h($async$EF,w)}, 28 | aIl:function aIl(){}} 29 | J=c[1] 30 | A=c[0] 31 | C=c[66] 32 | B=a.updateHolder(c[60],B) 33 | var z=a.updateTypes(["aU(Hm)"]) 34 | B.aIl.prototype={ 35 | $1(d){var x=d.gYW(d) 36 | J.bzf(x,"storage")}, 37 | $S:z+0};(function inheritance(){var x=a.inherit 38 | x(B.aIl,A.cr)})() 39 | var y={b:A.A("~")};(function staticFields(){$.c0j=null 40 | $.EE=null})()}; 41 | ((a,b)=>{a[b]=a.current 42 | a.eventLog.push({p:"main.dart.js_32",e:"endPart",h:b})})($__dart_deferred_initializers__,"8+uVkq2sew+x3jVqQ/I3b8I0Jys="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_34.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_34",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B,C 5 | A=c[0] 6 | B=c[2] 7 | C=c[162] 8 | var z=a.updateTypes([]) 9 | A.c7(b.typeUniverse,JSON.parse('{"uz":{"uy":[]}}'));(function constants(){C.aaD=new A.ec("app.channel.shared.data",B.ap,null)})();(function staticFields(){$.ZF=A.bd("audioPlayer")})()}; 10 | ((a,b)=>{a[b]=a.current 11 | a.eventLog.push({p:"main.dart.js_34",e:"endPart",h:b})})($__dart_deferred_initializers__,"gabHXWtIm+6q/QJkvTntqXnH2oc="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_36.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_36",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={ 5 | bBd(d){var x,w 6 | if(d instanceof A.kE){x=d.ok 7 | x.toString 8 | x=y.d.b(x)}else x=!1 9 | if(x){x=d.ok 10 | x.toString 11 | y.d.a(x) 12 | w=x}else w=null 13 | if(w==null)w=d.q6(y.d) 14 | return w}} 15 | A=c[0] 16 | B=a.updateHolder(c[99],B) 17 | var z=a.updateTypes([]) 18 | var y={d:A.A("n1")}}; 19 | ((a,b)=>{a[b]=a.current 20 | a.eventLog.push({p:"main.dart.js_36",e:"endPart",h:b})})($__dart_deferred_initializers__,"BsSi6ziZ6uoeX+uml/pT+6K7uSo="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_37.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_37",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={ 5 | am(d,e){var x,w,v 6 | if(d instanceof A.kE){x=d.ok 7 | x.toString 8 | x=y.d.b(x)}else x=!1 9 | if(x){x=d.ok 10 | x.toString 11 | y.d.a(x) 12 | w=x}else w=null 13 | if(e){v=d.aZb(y.d) 14 | w=v==null?w:v}else if(w==null)w=d.q6(y.d) 15 | w.toString 16 | return w}} 17 | A=c[0] 18 | B=a.updateHolder(c[121],B) 19 | var z=a.updateTypes([]) 20 | A.c7(b.typeUniverse,JSON.parse('{"n1":{"a_":["Fk"]}}')) 21 | var y={d:A.A("n1")}}; 22 | ((a,b)=>{a[b]=a.current 23 | a.eventLog.push({p:"main.dart.js_37",e:"endPart",h:b})})($__dart_deferred_initializers__,"+7cfbGlq3cQcR1fIIZy3/K6dI3E="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_38.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_38",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,A={ 5 | bJ2(d,e){var x=D.eu.I8() 6 | return new A.a4j(x,d,e)}, 7 | c5s(d){var x=C.Qw.akj(d.b),w=C.a7Z.h(0,d.d) 8 | w.toString 9 | return B.Q(["identifier",d.a,"key",x,"modifiers",null,"scope",w],y.g,y.b)}, 10 | MU:function MU(d,e){this.a=d 11 | this.b=e}, 12 | a4j:function a4j(d,e,f){this.a=d 13 | this.b=e 14 | this.d=f}, 15 | Ui:function Ui(){}, 16 | bdg:function bdg(){}, 17 | a4U:function a4U(){}},C,D 18 | B=c[0] 19 | A=a.updateHolder(c[38],A) 20 | C=c[179] 21 | D=c[178] 22 | A.MU.prototype={ 23 | I(){return"HotKeyScope."+this.b}} 24 | A.a4j.prototype={ 25 | cA(){return A.c5s(this)}} 26 | A.Ui.prototype={ 27 | akj(d){var x=d instanceof B.x?d.a:null,w=B.Q(["keyId",x,"usageCode",d instanceof B.Z?d.a:null],y.g,y.b) 28 | w.QL(w,new A.bdg()) 29 | return w}} 30 | A.a4U.prototype={} 31 | var z=a.updateTypes(["ai()","ai(w?)"]) 32 | A.bdg.prototype={ 33 | $2(d,e){return e==null}, 34 | $S:469};(function installTearOffs(){var x=a._instance_0u,w=a._instance_1u 35 | x(A.a4j.prototype,"ghl","cA",0) 36 | w(A.Ui.prototype,"ghl","akj",1)})();(function inheritance(){var x=a.inherit,w=a.inheritMany 37 | x(A.MU,B.ex) 38 | w(B.w,[A.a4j,A.a4U]) 39 | x(A.Ui,A.a4U) 40 | x(A.bdg,B.dw)})() 41 | B.c7(b.typeUniverse,JSON.parse('{"Ui":{"a4U":["a56","ai"]}}')) 42 | var y={g:B.A("l"),b:B.A("@")};(function constants(){C.Qw=new A.Ui() 43 | C.V7=new A.MU(0,"system") 44 | C.nE=new A.MU(1,"inapp") 45 | C.a7Z=new B.de([C.V7,"system",C.nE,"inapp"],B.A("de"))})();(function staticFields(){$.bGC=!1 46 | $.atj=!1})()}; 47 | ((a,b)=>{a[b]=a.current 48 | a.eventLog.push({p:"main.dart.js_38",e:"endPart",h:b})})($__dart_deferred_initializers__,"iigCPUjhb5qmDKorFmLTUN1362Y="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_42.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_42",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,A,C,B={ 5 | Ov(d){return new B.bP(A.a([],d.i("r<0>")),d.i("bP<0>"))}, 6 | bP:function bP(d,e){var _=this 7 | _.a=d 8 | _.b=!1 9 | _.c=$ 10 | _.$ti=e}} 11 | J=c[1] 12 | A=c[0] 13 | C=c[2] 14 | B=a.updateHolder(c[122],B) 15 | B.bP.prototype={ 16 | gLt(){var y,x=this,w=x.c 17 | if(w===$){y=A.dB(x.$ti.c) 18 | x.c!==$&&A.aS() 19 | x.c=y 20 | w=y}return w}, 21 | F(d,e){this.b=!0 22 | this.gLt().O(0) 23 | return C.b.F(this.a,e)}, 24 | O(d){this.b=!1 25 | C.b.O(this.a) 26 | this.gLt().O(0)}, 27 | p(d,e){var y=this,x=y.a 28 | if(x.length<3)return C.b.p(x,e) 29 | if(y.b){y.gLt().H(0,x) 30 | y.b=!1}return y.gLt().p(0,e)}, 31 | gaI(d){var y=this.a 32 | return new J.f_(y,y.length,A.ae(y).i("f_<1>"))}, 33 | gai(d){return this.a.length===0}, 34 | gca(d){return this.a.length!==0}, 35 | hU(d,e){var y=this.a,x=A.ae(y) 36 | return e?A.a(y.slice(0),x):J.rL(y.slice(0),x.c)}, 37 | eY(d){return this.hU(0,!0)}} 38 | var z=a.updateTypes([]);(function inheritance(){var y=a.inherit 39 | y(B.bP,A.E)})() 40 | A.c7(b.typeUniverse,JSON.parse('{"bP":{"E":["1"],"E.E":"1"}}'))}; 41 | ((a,b)=>{a[b]=a.current 42 | a.eventLog.push({p:"main.dart.js_42",e:"endPart",h:b})})($__dart_deferred_initializers__,"vLOfZu3Dc558KpSI7Z5s6SMRFP0="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_43.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_43",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var z=a.updateTypes([]);(function lazyInitializers(){var y=a.lazyFinal 5 | y($,"cix","Z4",()=>{$.byV() 6 | return!1})})()}; 7 | ((a,b)=>{a[b]=a.current 8 | a.eventLog.push({p:"main.dart.js_43",e:"endPart",h:b})})($__dart_deferred_initializers__,"w/5m6Muv3R3/2SU8Dsj73qlOGYc="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_44.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_44",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,A={ 5 | c6B(){throw B.k(B.aw("Platform._operatingSystem"))}, 6 | c6D(){return A.c6B()}} 7 | B=c[0] 8 | A=a.updateHolder(c[118],A) 9 | var z=a.updateTypes([]);(function lazyInitializers(){var y=a.lazyFinal 10 | y($,"ciy","byV",()=>A.c6D())})()}; 11 | ((a,b)=>{a[b]=a.current 12 | a.eventLog.push({p:"main.dart.js_44",e:"endPart",h:b})})($__dart_deferred_initializers__,"PthARJTazMxBxQQz+VufFkogAt4="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_45.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_45",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | c91(){var y,x 6 | try{y=$.bEJ() 7 | return y}catch(x){}return!1}} 8 | A=a.updateHolder(c[106],A) 9 | var z=a.updateTypes([]);(function lazyInitializers(){var y=a.lazyFinal,x=a.lazy 10 | y($,"civ","bEJ",()=>{$.byV() 11 | return!1}) 12 | x($,"cny","dn",()=>{A.c91() 13 | return!1})})()}; 14 | ((a,b)=>{a[b]=a.current 15 | a.eventLog.push({p:"main.dart.js_45",e:"endPart",h:b})})($__dart_deferred_initializers__,"zJ/BimKLETLZ7Hxgx7fJL+gkuN4="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_47.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_47",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B 5 | A=c[0] 6 | B=c[124] 7 | var z=a.updateTypes([]);(function lazyInitializers(){var y=a.lazyFinal 8 | y($,"cnP","CW",()=>B.c_N(null,A.A("n1")))})()}; 9 | ((a,b)=>{a[b]=a.current 10 | a.eventLog.push({p:"main.dart.js_47",e:"endPart",h:b})})($__dart_deferred_initializers__,"8TV+E1+ydp4rX/9rTyS2qfe/Z8A="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_48.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_48",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={ 5 | c_N(d,e){return new B.bv(d,e.i("bv<0>"))}, 6 | bv:function bv(d,e){this.a=d 7 | this.$ti=e}},C 8 | A=c[0] 9 | B=a.updateHolder(c[124],B) 10 | C=c[194] 11 | B.bv.prototype={ 12 | j(d){var y,x=this,w=x.a 13 | if(w!=null)y=" "+w 14 | else y="" 15 | if(A.W(x)===C.amN)return"[GlobalKey#"+A.cn(x)+y+"]" 16 | return"["+("#"+A.cn(x))+y+"]"}} 17 | var z=a.updateTypes([]);(function inheritance(){var y=a.inherit 18 | y(B.bv,A.iu)})() 19 | A.c7(b.typeUniverse,JSON.parse('{"bv":{"iu":["1"],"hk":[]}}'));(function constants(){C.amN=A.by("bv>")})()}; 20 | ((a,b)=>{a[b]=a.current 21 | a.eventLog.push({p:"main.dart.js_48",e:"endPart",h:b})})($__dart_deferred_initializers__,"KcJnPBoEib38WzYQKg7JZ30Fyb0="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_49.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_49",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,A={aB4:function aB4(){this.b=this.a=null}} 5 | B=c[0] 6 | A=a.updateHolder(c[45],A) 7 | A.aB4.prototype={} 8 | var z=a.updateTypes([]);(function inheritance(){var y=a.inherit 9 | y(A.aB4,B.w)})()}; 10 | ((a,b)=>{a[b]=a.current 11 | a.eventLog.push({p:"main.dart.js_49",e:"endPart",h:b})})($__dart_deferred_initializers__,"bBRCmGwYa6BKIenQ1DSOEg3XWsg="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_5.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_5",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,A={zh:function zh(d){this.a=d}},C,D,E 5 | B=c[0] 6 | A=a.updateHolder(c[63],A) 7 | C=c[123] 8 | D=c[187] 9 | E=c[188] 10 | A.zh.prototype={ 11 | l(d,e){if(e==null)return!1 12 | if(e instanceof A.zh)return E.nU.fi(this.a,e.a) 13 | return!1}, 14 | gq(d){return new C.jg(D.dz,y.b).iu(0,this.a)}} 15 | var z=a.updateTypes([]);(function inheritance(){var x=a.inherit 16 | x(A.zh,B.w)})() 17 | var y={b:B.A("jg<@>")}}; 18 | ((a,b)=>{a[b]=a.current 19 | a.eventLog.push({p:"main.dart.js_5",e:"endPart",h:b})})($__dart_deferred_initializers__,"waOwKO5yQd03elQGLqoqsYGWPAk="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_50.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_50",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,C={ 5 | asb(){var x=0,w=A.i(y.f),v,u 6 | var $async$asb=A.d(function(d,e){if(d===1)return A.e(e,w) 7 | while(true)switch(x){case 0:$.bEH() 8 | x=3 9 | return A.c(D.FS.bH("getApplicationDocumentsDirectory",null,!1,y.g),$async$asb) 10 | case 3:u=e 11 | if(u==null)throw A.k(B.bJZ("Unable to get application documents directory")) 12 | v=B.rh(u) 13 | x=1 14 | break 15 | case 1:return A.f(v,w)}}) 16 | return A.h($async$asb,w)}},B,D 17 | A=c[0] 18 | C=a.updateHolder(c[76],C) 19 | B=c[86] 20 | D=c[190] 21 | var z=a.updateTypes([]) 22 | var y={f:A.A("lU"),g:A.A("l")}}; 23 | ((a,b)=>{a[b]=a.current 24 | a.eventLog.push({p:"main.dart.js_50",e:"endPart",h:b})})($__dart_deferred_initializers__,"xxqM35gsC9RJYtOOCMg3YLqtElI="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_52.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_52",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A 5 | A=c[0] 6 | var z=a.updateTypes([]);(function staticFields(){$.Yr=A.bd("imagesDir")})()}; 7 | ((a,b)=>{a[b]=a.current 8 | a.eventLog.push({p:"main.dart.js_52",e:"endPart",h:b})})($__dart_deferred_initializers__,"ejSD67n+jWa78jAM68pnUC5OqSw="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_53.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_53",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | c93(){var y,x 6 | try{y=$.bSN() 7 | return y}catch(x){}return!1}} 8 | A=a.updateHolder(c[100],A) 9 | var z=a.updateTypes([]);(function staticFields(){$.hG="0"})();(function lazyInitializers(){var y=a.lazyFinal,x=a.lazy 10 | y($,"ciw","bSN",()=>{$.byV() 11 | return!1}) 12 | x($,"cnz","fV",()=>{A.c93() 13 | return!1})})()}; 14 | ((a,b)=>{a[b]=a.current 15 | a.eventLog.push({p:"main.dart.js_53",e:"endPart",h:b})})($__dart_deferred_initializers__,"rxU8rznCBYuyEkao+mgpQp/QSY0="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_54.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_54",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A={ 5 | c9f(){var y,x 6 | try{y=$.Z4() 7 | return y}catch(x){}return!1}} 8 | A=a.updateHolder(c[96],A) 9 | var z=a.updateTypes([]);(function lazyInitializers(){var y=a.lazy 10 | y($,"cnB","eZ",()=>{A.c9f() 11 | return!1})})()}; 12 | ((a,b)=>{a[b]=a.current 13 | a.eventLog.push({p:"main.dart.js_54",e:"endPart",h:b})})($__dart_deferred_initializers__,"Sgtb5jS3fUuh4Y3jMpeYVPR0Br4="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_55.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_55",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={ 5 | c99(){var y,x 6 | try{}catch(x){y=A.H(x) 7 | A.Y(A.n(y))}return!1}} 8 | A=c[0] 9 | B=a.updateHolder(c[116],B) 10 | var z=a.updateTypes([]);(function lazyInitializers(){var y=a.lazy 11 | y($,"cnA","dp",()=>{B.c99() 12 | return!1})})()}; 13 | ((a,b)=>{a[b]=a.current 14 | a.eventLog.push({p:"main.dart.js_55",e:"endPart",h:b})})($__dart_deferred_initializers__,"jIJBSiiF9LihLHhrkXpQRTMyjHg="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_6.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_6",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var J,B,A={a2B:function a2B(){},jg:function jg(d,e){this.a=d 5 | this.$ti=e}},C 6 | J=c[1] 7 | B=c[0] 8 | A=a.updateHolder(c[123],A) 9 | C=c[187] 10 | A.a2B.prototype={ 11 | fi(d,e){return J.p(d,e)}, 12 | iu(d,e){return J.a6(e)}} 13 | A.jg.prototype={ 14 | fi(d,e){var y,x,w,v,u 15 | if(d===e)return!0 16 | y=J.M(d) 17 | x=y.gv(d) 18 | w=J.M(e) 19 | if(x!==w.gv(e))return!1 20 | for(v=this.a,u=0;u>>0)&2147483647 25 | w^=w>>>6}w=w+(w<<3>>>0)&2147483647 26 | w^=w>>>11 27 | return w+(w<<15>>>0)&2147483647}} 28 | var z=a.updateTypes([]);(function inheritance(){var y=a.inheritMany 29 | y(B.w,[A.a2B,A.jg])})() 30 | B.hr(b.typeUniverse,JSON.parse('{"a2B":1}'));(function constants(){C.dz=new A.a2B()})()}; 31 | ((a,b)=>{a[b]=a.current 32 | a.eventLog.push({p:"main.dart.js_6",e:"endPart",h:b})})($__dart_deferred_initializers__,"H3pgWfREruBB87JYSwRJMlCUXOE="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_61.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_61",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B={qU:function qU(d,e,f,g){var _=this 5 | _.a=d 6 | _.b=e 7 | _.c=f 8 | _.d=g}} 9 | A=c[0] 10 | B=a.updateHolder(c[43],B) 11 | B.qU.prototype={ 12 | cA(){var x=this 13 | return A.Q(["name",x.a,"backgroundColor",x.b,"textColor",x.c,"backgroundimage",x.d],y.g,y.b)}} 14 | var z=a.updateTypes(["ai()"]);(function installTearOffs(){var x=a._instance_0u 15 | x(B.qU.prototype,"ghl","cA",0)})();(function inheritance(){var x=a.inherit 16 | x(B.qU,A.w)})() 17 | var y={g:A.A("l"),b:A.A("@")};(function staticFields(){$.qO=A.a([],A.A("r"))})()}; 18 | ((a,b)=>{a[b]=a.current 19 | a.eventLog.push({p:"main.dart.js_61",e:"endPart",h:b})})($__dart_deferred_initializers__,"rzZ5FFK9DhIVyHogamnhD/lh0eg="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_62.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_62",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B,C={ 5 | e7(d){var y 6 | if(d==null)return 0 7 | if(A.kX(d))return d 8 | if(typeof d=="number")return B.d.aP(d) 9 | if(typeof d=="string"){y=A.iY(d,null) 10 | return y==null?0:y}return 0}} 11 | A=c[0] 12 | B=c[2] 13 | C=a.updateHolder(c[111],C) 14 | var z=a.updateTypes([])}; 15 | ((a,b)=>{a[b]=a.current 16 | a.eventLog.push({p:"main.dart.js_62",e:"endPart",h:b})})($__dart_deferred_initializers__,"f5QFAAIPVthyXquKARtmHxy+o1o="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_64.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_64",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var B,A={ 5 | cdm(d){var x=document 6 | x.toString 7 | B.bCK(x,"keydown",new A.byq(d),!1,y.c)}, 8 | byq:function byq(d){this.a=d}, 9 | bWs(d){return A.cdm(d)}} 10 | B=c[0] 11 | A=a.updateHolder(c[16],A) 12 | var z=a.updateTypes([]) 13 | A.byq.prototype={ 14 | $1(d){var x=d.keyCode 15 | x.toString 16 | if(x===27)this.a.$0()}, 17 | $S:160};(function inheritance(){var x=a.inherit 18 | x(A.byq,B.cr)})() 19 | var y={c:B.A("rN")}}; 20 | ((a,b)=>{a[b]=a.current 21 | a.eventLog.push({p:"main.dart.js_64",e:"endPart",h:b})})($__dart_deferred_initializers__,"0SRcRn1Pi7v5bNINhFf7Nbx+C38="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_65.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_65",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,C,D,E,F,G,B={ 5 | byG(){var x=0,w=A.i(y.b) 6 | var $async$byG=A.d(function(d,e){if(d===1)return A.e(e,w) 7 | while(true)switch(x){case 0:x=2 8 | return A.c(A.cq("back",0),$async$byG) 9 | case 2:A.dl("back") 10 | G.bWs(new B.byH()) 11 | return A.f(null,w)}}) 12 | return A.h($async$byG,w)}, 13 | CJ(){var x=0,w=A.i(y.b) 14 | var $async$CJ=A.d(function(d,e){if(d===1)return A.e(e,w) 15 | while(true)switch(x){case 0:x=2 16 | return A.c(A.cq("storage",0),$async$CJ) 17 | case 2:A.dl("storage") 18 | x=3 19 | return A.c(C.Rc(),$async$CJ) 20 | case 3:x=4 21 | return A.c(A.cq("image_cache_manager",0),$async$CJ) 22 | case 4:A.dl("image_cache_manager") 23 | x=5 24 | return A.c(D.aIm(),$async$CJ) 25 | case 5:B.byG() 26 | A.dl("storage") 27 | x=6 28 | return A.c(C.ack(),$async$CJ) 29 | case 6:return A.f(null,w)}}) 30 | return A.h($async$CJ,w)}, 31 | byH:function byH(){}} 32 | A=c[0] 33 | C=c[15] 34 | D=c[14] 35 | E=c[99] 36 | F=c[121] 37 | G=c[16] 38 | B=a.updateHolder(c[4],B) 39 | var z=a.updateTypes([]) 40 | B.byH.prototype={ 41 | $0(){var x,w=$.CW(),v=$.ag.ac$.x.h(0,w) 42 | if(v!=null){x=E.bBd(v) 43 | w=x!=null&&x.Yi()}else w=!1 44 | if(w)F.am(v,!1).bX()}, 45 | $S:2};(function inheritance(){var x=a.inherit 46 | x(B.byH,A.cH)})() 47 | var y={b:A.A("~")}}; 48 | ((a,b)=>{a[b]=a.current 49 | a.eventLog.push({p:"main.dart.js_65",e:"endPart",h:b})})($__dart_deferred_initializers__,"HSKB+r2ncC3riaUMliQjmcskncE="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_7.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_7",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B,C,D 5 | A=c[0] 6 | B=c[123] 7 | C=c[187] 8 | D=c[188] 9 | var z=a.updateTypes([]);(function constants(){D.nU=new B.jg(C.dz,A.A("jg<@>"))})()}; 10 | ((a,b)=>{a[b]=a.current 11 | a.eventLog.push({p:"main.dart.js_7",e:"endPart",h:b})})($__dart_deferred_initializers__,"+YFUebRSItVvOjdAb9nOxcIbRtA="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_86.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_86",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,B,C={ 5 | b0(d){var y,x="Exception:",w="Exception" 6 | if(B.c.p(A.n(d),x)){y=A.n(d).split(x) 7 | return y[y.length-1]}else if(B.c.p(A.n(d),w)){y=A.n(d).split(w) 8 | return y[y.length-1]}else return A.n(d)}} 9 | A=c[0] 10 | B=c[2] 11 | C=a.updateHolder(c[98],C) 12 | var z=a.updateTypes([])}; 13 | ((a,b)=>{a[b]=a.current 14 | a.eventLog.push({p:"main.dart.js_86",e:"endPart",h:b})})($__dart_deferred_initializers__,"x7YfKUoO7IwNsoe6637UKOK3gYM="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_93.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_93",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,D,C,B={ 5 | cw(d,e){var x=C.cz 6 | return B.ccL(d,e)}, 7 | ccL(d,e){var x=0,w=A.i(y.c),v,u=2,t,s,r,q,p,o,n,m 8 | var $async$cw=A.d(function(f,g){if(f===1){t=g 9 | x=u}while(true)switch(x){case 0:p=C.cz 10 | o=A.bd("response") 11 | u=4 12 | m=o 13 | x=7 14 | return A.c(D.Jv(A.cx(d,0,null),e,null).nB(0,p),$async$cw) 15 | case 7:m.b=g 16 | u=2 17 | x=6 18 | break 19 | case 4:u=3 20 | n=t 21 | s=A.H(n) 22 | A.Y(s) 23 | q=A.av("\u7f51\u7edc\u8fde\u63a5\u9519\u8bef") 24 | throw A.k(q) 25 | x=6 26 | break 27 | case 3:x=2 28 | break 29 | case 6:if(o.av().b===200){v=o.av().w 30 | x=1 31 | break}else if(o.av().b===401)throw A.k(A.av("\u5f53\u524d\u8bf7\u6c42\u5185\u5bb9\u8fc7\u591a\uff0c\u8d85\u51fa\u670d\u52a1\u5668\u9650\u5236")) 32 | else if(o.av().b===403)throw A.k(A.av("\u5f53\u524d\u8bf7\u6c42\u88ab\u62e6\u622a\uff0c\u8bf7\u8054\u7cfb\u7ba1\u7406\u5458\u5173\u95ed\u9632\u706b\u5899")) 33 | else throw A.k(A.av("\u7f51\u7edc\u9519\u8bef: "+o.AT().b)) 34 | case 1:return A.f(v,w) 35 | case 2:return A.e(t,w)}}) 36 | return A.h($async$cw,w)}} 37 | A=c[0] 38 | D=c[109] 39 | C=c[170] 40 | B=a.updateHolder(c[105],B) 41 | var z=a.updateTypes([]) 42 | var y={c:A.A("da")}}; 43 | ((a,b)=>{a[b]=a.current 44 | a.eventLog.push({p:"main.dart.js_93",e:"endPart",h:b})})($__dart_deferred_initializers__,"lOQP977z/f9LiKIWX3XMs+6LMj8="); -------------------------------------------------------------------------------- /src/main/resources/static/main.dart.js_94.part.js: -------------------------------------------------------------------------------- 1 | ((a,b,c)=>{a[b]=a[b]||{} 2 | a[b][c]=a[b][c]||[] 3 | a[b][c].push({p:"main.dart.js_94",e:"beginPart"})})(self,"$__dart_deferred_initializers__","eventLog") 4 | $__dart_deferred_initializers__.current=function(a,b,c,$){var A,C,B={ 5 | aXV(){var y=$.br 6 | return y==null?null:y.d3(0,"accessToken")}, 7 | bs(d){var y,x=B.aXV() 8 | if(x==null)throw A.k(A.av("accessToken\u4e0d\u5b58\u5728")) 9 | y=C.mo() 10 | if(y==null)throw A.k(A.av("baseUrl\u4e0d\u5b58\u5728")) 11 | return y+"/api/4"+d+"?accessToken="+x}} 12 | A=c[0] 13 | C=c[109] 14 | B=a.updateHolder(c[87],B) 15 | var z=a.updateTypes([])}; 16 | ((a,b)=>{a[b]=a.current 17 | a.eventLog.push({p:"main.dart.js_94",e:"endPart",h:b})})($__dart_deferred_initializers__,"pw8DLDRuC0FVfg6zAjyJvbdFHVY="); -------------------------------------------------------------------------------- /src/main/resources/static/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "read", 3 | "short_name": "read", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /src/main/resources/static/static/boy.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/boy.jpeg -------------------------------------------------------------------------------- /src/main/resources/static/static/font_1997429_8xzvctxta3u.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/font_1997429_8xzvctxta3u.eot -------------------------------------------------------------------------------- /src/main/resources/static/static/font_1997429_8xzvctxta3u.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/font_1997429_8xzvctxta3u.ttf -------------------------------------------------------------------------------- /src/main/resources/static/static/font_1997429_8xzvctxta3u.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/font_1997429_8xzvctxta3u.woff -------------------------------------------------------------------------------- /src/main/resources/static/static/font_1997429_8xzvctxta3u.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/font_1997429_8xzvctxta3u.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/static/fonts/MaterialIcons-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/fonts/MaterialIcons-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/static/image/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/close.png -------------------------------------------------------------------------------- /src/main/resources/static/static/image/error.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/error.jpeg -------------------------------------------------------------------------------- /src/main/resources/static/static/image/one-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/one-se.png -------------------------------------------------------------------------------- /src/main/resources/static/static/image/one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/one.png -------------------------------------------------------------------------------- /src/main/resources/static/static/image/three-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/three-se.png -------------------------------------------------------------------------------- /src/main/resources/static/static/image/three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/three.png -------------------------------------------------------------------------------- /src/main/resources/static/static/image/two-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/two-se.png -------------------------------------------------------------------------------- /src/main/resources/static/static/image/two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/image/two.png -------------------------------------------------------------------------------- /src/main/resources/static/static/js/ajax.js: -------------------------------------------------------------------------------- 1 | function ajax (type,src,data,success) { 2 | var closeindex = layer.load(); 3 | $.ajax({ 4 | type: type, 5 | url: src, 6 | data: data, 7 | dataType: 'json', 8 | xhrFields: { 9 | withCredentials: true 10 | }, 11 | error: function () { 12 | layer.msg('网络异常'); 13 | layer.close(closeindex); 14 | }, 15 | crossDomain: true 16 | }).done(function (ret) { 17 | console.log(ret) 18 | layer.close(closeindex); 19 | if(ret.code == -1000) { 20 | window.location.href="/" 21 | return false; 22 | } 23 | success?success(ret):function(){}; 24 | }); 25 | } 26 | function ajaxjson (src,data,success) { 27 | var closeindex = layer.load(); 28 | $.ajax({ 29 | type: "POST", 30 | url: src, 31 | data: JSON.stringify(data), 32 | contentType: "application/json; charset=utf-8", 33 | dataType: 'json', 34 | xhrFields: { 35 | withCredentials: true 36 | }, 37 | error: function () { 38 | layer.msg('网络异常'); 39 | layer.close(closeindex); 40 | }, 41 | crossDomain: true 42 | }).done(function (ret) { 43 | console.log(ret) 44 | layer.close(closeindex); 45 | if(ret.code == -1000) { 46 | window.location.href="/" 47 | return false; 48 | } 49 | success?success(ret):function(){}; 50 | }); 51 | } 52 | -------------------------------------------------------------------------------- /src/main/resources/static/static/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/layui/font/iconfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/static/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/static/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/layui/font/iconfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/static/layui/font/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/autobcb/read/b91be63cc451d96df9c2c4abce3097b2c18388c5/src/main/resources/static/static/layui/font/iconfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/version.json: -------------------------------------------------------------------------------- 1 | {"app_name":"read","version":"2.13.0","build_number":"7","package_name":"read"} -------------------------------------------------------------------------------- /src/main/resources/templates/admin/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 管理 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 |
19 | 27 |
-------------------------------------------------------------------------------- /src/main/resources/templates/errors/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 404: Not Found 6 | 7 | 8 | 9 |
10 |
11 | prod 12 |
13 | Not Found 404 14 |
15 |
16 | Not Found 17 |
18 |
19 | :( 20 |
21 | 22 | --------------------------------------------------------------------------------